Foxtable(狐表)用户栏目专家坐堂 → 语音朗读问题! sp.speak只能执行一次?


  共有3318人关注过本帖树形打印复制链接

主题:语音朗读问题! sp.speak只能执行一次?

帅哥哟,离线,有人找我吗?
ycwk
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1228 积分:8561 威望:0 精华:0 注册:2016/2/2 21:52:00
语音朗读问题! sp.speak只能执行一次?  发帖心情 Post By:2016/7/17 10:03:00 [显示全部帖子]

'符合条件的有两行,执行循环的时候, 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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
ycwk
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1228 积分:8561 威望:0 精华:0 注册:2016/2/2 21:52:00
  发帖心情 Post By:2016/7/18 11:26:00 [显示全部帖子]

我的意思是,wav可以听到两次,但是   “有新的报障消息到达,请注意及时处理”   只能听到一次!  明明有两行符合循环条件的。很奇怪, 

Audio.play("Voice\新报障信息提示音.wav",AudioPlayMode.WaitToComplete)          '可听到两次
 sp.Speak("有新的报障消息到达,请注意及时处理",DotNetSpeech.SpeechVoiceSpeakFlags.SVSFDefault)    '异步  不能进行其它操作     '只能听到一次,不知何故


1
     新报障信息提示音.wav 
2     
     有新的报障消息到达,请注意及时处理
      新报障信息提示音.wav 
4    
     此处应该播 "有新的报障消息到达,请注意及时处理"  ,但实际没有声音

     我在想是不是sp.speak资源被占用,没有及时释放? 导致两次播放sp.speak的时间太近,被占用,所以第二遍播不出来?
[此贴子已经被作者于2016/7/18 11:30:43编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
ycwk
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1228 积分:8561 威望:0 精华:0 注册:2016/2/2 21:52:00
  发帖心情 Post By:2016/7/18 13:03:00 [显示全部帖子]

ok了,一时手快,把sp定义写在了循环里面,不好意思,麻烦大家半天。
[此贴子已经被作者于2016/7/18 13:30:04编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
ycwk
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1228 积分:8561 威望:0 精华:0 注册:2016/2/2 21:52:00
  发帖心情 Post By: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

 回到顶部
帅哥哟,离线,有人找我吗?
ycwk
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1228 积分:8561 威望:0 精华:0 注册:2016/2/2 21:52:00
  发帖心情 Post By:2016/7/18 16:12:00 [显示全部帖子]

是的,在播放的时候啥也不能干,我的目的是让wav 和 sp.speak播放完毕,两段声音不要重叠,所以选择了异步。但是这样导致播放语音期间我的程序卡死,不能动了。

sp.speak 读的时候,如何知道读取结束了?  用延时肯定不行,因为内容可能会变化,播放时长可长可短!
[此贴子已经被作者于2016/7/18 16:18:42编辑过]

 回到顶部