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