Swift TTS,无音频输出

问题描述 投票:0回答:3

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

什么意思?我需要做什么?

我改变了语言,但它也不起作用。

swift swiftui avfoundation text-to-speech
3个回答
5
投票

感谢 @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")
            }
        }
    }
}
注意:OP 中包含的日志行仍会打印出来,但有误,不会影响 TTS。

1
投票

代码似乎没有任何问题,所以问题一定与您的 Xcode、模拟器或您正在测试的真实硬件的配置有关……或者这三者的某种组合,或者也许你的项目在 Xcode 中配置错误。

为了帮助隔离问题,您可以创建一个新的 Xcode 项目,其中仅包含一个简单的“hello world”tts 演示,例如:

let tts = AVSpeechSynthesizer()

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

如果该演示可以在您已经用于测试的相同硬件/模拟器上运行,那么您的词汇学习项目中就会出现问题,因此除非有人知道您遇到的错误的确切含义,并且知道如何修复它,否则我会建议只创建一个新的 XCode 项目并将代码剪切/粘贴到新项目中。

如果演示不起作用(并给出与您列出的相同的错误),请尝试以下操作直到它起作用:

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

0
投票

仅供参考,这是 iOS 中的一个已知问题。

https://developer.apple.com/forums/thread/713848

@CryptoAlgorithm 的回答确实为 TTS 仍将播放的问题提供了解决方法,尽管同时控制台大声抱怨。

© www.soinside.com 2019 - 2024. All rights reserved.