【发布时间】:2016-09-14 05:03:59
【问题描述】:
我正在尝试让 iOS 文本到语音合成器“说出”一个短语列表,这些短语之间的延迟可变。例如,我可能希望它说“你好”,然后等待 5 秒,然后“有人在吗?”,然后等待 10 秒,然后说“你好?”......等等。
我在下面做了一个简单的例子来说明我想要做什么。我知道语音合成器正在说话,额外的话语被添加到队列中,并按照接收到的顺序说出。
我尝试了很多方法来实现循环中的这种延迟。使用打印语句测试延迟确认它们正在工作,但它们似乎干扰了文本语音功能,该功能说第一个短语,但要等到 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.
}
}
}
以下是我尝试过的一些延迟方法:
将类设置为语音合成器的委托,并运行一个 while 循环,直到合成器完成。
基于时间的延迟:
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 可能是最好的。您需要确保您的闭包检索下一段文本并说出它。如果你只是像现在一样一次提交所有的话语,那是行不通的
标签: ios swift delay text-to-speech