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

问题描述 投票:0回答:1

我们对

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 方法,结果会生成这些日志:

ios swift xcode avfoundation avspeechsynthesizer
1个回答
-1
投票

我用于 Swift 项目的代码:

let synth = AVSpeechSynthesizer()    
let myUtterance = AVSpeechUtterance(string: message)
myUtterance.rate = 0.4
synth.speak(myUtterance)

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

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

现在对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.