AVSpeechSynthesizer输出为文件?

And*_*rew 6 iphone objective-c ios avspeechsynthesizer

AVSpeechSynthesizer有一个相当简单的API,它不支持保存到内置的音频文件.

我想知道是否有办法解决这个问题 - 可能会录制输出,因为它是静音播放,以后播放?或者更高效的东西.

Jan*_*kel 13

这终于有可能了,在 iOS 13 中AVSpeechSynthesizer现在有了 write(_:toBufferCallback:)

let synthesizer = AVSpeechSynthesizer()
let utterance = AVSpeechUtterance(string: "test 123")
utterance.voice = AVSpeechSynthesisVoice(language: "en")
var output: AVAudioFile?

synthesizer.write(utterance) { (buffer: AVAudioBuffer) in
   guard let pcmBuffer = buffer as? AVAudioPCMBuffer else {
      fatalError("unknown buffer type: \(buffer)")
   }
   if pcmBuffer.frameLength == 0 {
     // done
   } else {
     // append buffer to file
     if output == nil { 
       output = AVAudioFile(
         forWriting: URL(fileURLWithPath: "test.caf"), 
         settings: pcmBuffer.format.settings, 
         commonFormat: .pcmFormatInt16, 
         interleaved: false) 
     }
     output?.write(from: pcmBuffer)
   } 
}
Run Code Online (Sandbox Code Playgroud)

  • 在 Mac OS 10.15 下执行时,永远不会调用回调。合成器只是发音文本。 (5认同)
  • 请注意,合成器实例不应在 func 中本地创建。它应该是类或全局的成员,否则它会在有机会开始合成之前被释放,并且永远不会调用回调。 (3认同)
  • 我刚刚在 10.15 也遇到了这个问题,有什么改变/解决方法@vasily 吗?哦,回到 NSSpeechSynthesizer ‍♂️ (2认同)

Bhu*_*hta 4

目前AVSpeechSynthesizer 还不支持这个。无法使用 获取音频文件AVSpeechSynthesizer。几周前,我对我的一个应用程序进行了尝试,发现这是不可能的,而且 AVSpeechSynthesizeriOS 8 中也没有任何变化。

我也想过在播放时录制声音,但这种方法有很多缺陷,比如用户可能使用耳机,系统声音可能很低或静音,它可能会捕捉到其他外部声音,所以不建议采取这种方法。