AVSpeechSynthesizer 冻结 iOS 应用几秒钟

AVSpeechSynthesizer freezes iOS app for a few seconds

在我的 ARKit 应用程序中使用 AVSpeechSynthesizer 会使应用程序在发出声音之前冻结几秒钟。我创建了这个助手 class:

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 中,但它仍然不起作用。我该如何解决这个冻结问题?这是正常行为吗?

看起来它与内部 AVSpeechSynthesizer 队列相连。您可以尝试让它在后台管理事物,因为没有提到 AVSpeechSynthesizer 只是主线程。 通过将最后一行 (synthesizer.speak(utterance)) 调用添加到后台队列以捕获对 synthesizerutterance 对象的引用,例如:

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

我认为你 ui 被阻塞的原因是因为 synthesizer 实例必须阻塞当前线程才能说话。因此,您必须等到合成器完成说话,然后才能在 speak() 方法退出时被释放。