我需要使用AVSpeechSynthesizer来读取文本给我的用户。
用户将使用AirPods控制读取,所以我需要使用MPRemoteCommandCenter。
现在,我需要使用AVSpeechSynthesizer.write(_:toBufferCallback:)准备我的音频文件--创建一个播放列表,并使用AVQueuePlayer读取它。
它起作用了。但是准备音频文件需要时间。我更喜欢在后台模式下直接使用AVSpeechSynthesizer.speak(_:),并通过MPRemoteCommandCenter命令激活它。
这个是可能的吗?或者有什么解决办法?
谢谢!
发布于 2021-02-26 09:13:50
我也有同样的问题,现在想出你唯一需要做的事
try? AVAudioSession.sharedInstance().setCategory(.playback)刚开始的时候。不要使用.duckOthers,.mixWithOthers
addTarget到RemoteCommand
func addRemoteCommandCenter() {
let rcc = MPRemoteCommandCenter.shared()
//添加暂停监听
rcc.pauseCommand.addTarget(self, action: #selector(playOrPauseEvent(_:)))
//添加播放监听
rcc.playCommand.addTarget(self, action: #selector(playOrPauseEvent(_:)))
//下一首
rcc.nextTrackCommand.addTarget(self, action: #selector(nextCommandEvent(_:)))
//上一首
rcc.previousTrackCommand.addTarget(self, action: #selector(previousCammndEvent(_:)))
//耳机暂停和播放的监听
rcc.togglePlayPauseCommand.addTarget(self, action: #selector(togglePlayPauseCommand(_:)))
}在speechSynthesizer(_:didStart:)和speechSynthesizer(_:willSpeakRangeOfSpeechString:utterance:)上更新UI
let infoCenter = MPNowPlayingInfoCenter.default()
infoCenter.nowPlayingInfo = [MPMediaItemPropertyTitle:"Title", MPMediaItemPropertyArtist: "Artist", MPMediaItemPropertyAlbumTitle: "", MPMediaItemPropertyArtwork: MPMediaItemArtwork(boundsSize: CGSize(width: 120, height: 120), requestHandler: { (size) -> UIImage in
UIImage()
})]https://stackoverflow.com/questions/66348374
复制相似问题