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)
) 调用添加到后台队列以捕获对 synthesizer
和 utterance
对象的引用,例如:
DispatchQueue.global(qos: .background).async {
synthesizer.speak(utterance)
}
我认为你 ui 被阻塞的原因是因为 synthesizer
实例必须阻塞当前线程才能说话。因此,您必须等到合成器完成说话,然后才能在 speak()
方法退出时被释放。
在我的 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)
) 调用添加到后台队列以捕获对 synthesizer
和 utterance
对象的引用,例如:
DispatchQueue.global(qos: .background).async {
synthesizer.speak(utterance)
}
我认为你 ui 被阻塞的原因是因为 synthesizer
实例必须阻塞当前线程才能说话。因此,您必须等到合成器完成说话,然后才能在 speak()
方法退出时被释放。