直接播放 AVSpeechSynthesizer 生成的音频缓冲区

nis*_*ngh 7 xcode avfoundation ios avspeechsynthesizer swift

我们对 的输出有音频处理的要求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)
   }
}
Run Code Online (Sandbox Code Playgroud)

在 iOS 16 之前,所有这些都工作正常,但在 iOS 16 中,我们开始遇到此异常:

[AXTTSCommon] TTSPlaybackEnqueueFullAudioQueueBuffer: error -66686 enqueueing buffer
Run Code Online (Sandbox Code Playgroud)

不确定这个异常到底意味着什么。因此,我们正在寻找解决此异常的方法,或者可能是播放缓冲区的更好方法。

更新:

创建了一个空项目进行测试,结果表明,如果使用空块调用 write 方法,则会生成以下日志:

在此输入图像描述

小智 -1

我用于 Swift 项目的代码:

let synth = AVSpeechSynthesizer()    
let myUtterance = AVSpeechUtterance(string: message)
myUtterance.rate = 0.4
synth.speak(myUtterance)
Run Code Online (Sandbox Code Playgroud)

可以将let Synth = AVSpeechSynthesizer()移出此方法并在该类的顶部声明并使用。

为 Xcode14 和 iOS 16 启用的设置:如果您使用 XCode14 和 iOS16,可能会未下载语音内容下的语音,并且您将在控制台上收到错误消息,提示标识符、来源、内容为零。您需要做的就是,转到设置中的辅助功能 -> 语音内容 -> 语音 -> 选择任何语言并下载任何配置文件。运行您的声音后,您将能够听到传递的文本中的语音。

它现在对我有用。

  • 实际上问题不在于“speak”方法,而在于“write”方法 (2认同)