标题:如何在调用语音引擎时异步播放的问题,请帮忙!
只看楼主
w7802672
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2015-5-20
得分:0 
回复 5楼 吹水佬
你好,还有什么参数可用呢?因为继续执行其他代码时声音就停止了,能否换个参数能把声音播放完呢?
2016-04-29 10:38
w7802672
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2015-5-20
得分:0 
回复 5楼 吹水佬
再请教一下,为什么参数设为1之后有时候能播放,有时候没有声音呢?我只运行1楼里的代码(参数改为1),没有运行别的。
2016-04-29 11:09
w7802672
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2015-5-20
得分:0 
loStream = Createobject("SAPI.SPFileStream")
loVoice = Createobject("Sapi.Spvoice")
Delete File SampleVoice.wav
loStream.Open("SampleVoice.wav", 3)
loVoice.AudioOutputStream = loStream
loVoice.Voice = loVoice.GetVoices().Item(0)
loVoice.Speak("This is me Reading this Information.")
loStream.Close
loVoice.AudioOutputStream = .Null.
loStream.Open("SampleVoice.wav")
loVoice.Voice = loVoice.GetVoices().Item(0)
lovoice.speak('你好',1)

最后一句是lovoice.speak('你好',0)就播放声音,
最后一句是lovoice.speak('你好',1)时不能播放声音,如果加一句messagebox对话框就有声音(我在试的时候加了这一句想看看是不是在播放声音的同时继续程序的执行了),可是我并不想要这个对话框。
是什么原因不能播放呢?
2016-04-29 11:36
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 13楼 w7802672
比较两次播放情况有什么不同:
程序代码:
oSpeak = CREATEOBJECT("SAPI.SPVoice")
cStr = "窗前明月光,疑是地上霜。"
oSpeak.Speak(cStr, 1)    && 播放
FOR i=1 TO LENC(cStr)    && 继续下面的工作
    ? SUBSTRC(cStr, i, 1)
    INKEY(0.5)
ENDFOR
oSpeak.Speak(cStr, 1)    && 播放
FOR i=1 TO LENC(cStr)    && 继续下面的工作
    ? SUBSTRC(cStr, i, 1)
    INKEY(0.1)
ENDFOR
* 运行结束关闭
2016-04-29 14:58
w7802672
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2015-5-20
得分:0 
回复 14楼 吹水佬
没错,就是这个问题。
这和后面加一个带时间延迟的MESSAGEBOX是一样的道理。
如果后续的代码没有执行完它会继续播放,如果后续的代码执行完了它就会停止播放了。
现在的问题是在实际应用中不知道后面的代码会执行多长时间,也不能确定语音会播放多长时间。我的想法是,只要后面的代码不发出另外的语音,就把当前的语音播放完。如果后面的代码执行完了,也把语音播放完。
最后剩下的问题就是如何才能在后面的代码执行完之后仍然继续把语音完整地播放完呢?
2016-04-29 16:43
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
得分:0 
楼主你的代码在命令窗口运行应该没有问题,但在 PRG 文件中运行是有这个问题,因为还没有发声,对象就已经释放了。
所以你可以用 Public 全局变量,或是用 _Screen 属性,或者用 Inkey() 延时。

方法一:
Public loSpeak As Object
loSpeak = Createobject("SAPI.SPVoice")
loSpeak.Voice = loSpeak.GetVoices().Item(0)  && 设置音量
loSpeak.SPEAK("Hello World", 1)


方法二:
If Not Pemstatus(_Screen, "loSpeak", 5)
    _Screen.AddProperty("loSpeak")
    _Screen.loSpeak = Createobject("SAPI.SPVoice")
    _Screen.loSpeak.Voice = _Screen.loSpeak.GetVoices().Item(0)  && 设置音量
Endif
_Screen.loSpeak.SPEAK("Hello World", 1)

试试看。

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-04-29 18:31
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 15楼 w7802672
视实际情况考虑 oSpeak 对象的作用域。
在过程中可用 PUBLIC、PRIVATE 和 LOCAL 声明 oSpeak 对象,或在表单中添加 oSpeak 对象属性。
2016-04-29 20:09
w7802672
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2015-5-20
得分:0 
回复 16楼 aaaaaa
试过了,非常正确,更是非常的感谢!看来我需要学习的地方太多了,花了一整天的时间没弄明白的问题,你一眼就看出问题所在,真的很佩服!
2016-04-29 21:35



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-464241-1-1.html




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

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