Ошибка AVSpeechSynthesiser в функции ViewDidLoad - PullRequest
0 голосов
/ 16 мая 2018

Всякий раз, когда я перехожу к этому контроллеру представления, функция 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 Ответ

0 голосов
/ 16 мая 2018

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

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(), поскольку последний вызывается один раз, когда приложение находится на переднем плане.

...