以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 语音朗读问题! sp.speak只能执行一次? (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=87686) |
||||
-- 作者:ycwk -- 发布时间:2016/7/17 10:03:00 -- 语音朗读问题! sp.speak只能执行一次? \'符合条件的有两行,执行循环的时候, audio.play可以听到两遍,但是sp.speak的内容只能听到一遍,不知何故? Dim drs As List(of DataRow) = DataTables("自助报障记录表").Select("问题描述 is not null and (问题处理状态<>\'已解决\' or 问题处理状态 is null)") \' MessageBox.Show(drs.Count) For Each dr As DataRow In drs \'语音播报增加行的内容 Dim sp As new DotNetSpeech.SpVoice() For Each v As object In sp.getVoices \'用for each循环找到名称包含 Lily的语音库 If v.GetDescription Like "*LiLy*" Then sp.Voice = v Exit For End If Next Audio.play("Voice\\新报障信息提示音.wav",AudioPlayMode.WaitToComplete) \'可听到两次 \'sp.Speak("有新的报障消息到达,请注意及时处理.", DotNetSpeech.SpeechVoiceSpeakFlags.SVSFlagsAsync) \'同步 sp.Speak("有新的报障消息到达,请注意及时处理",DotNetSpeech.SpeechVoiceSpeakFlags.SVSFDefault) \'异步 不能进行其它操作 \'只能听到一次,不知何故 Next
[此贴子已经被作者于2016/7/17 16:55:09编辑过]
|
||||
-- 作者:狐狸爸爸 -- 发布时间:2016/7/18 8:53:00 -- 我测试没有问题: Dim sp As New DotNetSpeech.SpVoice() sp.Speak("I am from china.", DotNetSpeech.SpeechVoiceSpeakFlags.SVSFDefault) sp.Speak("I am from china.", DotNetSpeech.SpeechVoiceSpeakFlags.SVSFlagsAsync) |
||||
-- 作者:ycwk -- 发布时间:2016/7/18 11:26:00 -- 我的意思是,wav可以听到两次,但是 “有新的报障消息到达,请注意及时处理” 只能听到一次! 明明有两行符合循环条件的。很奇怪, Audio.play("Voice\\新报障信息提示音.wav",AudioPlayMode.WaitToComplete) \'可听到两次 sp.Speak("有新的报障消息到达,请注意及时处理",DotNetSpeech.SpeechVoiceSpeakFlags.SVSFDefault) \'异步 不能进行其它操作 \'只能听到一次,不知何故 1 新报障信息提示音.wav 2 有新的报障消息到达,请注意及时处理 3 新报障信息提示音.wav 4 此处应该播 "有新的报障消息到达,请注意及时处理" ,但实际没有声音 我在想是不是sp.speak资源被占用,没有及时释放? 导致两次播放sp.speak的时间太近,被占用,所以第二遍播不出来?
[此贴子已经被作者于2016/7/18 11:30:43编辑过]
|
||||
-- 作者:Hyphen -- 发布时间:2016/7/18 11:47:00 -- 测试没有问题 Dim sp As New DotNetSpeech.SpVoice() For I As Integer = 1 To 2 \'sp.Speak("I am from china.I am from china.I am from china.I am from china.I am from china.", DotNetSpeech.SpeechVoiceSpeakFlags.SVSFlagsAsync) sp.Speak("我的意思是,wav可以听到两次,",DotNetSpeech.SpeechVoiceSpeakFlags.SVSFlagsAsync) Next 上传例子看看
|
||||
-- 作者:ycwk -- 发布时间:2016/7/18 13:03:00 -- ok了,一时手快,把sp定义写在了循环里面,不好意思,麻烦大家半天。 [此贴子已经被作者于2016/7/18 13:30:04编辑过]
|
||||
-- 作者:ycwk -- 发布时间:2016/7/18 13:32:00 -- 顺便问下周,我用计划任务每 120秒检查一下有没有新的消息,发现程序界面在那几秒钟会变的很卡,莫非计划任务比较消耗资源? \'注意此代码只能一个人开启 \'Dim drs As List(of DataRow) =DataTables("自助报障记录表").Select("[问题处理状态]<>\'已完成\' and [问题描述] is not null") \'MessageBox.Show(drs.Count) \'语音播报增加行的内容 Dim sp As new DotNetSpeech.SpVoice() For Each v As object In sp.getVoices \'用for each循环找到名称包含 Lily的语音库 If v.GetDescription Like "*LiLy*" Then sp.Voice = v Exit For End If Next Dim drs As List(of DataRow) = DataTables("自助报障记录表").Select("问题描述 is not null and (问题处理状态<>\'已解决\' or 问题处理状态 is null)") \' MessageBox.Show(drs.Count) For Each dr As DataRow In drs Audio.play("Voice\\新报障信息提示音.wav",AudioPlayMode.WaitToComplete) \'sp.Speak("有新的报障消息到达,请注意及时处理.", DotNetSpeech.SpeechVoiceSpeakFlags.SVSFlagsAsync) \'同步 sp.Speak("有新的报障消息到达,请注意及时处理",DotNetSpeech.SpeechVoiceSpeakFlags.SVSFDefault) \'异步 不能进行其它操作 Next |
||||
-- 作者:Hyphen -- 发布时间:2016/7/18 14:18:00 -- 1、可能是调用语音引擎导致停顿 2、如果查询的数据量大,可以考虑分批处理,一次查10条,处理完在继续
|
||||
-- 作者:ycwk -- 发布时间:2016/7/18 16:12:00 -- 是的,在播放的时候啥也不能干,我的目的是让wav 和 sp.speak播放完毕,两段声音不要重叠,所以选择了异步。但是这样导致播放语音期间我的程序卡死,不能动了。 sp.speak 读的时候,如何知道读取结束了? 用延时肯定不行,因为内容可能会变化,播放时长可长可短!
[此贴子已经被作者于2016/7/18 16:18:42编辑过]
|
||||
-- 作者:大红袍 -- 发布时间:2016/7/19 1:02:00 -- 参考
|