AVSpeechSynthesizer有一个相当简单的API,它不支持保存到内置的音频文件。
我想知道是否有办法解决这个问题 - 可能会录制静音播放的输出,以便以后播放?或者更高效的东西。
答案 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: