Swift 中的 AVSpeechUtterance 和无语音/语音缺失

AVSpeechUtterance and no speech / missing speech in Swift

我目前正在使用 XCode 9.4.1 和 Swift 组装我的第一个应用程序。在我的代码中,我正在处理一个列表,我希望大声说出列表中的每个值。下面是我的代码

// classificationResults is my list
for returnedValue in self.classificationResults{
                    let utterance = AVSpeechUtterance(string: returnedValue)
                    utterance.voice = AVSpeechSynthesisVoice(language: "en-GB")
                    utterance.rate = 0.5

                    let synthesizer = AVSpeechSynthesizer()
                    synthesizer.speak(utterance)
                    // print(returnedValue)

当 运行 在模拟器中使用它时,它可以工作,但它只说允许列表中的第一个或两个值(有 7 个)。然后,当我直接在我的设备上 运行 时,什么也没有大声说出来。

有什么想法/建议吗?提前致谢

我已经实现了以下代码,通过使用 AVSpeechSynthesizer 将我的所有文本转换为语音。此代码为例,您可以通过您的代码尝试。

class TextToVoiceVC: UIViewController, AVSpeechSynthesizerDelegate {

    var arrSpeechCount = ["One", "Two", "Three", "Four", "Five", "Six", "Seven"]
    var count : Int = 0
    let speechSynthesizer   = AVSpeechSynthesizer()        

    //----------------------------------------------------------------
    // MARK:- AVSpeechSynthesixerDelegate
    //----------------------------------------------------------------

    func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didStart utterance: AVSpeechUtterance) {

    }

    //----------------------------------------------------------------

    func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) {

        speechSynthesizer.stopSpeaking(at: .word)

        count += 1
        if count < arrSpeechCount.count {
            let speechUtterance = AVSpeechUtterance(string: (arrSpeechCount[count]))
            DispatchQueue.main.async {
                self.speechSynthesizer.speak(speechUtterance)
            }
        }
    }


    //----------------------------------------------------------------
    // MARK:- View Life Cycle Methods
    //----------------------------------------------------------------

    override func viewDidLoad() {
        super.viewDidLoad()
        speechSynthesizer.delegate = self
    }

    //----------------------------------------------------------------

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        // Code to start speech
        if speechSynthesizer.isSpeaking {
            speechSynthesizer.stopSpeaking(at: .immediate)
        } else {
            let speechUtterance = AVSpeechUtterance(string: (arrSpeechCount[count]))

            DispatchQueue.main.async {
                self.speechSynthesizer.speak(speechUtterance)
            }
        }
    }
}

此代码在我的模拟器和设备中均有效。我希望这对你也有用。您应该尝试委托您的数据。

问题可能出在你的玩家生命周期:最重要的是要记住保留你的AVSpeechSynthesizer实例,直到完成完整的演讲.

将您创建的合成器移出循环并使其保持活动状态直到演讲结束:这 也可能有所帮助。