在我的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
中,但仍然无法正常工作。如何解决此冻结?这是正常行为吗?
答案 0 :(得分:1)
好像它与内部AVSpeechSynthesizer
队列有关。您可以尝试使其在后台管理事物,因为没有提到AVSpeechSynthesizer
仅是主线程。
为此,请在后台队列中添加最后一行(synthesizer.speak(utterance)
)调用,以捕获对synthesizer
和utterance
对象的引用,如下所示:
DispatchQueue.global(qos: .background).async {
synthesizer.speak(utterance)
}
我认为您阻止了ui的原因是因为synthesizer
实例必须阻止当前线程讲话。因此,您必须等到合成器完成讲话后,才能在您的speak()
方法的出口处重新分配。