【发布时间】:2018-06-15 14:16:59
【问题描述】:
每当我导航到这个视图控制器时,viewDidLoad 中的 speakText() 函数由于某种原因不起作用,并且视图控制器需要很长时间才能加载(当我删除该行时不是这种情况)。在该行上方,文本标签的文本设置为要朗读的字符串,并且工作正常。每次调用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)
}
}
【问题讨论】:
-
您能否尝试使用多线程来满足您的语音需求?您正在从主线程调用语音,这可能是一个问题。尝试使用 global -> userInteractive/ userInitiated queues,如果它有效,请告诉我。
-
还可以尝试在 viewDidLoad() 中调用之前将 Speech 的委托设置为 Vc(自身),然后检查。
-
更新问题。
标签: swift xcode avfoundation avspeechsynthesizer avspeechutterance