我試圖讓iOS文本到語音合成器「說出」一個短語列表,並在短語之間添加一個可變延遲。例如,我可能希望它說「你好」,然後等待5秒鐘,然後「有人在嗎?」,然後等待10秒,然後說出「你好?」等等。Swift iOS Text To Speech不能在循環中使用「delay」
我在下面做了一個簡單的例子,說明了我正在嘗試做什麼。我知道語音合成器正在講話,額外的話語被添加到隊列中,並按照他們接收的順序講話。
我試過很多方法來實現循環中的延遲。使用打印語句測試延遲證實它們正在工作,但它們似乎干擾了文本說明功能,它說明第一個短語,但等到for循環完成後再說說其餘部分。我認爲任何這些類型的延遲都會起作用,因爲我認爲語音合成器是事件驅動的。
我很感激一些幫助,或者至少了解它爲什麼它不工作。謝謝!
下面是示例代碼:iPhone 6模擬器時,Xcode 7.3
import UIKit
import AVFoundation
class ViewController: UIViewController {
let speechSynthesizer = AVSpeechSynthesizer()
var phraseArray: [String] = ["One", "Two", "Three", "Four", "Five", "Six", "Seven"]
override func viewDidLoad() {
super.viewDidLoad()
for phrase in phraseArray{
let speechUtterance = AVSpeechUtterance(string: phrase)
speechSynthesizer.speakUtterance(speechUtterance)
//"delay()" goes here. It needs to be a variable length delay.
}
}
}
下面是一些我曾嘗試延遲的方法:
設置的類作爲一個代表語音合成器並運行一段時間循環,直到合成器完成。基於
時間延遲:
referenceDate = NSDate() while(NSDate().timeIntervalSinceDate(referenceDate) < 0.5) {}
我試圖從堆棧 「延遲」 的解決方案,像這樣的:Swift delay in loop
func delay(delay:Double, closure:()->()) { dispatch_after( dispatch_time( DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC)) ), dispatch_get_main_queue(), closure) }
睡眠()
選項3可能是最好的。你需要確保你的閉包檢索下一個文本並說出它。如果你只是一次提交所有的話語,就像現在一樣,它將不起作用 – Paulw11