iOS-百度语音合成 后台播放
闲聊几句~
小说项目中需要加一个听书功能,看了几个App都是用百度语音的,于是就决定使用百度语音了,本文记录一下如何使用百度语音进行后台播放
后台播放
大致流程:
1.使用BDSSpeechSynthesizer
的synthesizeSentence
方法合成音频
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.在Targets
→ Capabilities
中打开Background Modes
,勾选Audio, AirPlay, and Picture in Picture
2.在AppDelegate
的applicationWillResignActive
回调中设置
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