AVSpeechSynthesizer 有一个相当简单的 API,它不支持保存到内置的音频文件。
我想知道是否有办法解决这个问题 - 也许在静默播放时记录输出,以便稍后播放?或者更有效的东西。
AVSpeechSynthesizer 有一个相当简单的 API,它不支持保存到内置的音频文件。
我想知道是否有办法解决这个问题 - 也许在静默播放时记录输出,以便稍后播放?或者更有效的东西。
这终于成为可能,在 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)
}
}
目前AVSpeechSynthesizer
还不支持这个。绝对无法使用AVSpeechSynthesizer
. 几周前我为我的一个应用程序尝试了这个,发现这是不可能的, AVSpeechSynthesizer
在 iOS 8 中也没有任何改变。
我也想过在播放时录制声音,但是这种方法存在很多缺陷,例如用户可能正在使用耳机,系统声音可能很低或静音,它可能会捕捉到其他外部声音,因此不建议这样做采用这种方法。
您可以使用 OSX 通过 NSSpeechSynthesizer 方法 startSpeakingString:toURL 来准备 AIFF 文件(或者,可能是一些基于 OSX 的服务):