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

e7arh2l6  于 2023-05-02  发布在  iOS
关注(0)|答案(1)|浏览(277)

bounty还有6天到期。此问题的答案有资格获得+200声望奖励。daniel想要引起更多关注这个问题:我至少要找出错误是什么,比如错误号是什么意思,是什么导致了错误。

我们需要对AVSpeechSynthesizer的输出进行音频处理。因此,我们首先使用AVSpeechSynthesizer类的write方法在顶部应用处理。我们目前拥有的:

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方法,则会生成以下日志:

hgqdbh6s

hgqdbh6s1#

我在Swift项目中使用的代码:

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

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

**Xcode 14和iOS 16启用的设置:**如果您使用的是XCode 14和iOS 16,可能是语音下的语音内容没有下载,您会在控制台上看到一个错误,说identifier,source,content nil。所有你需要做的是,去accessibility在设置-〉口语内容-〉语音-〉选择任何语言和下载任何配置文件。在此之后运行你的声音,你将能够听到通过文本的讲话。

它现在为我工作。

相关问题