11

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

我想知道是否有办法解决这个问题 - 也许在静默播放时记录输出,以便稍后播放?或者更有效的东西。

4

3 回答 3

17

这终于成为可能,在 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)
   } 
}
于 2019-09-26T14:04:23.600 回答
4

目前AVSpeechSynthesizer 还不支持这个。绝对无法使用AVSpeechSynthesizer. 几周前我为我的一个应用程序尝试了这个,发现这是不可能的, AVSpeechSynthesizer在 iOS 8 中也没有任何改变。

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

于 2014-09-22T06:50:21.933 回答
1

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

于 2014-10-14T14:36:05.247 回答