判断TTS语音朗读是否结束
2013-02-04 14:38
225 查看
最近玩语音朗读的时候比较多,也在两个软件中应用过。其实大多语音朗读的代码还是很好写的,只是像判断TTS语音朗读是否结束或者当前语音引擎的状态稍微要查找一下参数。这里记录一下:
原本在网上查到的一条关于判断TTS朗读完成事件的代码WaitForSingleObject(spvoice.SpeakCompleteEvent, 200);在delphi 中使用时并没有达到原本看似应该有的功效,测试时发现这东西只是在TTS合成朗读流后就返回了,说白了就是TTS刚要朗读,就被判定成朗读完成了。仔细查找了一下spvoice的参数,里面有个statdus属性,这个返回的对象中可以获取一些有用的属性参数如:RunningState(运行状态), inputWordLegth(朗读句子所有词汇长度总和),inputWordPosition(当前朗读词汇的末位置)……
其中RunningState有三个状态: 朗读文本被全部渲染合成后返回 SRSEDone = 1 正在朗读中会返回 SRSEIsSpeaking = 2
暂停朗读时会返回0
利用这三个属性就可以判断朗读是否已经完成,加两个计时器,朗读句子开始时,启动判断朗读状态的计时器,完成后再重新激活计时器进行朗读:
原本在网上查到的一条关于判断TTS朗读完成事件的代码WaitForSingleObject(spvoice.SpeakCompleteEvent, 200);在delphi 中使用时并没有达到原本看似应该有的功效,测试时发现这东西只是在TTS合成朗读流后就返回了,说白了就是TTS刚要朗读,就被判定成朗读完成了。仔细查找了一下spvoice的参数,里面有个statdus属性,这个返回的对象中可以获取一些有用的属性参数如:RunningState(运行状态), inputWordLegth(朗读句子所有词汇长度总和),inputWordPosition(当前朗读词汇的末位置)……
其中RunningState有三个状态: 朗读文本被全部渲染合成后返回 SRSEDone = 1 正在朗读中会返回 SRSEIsSpeaking = 2
暂停朗读时会返回0
利用这三个属性就可以判断朗读是否已经完成,加两个计时器,朗读句子开始时,启动判断朗读状态的计时器,完成后再重新激活计时器进行朗读:
procedure TForm1.Timer1Timer(Sender: TObject); begin timer1.Enabled:=false; learnTTS.Speak('this is voa explorations in special english!',1); WaitForSingleObject(learnTTS.SpeakCompleteEvent, 200); timer2.Enabled:=true; end; procedure TForm1.Timer2Timer(Sender: TObject); begin edit1.Text:=inttostr(learnTTS.Status.RunningState); if learnTTS.Status.RunningState=1 then //朗读完成后会返回1 timer1.Enabled:=true; end;
相关文章推荐
- C# 多线程是否结束可通过线程池可以判断
- [转]C# 多线程是否结束可通过线程池可以判断
- WaitForSingleObject的用法-(判断一个程序是否结束)
- 【VC++技术杂谈004】使用微软TTS语音引擎实现文本朗读
- NSString [a hasPrefix: ] [a hasSuffix:] 判断开头和结束是否包含
- 使用微软TTS语音引擎实现文本朗读
- MFC 判断线程是否结束
- C#语音朗读文本 — TTS的实现
- cocos2d-html5学习笔记(七)--Action 讲了action判断是否结束,然后调用回调函数
- 判断游标是否结束
- 判断system()执行shell脚本是否正常执行结束
- vb.net判断winrar压缩文件是否压缩结束
- 如何判断一个文件是否结束?
- 详解Android SDK1.6中Text-To-Speech(TTS)语音朗读
- 基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0
- Android 通过手说tts中文语音包实现中文朗读
- 使用VB.net 创建简单的TTS中英文混合语音朗读
- 如何用JS判断一个网页中的图片是否下载结束
- WebBrowser判断页面是否下载结束
- JS时间戳比较大小:对于一组时间戳(开始时间~结束时间)和另一组时间戳进行比较,用于判断被比较时间戳组是否在要求范围内