我试过在我的应用程序中集成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
那是什么意思,我需要做什么
我更改了语言,但也不起作用。
2条答案
按热度按时间ozxc1zmp1#
readOut
函数退出时,由于没有对它的引用,AVSpeechSynthesizer
超出了作用域,因此在播放TTS之前释放了它。解决方法是在视图的成员变量中保存对AVSpeechSynthesizer
的引用,然后将readOut
转换为视图中的方法:注:OP中包含的日志行仍将打印输出,但是错误的,不会影响TTS。
50few1ms2#
代码看起来没有任何问题,因此问题一定与Xcode、模拟器或您正在测试的真实的硬件的配置有关,..或者是三者的某种组合,或者可能是Xcode中项目的配置错误。
为了帮助隔离问题,您可以创建一个新的Xcode项目,其中只包含一个简单的“hello world”tts演示,例如:
如果这个演示在您已经用于测试的相同硬件/模拟器上工作,那么您的vocab学习项目中就有一些错误,因此除非有人知道您所得到的错误的确切含义,并且知道如何修复它,否则我建议您创建一个新的XCode项目,并将您的代码剪切/粘贴到新项目中。
如果演示不起作用(并出现与您列出的错误相同的错误),请尝试以下方法,直到它起作用为止: