func test() throws {
NSSpeechSynthesizer.availableVoices.forEach { print($0) }
guard let synthesizer = NSSpeechSynthesizer(voice: NSSpeechSynthesizer.VoiceName(rawValue: "com.apple.voice.enhanced.en-US.Evan")) else {
print("Voice not found")
throw CoreError.unexpectedNil
}
synthesizer.rate = 0.4
let result = synthesizer.startSpeaking("The quick brown fox jumped over the lazy dog. lol", to: URL(fileURLWithPath: "test.aiff"))
print(result)
sleep(1)
}
我现在在两个iOS上都有这个功能(17.1.1)和macOS(14.0)与Xcode 15.0.1。这在很大程度上只是对answer by @Jan Berkel的一个小调整,有助于避免“方波失真”和对该答案的评论所报告的崩溃。参考@Jan Berkel的答案,我发现在对AVAudioFile初始化器的调用中,commonFormat:参数应该是. pcmclock Float 32,以便在iOS和macOS上工作,而它应该是. pcmclock Int 16,以便在模拟器下运行时不崩溃(不要问我为什么-这只是一个观察;-)。 以下是在macOS和iOS设备上工作的相关代码(但在output?.write(from: pcmBuffer)期间在模拟器中崩溃):
output = try AVAudioFile(
forWriting: url,
settings: pcmBuffer.format.settings,
commonFormat: .pcmFormatFloat32, // works on iOS device and on macOS, but crashes in simulator during self.output?.write(from: pcmBuffer)
interleaved: false)
字符串 下面是在Xcode中的模拟器上工作的代码(但在macOS和iOS设备上会产生噪音):
output = try AVAudioFile(
forWriting: url,
settings: pcmBuffer.format.settings,
commonFormat: .pcmFormatInt16, // this produces noise on macOS and iOS device, but works in simulator
interleaved: false)
5条答案
按热度按时间rseugnpd1#
在iOS 13中,
AVSpeechSynthesizer
现在有了write(_:toBufferCallback:):字符串
tct7dpnv2#
截至目前
AVSpeechSynthesizer
不支持这一点.有没有办法得到音频文件使用AVSpeechSynthesizer
.我尝试了几个星期前我的应用程序之一,发现这是不可能的,也没有什么改变AVSpeechSynthesizer
在iOS 8.我也想过在播放时录制声音,但这种方法有很多缺陷,比如用户可能使用耳机,系统声音可能很低或静音,它可能会捕捉到其他外部声音,所以不建议使用这种方法。
polhcujo3#
您可以使用OSX通过NSS peechSynthesizer方法startSpeakingString:toURL准备AIFF文件(或者,可能是一些基于OSX的服务):
2hh7jdfx4#
正如@Jan的回答的一些评论所指出的那样,不幸的是
AVSpeechSynthesizer
在macOS上不起作用。所有其他搜索结果都指向这个问题。同样如评论所指出的,来自
import AppKit
的NSSpeechSynthesizer
仍然可以工作,尽管它被标记为已弃用:https://developer.apple.com/documentation/appkit/nsspeechsynthesizer我在macOS Ventura上测试了以下代码,它可以正常工作。基本上你需要从
NSSpeechSynthesizer.availableVoices
而不是AVSpeechSynthesisVoice.speechVoices()
中找到一个字符串,并且你需要使用didFinish
委托来确保编写完成(不包括在我的测试代码中:https://developer.apple.com/documentation/appkit/nsspeechsynthesizerdelegate/1448538-speechsynthesizer)。我们不得不使用遗留的API来实现这样的基本功能,这有点令人失望,但我相信他们在内部调用同样的东西。
字符串
tnkciper5#
我现在在两个iOS上都有这个功能(17.1.1)和macOS(14.0)与Xcode 15.0.1。这在很大程度上只是对answer by @Jan Berkel的一个小调整,有助于避免“方波失真”和对该答案的评论所报告的崩溃。参考@Jan Berkel的答案,我发现在对AVAudioFile初始化器的调用中,commonFormat:参数应该是. pcmclock Float 32,以便在iOS和macOS上工作,而它应该是. pcmclock Int 16,以便在模拟器下运行时不崩溃(不要问我为什么-这只是一个观察;-)。
以下是在macOS和iOS设备上工作的相关代码(但在
output?.write(from: pcmBuffer)
期间在模拟器中崩溃):字符串
下面是在Xcode中的模拟器上工作的代码(但在macOS和iOS设备上会产生噪音):
型
就是这样。这是我对@Jan Berkel的答案所做的唯一调整。看看对这个答案的评论,很明显,在做这个工作时有各种各样的陷阱,最值得注意的是,必须确保在文件生成之前不要发布语音合成器,并且能够接收回调。所以让我发布示例代码,展示如何使用答案来创建具有语音合成的音频文件,然后回放-确保语音合成器和音频播放器没有过早释放,并且能够接收各种回调。此代码示例使用“Swift_await”来处理回调,这段代码已经在macOS、iOS设备和iOS模拟器上进行了测试(有给定的警告)。
型