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


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

主题:语音朗读问题! 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编辑过]

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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By: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
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | 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编辑过]

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


加好友 发短信
等级:狐神 帖子:5015 积分:25363 威望:0 精华:0 注册:2015/8/18 9:21:00
  发帖心情 Post By: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
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | 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
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | 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

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


加好友 发短信
等级:狐神 帖子:5015 积分:25363 威望:0 精华:0 注册:2015/8/18 9:21:00
  发帖心情 Post By:2016/7/18 14:18:00 [只看该作者]

1、可能是调用语音引擎导致停顿

2、如果查询的数据量大,可以考虑分批处理,一次查10条,处理完在继续

 回到顶部
帅哥哟,离线,有人找我吗?
ycwk
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | 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编辑过]

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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/7/19 1:02:00 [只看该作者]

 参考

 

下载信息  [文件大小:340.0 KB  下载次数:15]
图片点击可在新窗口打开查看点击浏览该文件:异步语音小例.table


 回到顶部