AVSpeechSynthesizer冻结iOS应用几秒钟

时间:2018-12-24 10:18:26

标签: ios avspeechsynthesizer

在我的ARKit应用程序中使用AVSpeechSynthesizer可使该应用程序冻结几秒钟,然后发出声音。我创建了这个帮助器类:

public class TextToSpeech {
    class func speak(text: String) {
        let utterance = AVSpeechUtterance(string: text)
        utterance.voice = AVSpeechSynthesisVoice(language: "EN")
        utterance.rate = 0.3
        let synthesizer = AVSpeechSynthesizer()
        synthesizer.speak(utterance)
    }
}

但是,当我调用其class函数时,该应用程序冻结了几秒钟。

class MyViewController: UIViewController {
    ...

    @objc func didTapButton() {
        TextToSpeech.speak(text: "test") // it works but it freezes the app temporarily
    }
}

我在代码中的何处都无所谓。我试图将此调用括在DispatchQueue中,但仍然无法正常工作。如何解决此冻结?这是正常行为吗?

1 个答案:

答案 0 :(得分:1)

好像它与内部AVSpeechSynthesizer队列有关。您可以尝试使其在后台管理事物,因为没有提到AVSpeechSynthesizer仅是主线程。 为此,请在后台队列中添加最后一行(synthesizer.speak(utterance))调用,以捕获对synthesizerutterance对象的引用,如下所示:

DispatchQueue.global(qos: .background).async { 
    synthesizer.speak(utterance) 
} 

我认为您阻止了ui的原因是因为synthesizer实例必须阻止当前线程讲话。因此,您必须等到合成器完成讲话后,才能在您的speak()方法的出口处重新分配。