| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 344 人关注过本帖, 1 人收藏
标题:求助:SAPI.SpVoice大量文字内容朗读终止问题
只看楼主 加入收藏
igaoyuan
Rank: 2
等 级:论坛游民
帖 子:56
专家分:23
注 册:2022-12-19
结帖率:100%
收藏(1)
已结贴  问题点数:10 回复次数:16 
求助:SAPI.SpVoice大量文字内容朗读终止问题
大量文字朗读时,如需终止,有没有好的办法?

程序代码:
oSpeech =CreateObject("SAPI.SpVoice")        &&连接到系统的语音功能
sWord='窗前明月光,疑是地上霜'                &&被阅读的字串
oSpeech.Speak(sWord)                        &&让系统读出字符串里的内容
sWord = This.parent.edtNote.Value  &&备注字段内容
oSpeech.Speak(sWord)


有资料显示可使用oSpeech.Speak(sWord,2)来终止,尝试后不行,仍旧需要播放完
参考资料:https://sysdzw.blog.

同时还有一个问题,播放sWord='窗前明月光,疑是地上霜',一遍停止;播放sWord = This.parent.edtNote.Value 时总是播放两遍

额外一个问题,选择TTS里不同语音的语句是哪一条?谢谢!
搜索更多相关主题的帖子: 内容 文字 播放 终止 This 
2023-01-17 10:05
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:42
帖 子:705
专家分:1703
注 册:2015-12-30
收藏
得分:6 
oSpeech.Speak(sWord,2)
这里的参数“2”表示本条语音要朗读完毕
正在朗读的语音能否被中断,取决取正在朗读的文本发送时的参数,比如3是可被中断的
2023-01-17 11:37
igaoyuan
Rank: 2
等 级:论坛游民
帖 子:56
专家分:23
注 册:2022-12-19
收藏
得分:0 
改为oSpeech.Speak(sWord,3)后就不执行朗读,直接中断了
2023-01-17 11:46
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:409
帖 子:9598
专家分:40431
注 册:2014-5-20
收藏
得分:0 
SPEAK(cStr, 1)  && 1 = 异步方式,0 = 同步方式
2023-01-17 13:00
igaoyuan
Rank: 2
等 级:论坛游民
帖 子:56
专家分:23
注 册:2022-12-19
收藏
得分:0 
回复 4楼 吹水佬
谢谢吹水佬!

改动后,oSpeech.Speak(sWord)可以朗读,oSpeech.Speak(myWord,1)不读,去掉IF语句可以读,不能终止
   
程序代码:
myword = This.parent.edtNote.Value 
oSpeech =CreateObject("SAPI.SpVoice")        &&连接到系统的语音功能

sWord    = [你好!为您阅读题目]+This.parent.grdMynote.Column1.Text1.Value   &&'窗前明月光,疑是地上霜'                &&被阅读的字串
oSpeech.Speak(sWord)                        &&让系统读出字符串里的内容

oSpeech.Speak(myWord,1)                        &&让系统读出字符串里的内容
If oSpeech.Status.runningState = 2 .and. INKEY()= 27          &&如果当前正在播放,那么就播放一个空字符串,并且使用挂断之前的模式
    oSpeech.Speak("", 2)
ENDIF
2023-01-17 13:46
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:42
帖 子:705
专家分:1703
注 册:2015-12-30
收藏
得分:0 
oSpeech.Speak('这是可被中断的朗读,这是可被中断的朗读,这是可被中断的朗读',3)
inkey(0.5)
oSpeech.Speak('这句话不能被中断,这句话不能被中断',2)
oSpeech.Speak('听完第二句话,这是第三句',2)
2023-01-17 14:31
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:409
帖 子:9598
专家分:40431
注 册:2014-5-20
收藏
得分:0 
回复 5楼 igaoyuan
观察 oSpeech.Status.runningState 看看
2023-01-17 15:05
sam_jiang
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:6
帖 子:398
专家分:559
注 册:2021-10-13
收藏
得分:4 
利用vfp智能感应补全,可以得知speak方法的两个参数:ospeech.speak(text as string,[flag SpeechVoiceSpeakFlags=0] as number)
网上搜索到SpeechVoiceSpeakFlags的每个值的含义如下:
枚举SpeechVoiceSpeakFlags
    “SpVoice标志
    SVSFDefault = 0
    SVSFlagsAsync = 1
    SVSFPurgeBeforeSpeak = 2
    SVSFIsFilename = 4
    SVSFIsXML = 8
    SVSFIsNotXML = 16
    SVSFPersistXML = 32

    “正规化标志
    SVSFNLPSpeakPunc = 64

    “面具
    SVSFNLPMask = 64
    SVSFVoiceMask = 127
    SVSFUnusedFlags = -128   
结束枚举
SVSFDefault
指定应使用的默认设置。默认值是:
讲定的文本字符串同步(覆盖与SVSFlagsAsync),
不清除挂起说话请求(覆盖与SVSFPurgeBeforeSpeak),
为了解析XML的文本,如果第一个字符是左尖括号(覆盖与SVSFIsXML或SVSFIsNotXML),
不坚持全球XML状态更改在讲电话(覆盖SVSFPersistXML),
不扩展的标点字符成字(覆盖与SVSFNLPSpeakPunc)的。
那我来当个翻译器:

>>1、IsFilename;

该值表示,传入的字符串变量是代表一个文件名,所以speaker应该将这个文件里的字符串读出来,而不是读这个字符串本身。

>>2、IsXML;

该值表示这个文件的内容是按XML格式写的。可以用XML 标记来解析。而不应该将它当着是纯字符串。

>>3、FlagsAsync;

它表示,这个读的操作是异步的。比如你再一个button里调用了speak这个方法,当指定了这个flag后,马上就可以再次点击button了。而不用等到它读完了才能点。

>>4、FNLPMask;

由SAPI处理的标识是放在这个mask里的。

>>5、FNLPSpeakPunc;

表示会将标点符号读出来,而不是做停顿。比如前面这句话里的逗号和句号,如果指定该标识,那么会将(,)读成逗号。

>>6、PersistXML;

全局状态的改变量会一直保持到整个speak结束。

>>7、PurgeBeforeSpeak;

在开始本次speak之前,清除之前所有暂停住的speak任务。尤其是当你启用了上面的异步模式,你可以同时启动好多好多任务。他们会排队一个一个讲完。

>>8、UnusedFlags;

就是字面意思,不使用的。

>>9、VoiceMask;

它是5.3新加的,是从SVSFParseMask扩展而来的,SVSFParseMask= SVSFParseSapi|SVSFParseSsml,

SVSFParseSapi强制按SAPI解析XML

SVSFParseSsml强制按W3C解析XML

根据不同的需求组合就可以了,比如要求异步朗读,并且可打断,就是3(1+2);要求异步朗读文件可中断,就是7(1+2+4)...
2023-01-17 15:57
sam_jiang
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:6
帖 子:398
专家分:559
注 册:2021-10-13
收藏
得分:0 
ospeech.speak("根据不同的需求组合就可以了,比如要求异步朗读,并且可打断,就是3(1+2);要求异步朗读文件可中断,就是7(1+2+4)...",3)
要中断它,就直接发出ospeech.speak("",2),前面未完成的语音就结束播放了。
2023-01-17 16:04
sam_jiang
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:6
帖 子:398
专家分:559
注 册:2021-10-13
收藏
得分:0 
回复 8楼 sam_jiang
你可以试试看下面这句话,系统是怎么朗读的?
ospeech.speak("根据不同的需求组合就可以了,比如要求异步朗读,并且可打断,就是3(1+2);要求异步朗读文件可中断,就是7(1+2+4)...",1+2+64)
2023-01-17 16:14
快速回复:求助:SAPI.SpVoice大量文字内容朗读终止问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032424 second(s), 8 queries.
Copyright©2004-2023, BCCN.NET, All Rights Reserved