如何使语音合成器一个接一个地说出一堆话语?

时间:2016-02-08 13:21:24

标签: ios swift text-to-speech

我正在构建一个应用程序,它将逐个说出存储在播放列表中的句子/单词。播放列表及其中的项目都存储在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,以便它可以暂停一段时间?

1 个答案:

答案 0 :(得分:2)

执行此操作的最佳方法是使用AVSpeechSynthesizerDelegate

它有一个方法...... speechSynthesizer(_:didFinishSpeechUtterance:),当话语结束时会被调用。

您可以跟踪当前正在讲话的话语以及当代表被告知其完成时,然后开始下一个话语。

如果您希望它们仅在单击按钮时播放,则在代理人获知didStartSpeechUtterance时禁用该按钮,然后启用didFinish...上的按钮。