Ошибка AVSpeechSynthesiser в функции ViewDidLoad

Всякий раз, когда я перемещаюсь к этому контроллеру представления, speakText() функция в viewDidLoad по какой-то причине не работает, и загрузка контроллера представления занимает много времени (это не тот случай, когда я удаляю эту строку). Над этой строкой текст текстовой метки устанавливается на строку, которая должна произноситься, и работает нормально. Каждый раз recordTapped называется, синтез речи работает отлично. Тем не менее, это просто не похоже на работу в viewDidLoad,

ОБНОВЛЕНИЕ Я провел еще несколько тестов после назначения делегата контроллера представления синтезатора речи и асинхронного запуска функции. Тем не менее, это не работает. Я установил контроллер вида в исходный контроллер вида, и он все еще не работает, так что это не проблема в навигации, и время загрузки все еще очень велико.

import UIKit
import AVFoundation

class StartViewController: UIViewController, AVAudioRecorderDelegate {

    @IBOutlet weak var questionLabel: UILabel!
    @IBOutlet weak var recordButton: UIButton!
    let synth = AVSpeechSynthesizer()
    var myUtterance = AVSpeechUtterance(string: "")
    var number = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        synth.delegate? = self as! AVSpeechSynthesizerDelegate
        number = 0
        DispatchQueue.global(qos: .userInitiated).async       {self.speakText(int: number)}
        self.number = self.number + 1
    }

    @IBAction func recordTapped(_ sender: UIButton) {
        speakText(int: number)
        number = number + 1
    }

    func speakText(int: Int) {

    myUtterance = AVSpeechUtterance(string: "the number is \(int)")
    myUtterance.voice = AVSpeechSynthesisVoice(language: "en-AU")
    synth.speak(myUtterance)

    }

}

1 ответ

Решение

Как я сказал в комментариях, многопоточность работает. Только что проверил себя. Рабочий код ниже, пожалуйста, проверьте и подтвердите. Всегда полезно положиться на отдельную ветку речи.

import UIKit
import AVFoundation

class ViewController: UIViewController {

    @IBOutlet weak var questionLabel: UILabel!
    @IBOutlet weak var recordButton: UIButton!

    var number = 0

    @IBAction func recordTapped(_ sender: UIButton) {
        questionLabel.text = "\(number)"
        speakTest(int: number)
        number += 1
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        number = 0
        questionLabel.text = "\(number)"
        DispatchQueue.global(qos: .userInitiated).async {
            self.speakTest(int: self.number)
        }
//        speakTest(int: number)

        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func speakTest(int: Int) {
        let utterance = AVSpeechUtterance(string: "Number is \(int)")
        let synth = AVSpeechSynthesizer()
        synth.speak(utterance)
    }
}

Кроме того, для вызова Речи всякий раз, когда открывается вид, позвоните из viewWillAppear() или же viewDidAppear() а не из viewDidLoad(), поскольку последний вызывается один раз, когда приложение находится на переднем плане.

Другие вопросы по тегам