AVSpeechSynthesizer输出为文件?

时间:2014-09-22 01:32:48

标签: ios objective-c iphone avspeechsynthesizer

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

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

3 个答案:

答案 0 :(得分:5)

这终于有可能,在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)
   } 
}

答案 1 :(得分:2)

截至目前AVSpeechSynthesizer不支持此功能。绝不使用AVSpeechSynthesizer获取音频文件。几个星期前我尝试过我的一个应用程序并发现它不可能,iOS 8中的AVSpeechSynthesizer也没有任何变化。

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

答案 2 :(得分:0)

您可以使用OSX通过NSSpeechSynthesizer方法准备AIFF文件(或者,可能是某些基于OSX的服务) startSpeakingString:的toURL: