我试过在我的应用程序TTS中集成,但是如果我点击按钮没有音频输出。这是按钮代码:
struct VocabDetailView: View {
//...
var body: some View {
//...
HStack{
Button("Play") {
readOut(text: "test")
}
}
}
}
//The code from readOut is:
func readOut(text: String) {
let utterance = AVSpeechUtterance(string: text)
utterance.voice = AVSpeechSynthesisVoice(language: "en-US")
let synth = AVSpeechSynthesizer()
synth.speak(utterance)
}
在 Xcode 的输出字段中,每次单击按钮时:
2022-11-12 09:53:08.349877+0100 Vocab-learner[2394:64531] [plugin] AddInstanceForFactory: No factory registered for id <CFUUID 0x600000354580> F8BB1C28-BAE8-11D6-9C31-00039315CD46
2022-11-12 09:53:19.528945+0100 Vocab-learner[2394:64592] [catalog] Unable to list voice folder
2022-11-12 09:53:19.539617+0100 Vocab-learner[2394:64592] [catalog] Unable to list voice folder
2022-11-12 09:53:19.543384+0100 Vocab-learner[2394:64592] [catalog] Unable to list voice folder
2022-11-12 09:53:19.551385+0100 Vocab-learner[2394:64592] [catalog] Unable to list voice folder
2022-11-12 09:53:19.566548+0100 Vocab-learner[2394:64916] [AXTTSCommon] File file:///System/Library/PrivateFrameworks/TextToSpeechMauiSupport.framework/Resources/TTSResources/en-US/Samantha/Contents/user_rules.txt contained data that was not null terminated
2022-11-12 09:53:19.573183+0100 Vocab-learner[2394:64916] [AXTTSCommon] File file:///tmp/com.apple.mobileassetd/AssetsV2/com_apple_MobileAsset_Trial_Siri_SiriTextToSpeech/purpose_auto/253115073e2b38c109deaac3e52d26ad44a84148.asset/AssetData/vocalizer-user-dict.dat contained data that was not null terminated
什么意思?我需要做什么?
我改变了语言,但它也不起作用。
感谢 @Rhythmic Fistman 的评论,它正确地识别了问题!
AVSpeechSynthesizer
超出范围,因为当 readOut
函数退出时不再持有对它的引用,因此它在播放 TTS 之前被释放。一种解决方案是在您的视图中的成员变量中保留对AVSpeechSynthesizer
的引用,并将readOut
转换为您视图中的方法:
struct VocabDetailView: View {
let synth = AVSpeechSynthesizer()
private func readOut(text: String) {
let utterance = AVSpeechUtterance(string: text)
utterance.voice = AVSpeechSynthesisVoice(language: "en-US")
synth.speak(utterance)
}
var body: some View {
HStack{
Button("Play") {
readOut(text: "test")
}
}
}
}
代码似乎没有任何问题,所以问题一定与您的 Xcode、模拟器或您正在测试的真实硬件的配置有关……或者这三者的某种组合,或者也许你的项目在 Xcode 中配置错误。
为了帮助隔离问题,您可以创建一个新的 Xcode 项目,其中仅包含一个简单的“hello world”tts 演示,例如:
let tts = AVSpeechSynthesizer()
tts.speak(AVSpeechUtterance(string: "hello"))
如果该演示可以在您已经用于测试的相同硬件/模拟器上运行,那么您的词汇学习项目中就会出现问题,因此除非有人知道您遇到的错误的确切含义,并且知道如何修复它,否则我会建议只创建一个新的 XCode 项目并将代码剪切/粘贴到新项目中。
如果演示不起作用(并给出与您列出的相同的错误),请尝试以下操作直到它起作用:
仅供参考,这是 iOS 中的一个已知问题。
https://developer.apple.com/forums/thread/713848
@CryptoAlgorithm 的回答确实为 TTS 仍将播放的问题提供了解决方法,尽管同时控制台大声抱怨。