将 AVSpeechSynthesizer 与 MPRemoteCommandCenter 一起使用
Use `AVSpeechSynthesizer` with `MPRemoteCommandCenter`
我需要使用 AVSpeechSynthesizer
向我的用户朗读文本。
用户将通过AirPods控制阅读,所以我需要使用MPRemoteCommandCenter
。
现在,我需要使用 AVSpeechSynthesizer.write(_:toBufferCallback:)
准备我的音频文件,创建一个播放列表并使用 AVQueuePlayer
阅读它。
有效。但是准备音频文件需要时间。我更喜欢直接在后台模式下使用 AVSpeechSynthesizer.speak(_:)
,并通过 MPRemoteCommandCenter
命令激活它。
这可能吗?或者可能有任何解决方法?
谢谢!
我也遇到了同样的问题,现在弄明白了
您唯一需要做的事情
try? AVAudioSession.sharedInstance().setCategory(.playback)
开头。不要使用 .duckOthers
、.mixWithOthers
将目标添加到 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()
})]
我需要使用 AVSpeechSynthesizer
向我的用户朗读文本。
用户将通过AirPods控制阅读,所以我需要使用MPRemoteCommandCenter
。
现在,我需要使用 AVSpeechSynthesizer.write(_:toBufferCallback:)
准备我的音频文件,创建一个播放列表并使用 AVQueuePlayer
阅读它。
有效。但是准备音频文件需要时间。我更喜欢直接在后台模式下使用 AVSpeechSynthesizer.speak(_:)
,并通过 MPRemoteCommandCenter
命令激活它。
这可能吗?或者可能有任何解决方法?
谢谢!
我也遇到了同样的问题,现在弄明白了 您唯一需要做的事情
try? AVAudioSession.sharedInstance().setCategory(.playback)
开头。不要使用 .duckOthers
、.mixWithOthers
将目标添加到 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()
})]