我们对
AVSpeechSynthesizer
的输出有音频处理的需求。所以我们开始使用 write
类的 AVSpeechSynthesizer
方法在顶部应用处理。它的。我们目前拥有的:
var synthesizer = AVSpeechSynthesizer()
var playerNode: AVAudioPlayerNode = AVAudioPlayerNode()
fun play(audioCue: String){
let utterance = AVSpeechUtterance(string: audioCue)
synthesizer.write(utterance, toBufferCallback: {[weak self] buffer in
// We do our processing including conversion from pcmFormatFloat16 format to pcmFormatFloat32 format which is supported by AVAudioPlayerNode
self.playerNode.scheduleBuffer(buffer as! AVAudioPCMBuffer, completionCallbackType: .dataPlayedBack)
}
}
在 iOS 16 之前一切正常,但在 iOS 16 中我们开始遇到这个异常:
[AXTTSCommon] TTSPlaybackEnqueueFullAudioQueueBuffer: error -66686 enqueueing buffer
不确定这个异常到底意味着什么。因此,我们正在寻找一种解决此异常的方法,或者可能是一种更好的播放缓冲区的方法。
更新:
创建了一个用于测试的空项目,如果使用空块调用 write 方法,结果会生成这些日志:
我用于 Swift 项目的代码:
let synth = AVSpeechSynthesizer()
let myUtterance = AVSpeechUtterance(string: message)
myUtterance.rate = 0.4
synth.speak(myUtterance)
可以将 let synth = AVSpeechSynthesizer() 移出该方法并在该类的顶部声明并使用。
为 Xcode14 和 iOS 16 启用的设置: 如果您使用的是 XCode14 和 iOS16,可能是未下载语音内容下的语音,您将在控制台上收到错误消息,提示标识符、来源、内容为零。您需要做的就是,转到设置中的可访问性 -> 语音内容 -> 语音 -> 选择任何语言并下载任何配置文件。在此运行您的声音之后,您将能够听到通过的文本中的语音。
现在对我有用。