将 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()
    })]