AVSpeechSynthesizer замораживает приложение для iOS на несколько секунд - PullRequest
0 голосов
/ 24 декабря 2018

Использование AVSpeechSynthesizer в моем приложении ARKit приводит к зависанию приложения на несколько секунд, прежде чем издается звук.Я создал этот вспомогательный класс:

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 MyViewController: UIViewController {
    ...

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

Неважно, где вкод я называю это.Я пытался заключить этот вызов в DispatchQueue, но он все еще не работает.Как я могу исправить это замораживание?Это нормальное поведение?

1 Ответ

0 голосов
/ 24 декабря 2018

Похоже, это связано с внутренней AVSpeechSynthesizer очередью.Вы можете попытаться заставить его управлять вещами в фоновом режиме, так как нет упоминания о том, что AVSpeechSynthesizer является только основным потоком.Сделайте это, добавив вызов последней строки (synthesizer.speak(utterance)) в фоновую очередь, собирая ссылки на такие объекты synthesizer и utterance:

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

Я думаю, причина, по которой вы заблокировали пользовательский интерфейспотому что synthesizer экземпляр должен блокировать текущий поток, чтобы говорить.Таким образом, вы должны подождать, пока синтезатор закончит говорить, прежде чем его освободят при выходе из вашего speak() метода.

...