我正在构建一个应用程序,它将逐个说出存储在播放列表中的句子/单词。播放列表及其中的项目都存储在Core Data中。
我在故事板中添加了播放/停止按钮。这是它的事件处理程序:
ankit@ankit21:/usr/lib/hbase/hbase-0.94.8$ jps
Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar
7609 HMaster
7756 Jps
@IBAction func playClick(sender: UIBarButtonItem) {
if isPlaying {
synthesizer.stopSpeakingAtBoundary(.Immediate)
isPlaying = false
sender.image = UIImage(named: "play")
} else {
sender.image = UIImage(named: "stop")
isPlaying = true
for string in playlist.utterrances! {
let utterance = UserSettings.getPrefUtterance((string as! Utterance).string!)
utterance.postUtteranceDelay = 2
synthesizer.speakUtterance(utterance)
}
isPlaying = false
sender.image = UIImage(named: "play")
}
}
(类型isPlaying
),Bool
(类型synthesizer
)和AVSpeechSynthesizer
(类型playlist
,实体描述)是类级变量。
我认为这里的代码非常清楚。首先我决定按钮是应该停止还是启动合成器。如果是后者,则遍历播放列表中的项目并合成它们。然后切换图像并改变Playlists
但是当我运行应用程序并按下按钮时,什么也没发生。没有声音,没有图像变化,没有任何东西。我认为这是因为方法中的最后两行,所以我删除了它们。这次,按钮的图像发生了变化,但仍然没有声音。
我认为这一定是因为我告诉合成器在最后一次话语结束前开始说话。或者我需要知道合成器何时停止说话并开始另一个话语。
“但你为什么不加入琴弦并将它合成一次?”,你问道。因为我想在播放列表中的每个项目之间有两秒钟的延迟!
问题:
我如何一个接一个地播放播放列表的内容? (两者之间有明显的延迟)
或
我需要使用哪些字符来创建isPlaying
,以便它可以暂停一段时间?
答案 0 :(得分:2)
执行此操作的最佳方法是使用AVSpeechSynthesizerDelegate
。
它有一个方法...... speechSynthesizer(_:didFinishSpeechUtterance:)
,当话语结束时会被调用。
您可以跟踪当前正在讲话的话语以及当代表被告知其完成时,然后开始下一个话语。
如果您希望它们仅在单击按钮时播放,则在代理人获知didStartSpeechUtterance
时禁用该按钮,然后启用didFinish...
上的按钮。