【问题标题】:Play audio buffers generated by AVSpeechSynthesizer directly直接播放 AVSpeechSynthesizer 生成的音频缓冲区
【发布时间】:2022-09-28 16:02:11
【问题描述】:

我们需要对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 方法会生成以下日志:

  • 如果某些东西正常工作并且 iOS 16 破坏了它,请提交错误报告。
  • 我在反馈助手上做过,但出于某种原因,Apple 不想做出反应,甚至不想承认它
  • 苹果通常不会“做出反应”或“承认”任何事情。你已经做了你能做的,这很好!现在球在苹果的球场上。
  • 是的,我的期望并不高。我在 ios 15 发布之前也报告了一个问题,他们仍然没有对此作出回应。这就是为什么这次我正在寻求社区的帮助

标签: ios swift xcode avfoundation avspeechsynthesizer


【解决方案1】:

我用于 Swift 项目的代码:

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

可以移动让合成器 = AVSpeechSynthesizer()退出此方法并在该类的顶部声明并使用。

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

它现在对我有用。

【讨论】:

    猜你喜欢
    • 2012-05-17
    • 2011-10-31
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多