移动端

iOS-百度语音合成 后台播放

2018-11-20  本文已影响0人  RayJiang97

闲聊几句~
小说项目中需要加一个听书功能,看了几个App都是用百度语音的,于是就决定使用百度语音了,本文记录一下如何使用百度语音进行后台播放

后台播放

大致流程:
1.使用BDSSpeechSynthesizersynthesizeSentence方法合成音频
2.从BDSSpeechSynthesizerDelegate代理的synthesizerNewDataArrived方法获取合成好的音频
Tips:这个方法中获取到的Data数据是pcm格式的
3.使用BDSBuiltInPlayer播放pcm格式的Data数据

踩坑的总结:
Q:为什么不能用BDSSpeechSynthesizer直接播放
A:如果使用下面代码直接播放,虽然退到后台也能播放,但是无法设置锁屏播放器

var error: NSError? = nil
let speaker = BDSSpeechSynthesizer.sharedInstance()
speaker?.speakSentence("语音合成", withError: &error)

Q:为什么不能用AVAudioPlayer播放synthesizerNewDataArrived回调中的Data数据
A:因为这个Data数据是pcm格式,AVAudioPlayer不支持

Q:为什么一段文本synthesizerNewDataArrived会回调多次
A:猜测:当合成的文本较长时,为了更快地合成,会将句子拆分之后请求服务器,所以会回调多次

重点:synthesizerNewDataArrived会按 顺序回调 多次,至于要怎么处理去看百度Demo就知道了
划重点:顺序回调

如何设置后台播放

网上有很多教程了,这里就简单说下
1.在TargetsCapabilities中打开Background Modes,勾选Audio, AirPlay, and Picture in Picture
2.在AppDelegateapplicationWillResignActive回调中设置

func applicationWillResignActive(_ application: UIApplication) {
    // 允许后台播放
    UIApplication.shared.beginReceivingRemoteControlEvents()
    // 设置锁屏播放器的数据
    MPNowPlayingInfoCenter.default().nowPlayingInfo = SpeakerManager.manage.playingInfo
}

3.在AppDelegate中实现锁屏播放器的回调remoteControlReceived

override func remoteControlReceived(with event: UIEvent?) {
    guard let e = event else {return}
    switch e.subtype {
    case .remoteControlPlay:
        SpeakerManager.manage.continueSpeaking()
    case .remoteControlPause:
        SpeakerManager.manage.pauseSpeaking()
    default:
        break
    }
}

网上都没有相关资料,看在我踩坑这么辛苦的份上,给我点个赞吧QAQ

上一篇下一篇

猜你喜欢

热点阅读