Swift TTS,无音频输出

slmsl1lt  于 2022-11-21  发布在  Swift
关注(0)|答案(2)|浏览(340)

我试过在我的应用程序中集成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

那是什么意思,我需要做什么
我更改了语言,但也不起作用。

ozxc1zmp

ozxc1zmp1#

  • 信任@节奏拳侠的评论,它正确地确定了问题!*

readOut函数退出时,由于没有对它的引用,AVSpeechSynthesizer超出了作用域,因此在播放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")
            }
        }
    }
}
注:OP中包含的日志行仍将打印输出,但是错误的,不会影响TTS。
50few1ms

50few1ms2#

代码看起来没有任何问题,因此问题一定与Xcode、模拟器或您正在测试的真实的硬件的配置有关,..或者是三者的某种组合,或者可能是Xcode中项目的配置错误。
为了帮助隔离问题,您可以创建一个新的Xcode项目,其中只包含一个简单的“hello world”tts演示,例如:

let tts = AVSpeechSynthesizer()

tts.speak(AVSpeechUtterance(string: "hello"))

如果这个演示在您已经用于测试的相同硬件/模拟器上工作,那么您的vocab学习项目中就有一些错误,因此除非有人知道您所得到的错误的确切含义,并且知道如何修复它,否则我建议您创建一个新的XCode项目,并将您的代码剪切/粘贴到新项目中。
如果演示不起作用(并出现与您列出的错误相同的错误),请尝试以下方法,直到它起作用为止:

  • 如果您使用的是真实的设备,请尝试使用模拟器
  • 如果您使用的是模拟器,请尝试使用真实的设备
  • 更改/更新仿真器的操作系统
  • 正在更新Xcode
  • 更新Mac的操作系统

相关问题