标题:求助:SAPI.SpVoice大量文字内容朗读终止问题
只看楼主
igaoyuan
Rank: 2
等 级:论坛游民
帖 子:84
专家分:49
注 册:2022-12-19
得分:0 
回复 6楼 laowan001

太好了!3 是可以中断的,IF语句不需要oSpeech.Status.runningState,搞定了!!!

程序代码:
oSpeech = CreateObject("SAPI.SpVoice")        &&连接到系统的语音功能
sWord    ='窗前明月光,疑是地上霜'            &&被阅读的字串
oSpeech.Speak(sWord)                        &&让系统读出字符串里的内容
oSpeech.Speak('这是可被中断的朗读,这是可被中断的朗读,这是可被中断的朗读',3)
? oSpeech.Status.runningState      &&return 0
inkey(3.0)
oSpeech.Speak('这句话不能被中断,这句话不能被中断',2)
oSpeech.Speak('听完第二句话,这是第三句',2)
? oSpeech.Status.runningState     &&&&return 1
2023-01-17 16:21
igaoyuan
Rank: 2
等 级:论坛游民
帖 子:84
专家分:49
注 册:2022-12-19
得分:0 
回复 7楼 吹水佬
谢谢!
返回值0或1,没有2,不需要这条语句
2023-01-17 16:22
igaoyuan
Rank: 2
等 级:论坛游民
帖 子:84
专家分:49
注 册:2022-12-19
得分:0 
回复 10楼 sam_jiang
正解!!非常感谢!
2023-01-17 16:27
sam_jiang
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:542
专家分:781
注 册:2021-10-13
得分:0 
回复 11楼 igaoyuan
事实上,只要是异步的,都可以被中断。同步的没法中断,必须读完才可以执行下一步。
2023-01-17 16:32
kangss
Rank: 4
等 级:贵宾
威 望:10
帖 子:138
专家分:237
注 册:2014-6-12
得分:0 
回复 楼主 igaoyuan
给你提供一些资料

微软语音库使用实例代码
*!* 语音库:使用示例
*!* 此程序的运行依赖于Microsoft Speech SDK 5.0 或  Microsoft Speech SDK 5.1 的安装
*!* 作  者:TLDS_ZGM
*----------------------------------------------------------
* HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\MSSam                       男_英文
* HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\MSMike                      男_英文
* HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\MSMary                      女_英文
* HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\MSSimplifiedChineseVoice    中文
* HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\SampleTTSVoice              男_???

*!*常用属性和方法
*----------------------------------------------------------
* speak("中文发音",n)   && 朗读(n=0,2),停止(n=1,3) 此处解释*****有错误
* pause()               && 暂停
* resume()              && 恢复
* Volume =100           && 音量(0__100)
* Rate =0               && 语速(越大越快)
* GetVoices.Count       && 语音库数量
* getvoices.item(i)     && 第I个语音库

*!*实例:(注意:标点符号应与文字之间有间隔,否则可能会朗读标点)
*----------------------------------------------------------
RUN /N REGSVR32 /S COMCTL32.OCX
LOVOICE=CREATEOBJECT('sapi.spvoice')    && 建立对象
DIMENSION 语音库(lovoice.GetVoices.Count)
FOR i=0 TO lovoice.GetVoices.Count-1                  && 用于枚举语音库
    语音库(i+1)=lovoice.getvoices.item(i).id          && 语音库标志
ENDFOR

FM_DWJESET=CREATEOBJECT('DWJESET_FORM')
FM_DWJESET.SHOW(1)
DEFI CLASS DWJESET_FORM AS FORM
     WIDTH =600
     HEIGHT=400
     AUTOCENTER=.T.
     BORDERSTYLE=1
     CAPTION='  语音识别'
     ADD OBJECT 表单边框  AS SHAPE         WITH TOP=5  ,LEFT=5,  WIDTH=590,HEIGHT=390 ,SPECIALEFFECT=0    && 大线框
     ADD OBJECT 提示信息  AS LABEL         WITH TOP=20 ,LEFT=20, AUTOSIZE=.T.,CAPTION='朗读内容:',BACKSTYLE=0
     ADD OBJECT 朗读内容  AS EDITBOX       WITH TOP=35 ,LEFT=15, WIDTH=400,HEIGHT=350,value="Enter text you wish spoken here."&& text you wish spoken here.'&&ControlSource='内容'&&,READONLY=.T.
     ADD OBJECT 开始朗读  AS COMMANDBUTTON WITH TOP=230,LEFT=450,WIDTH=110,HEIGHT=24,CAPTION='开 始 朗 读'
     ADD OBJECT 停止朗读  AS COMMANDBUTTON WITH TOP=270,LEFT=450,WIDTH=110,HEIGHT=24,CAPTION='停 止 朗 读'
     ADD OBJECT 暂停朗读  AS COMMANDBUTTON WITH TOP=310,LEFT=450,WIDTH=110,HEIGHT=24,CAPTION='暂 停 朗 读'
     ADD OBJECT 退出程序  AS COMMANDBUTTON WITH TOP=350,LEFT=450,WIDTH=110,HEIGHT=24,CAPTION='退 出 程 序'
     ADD OBJECT 音库信息  AS LABEL         WITH TOP=35 ,LEFT=430, AUTOSIZE=.T.,CAPTION='当前语音库:',BACKSTYLE=0
     ADD OBJECT 语速信息  AS LABEL         WITH TOP=93 ,LEFT=430, AUTOSIZE=.T.,CAPTION='语速:',BACKSTYLE=0
     ADD OBJECT 音量信息  AS LABEL         WITH TOP=153,LEFT=430, AUTOSIZE=.T.,CAPTION='音量:',BACKSTYLE=0
     ADD OBJECT 语音库表  AS COMBOBOX      WITH RowSource=[语音库],TOP=54,LEFT=430,WIDTH=150,HEIGHT=22,ROWSOURCETYPE=5,STYLE=2,TABSTOP=.F.,value=1
     ADD OBJECT 语速控件  AS OLECONTROL    WITH OLECLASS='MSComctlLib.Slider.2',TOP=110,LEFT=420,WIDTH=165,HEIGHT=22,ENABLED=.T.
     ADD OBJECT 音量控件  AS OLECONTROL    WITH OLECLASS='MSComctlLib.Slider.2',TOP=170,LEFT=420,WIDTH=165,HEIGHT=22,ENABLED=.T.

     PROCEDURE 语音库表.InteractiveChange
         lovoice.voice=lovoice.getvoices.item(THISFORM.语音库表.value-1)
     ENDPROC

     PROCEDURE 语速控件.INIT
         THISFORM.语速控件.MIN=-10
         THISFORM.语速控件.MAX=10
         THISFORM.语速控件.value=0
     ENDPROC

     PROCEDURE 语速控件.CHANGE
         LOVOICE.RATE=THISFORM.语速控件.value
     ENDPROC

     PROCEDURE 音量控件.INIT
         THISFORM.音量控件.MIN=0
         THISFORM.音量控件.MAX=100
         THISFORM.音量控件.value=100
     ENDPROC

     PROCEDURE 音量控件.CHANGE
         LOVOICE.VOLUME=THISFORM.音量控件.value
     ENDPROC

     PROCEDURE 开始朗读.CLICK
         LOVOICE.SPEAK(THISFORM.朗读内容.value,3) &&(为1\3时在朗读时也响应其他事件)&&有6个选项(0=)
     ENDPROC

     PROCEDURE 停止朗读.CLICK
         LOVOICE.SPEAK('',2)
     ENDPROC

     PROCEDURE 暂停朗读.CLICK
         IF THISFORM.暂停朗读.CAPTION='暂 停 朗 读'
            LOVOICE.PAUSE()               && 暂停
            THISFORM.暂停朗读.CAPTION='继 续 朗 读'
         ELSE
            LOVOICE.RESUME()              && 恢复
            THISFORM.暂停朗读.CAPTION='暂 停 朗 读'
         ENDIF
     ENDPROC

     PROCEDURE 退出程序.CLICK
         THISFORM.RELEASE
     ENDPROC
ENDDEFI



/*
ISpVoice//成员函数
ISpEventSource继承方法 :ISpEventSource的所有方法都可以从该接口访问
SetOutput :设置当前的输出对象。可以使用NULL值来选择默认音频设备。
GetOutputObjectToken :检索当前音频输出对象的对象标记。
GetOutputStream :检索当前输出流的指针。
Pause :将声音暂停在最近的警报边界并关闭输出设备。
Resume : 将输出设备设置为RUN状态并恢复渲染。
SetVoice :设置用于文本合成的声音的身份。默认情况下,ISPVoice将使用“控制面板”中“语音”属性中设置的语音信息。
GetVoice :检索标识文本合成中使用的声音的对象标记。
Speak :说出文本字符串或文件的内容。
SpeakStream :说出流的内容。
GetStatus :检索与此ISpVoice实例关联的当前呈现和事件状态。
Skip :导致语音向前或向后跳过当前通话文本内的指定数量的项目。
SetPriority :设置语音的优先级。正常,警报,结束。
GetPriority :检索当前语音优先级。
SetAlertBoundary :指定哪个事件应该用作警报的插入点。
GetAlertBoundary :检索当前正用作警报插入点的事件。
SetRate :实时设置文本渲染速率调整。
GetRate :检索当前文本渲染速率调整。
SetVolume :实时设定合成器的输出音量。
GetVolume :检索合成器的当前输出音量。
WaitUntilDone :阻止呼叫者,直到语音完成说话或指定的时间间隔过去了。
SetSyncSpeakTimeout :设置以毫秒为单位的超时时间间隔,此语音同步Speak和SpeakStream调用此超时。
GetSyncSpeakTimeout :检索此ISpVoice实例的同步语音操作的超时间隔。
SpeakCompleteEvent :返回一个事件句柄,当语音完成后,将发出所有待处理的请求信号。
IsUISupported :确定是否支持指定类型的UI。
DisplayUI :显示所请求的UI。
*/

sp = createobject("sapi.spvoice")
spfs = CREATEOBJECT("Sapi.SpFileStream")
spfs.Open("d:\abc.wav", 3, .f.)
sp.AudioOutputStream = spfs
sp.Speak("hello word", 1)
sp.WaitUntilDone(-1)
spfs.Close


&&=== tts word2wav
         xx=NEWOBJECT("Sapi.SpVoice")
         mfs=NEWOBJECT("SAPI.SpFileStream")
         mfs.Format.Type = 4
         mfs.Open(this.wavfile,3,0)
       *   Set the .wav file stream as the output for the Voice object
         xx.AudioOutputStream = mfs
         xx.Rate =  10
         xx.Volume =  99
         xx.Speak("hello word",0)
         wait 'a moment!'  
         mfs.Close
         release xx
收到的鲜花
  • sam_jiang2023-01-18 12:08 送鲜花  1朵  
2023-01-17 16:33
kangss
Rank: 4
等 级:贵宾
威 望:10
帖 子:138
专家分:237
注 册:2014-6-12
得分:0 
...

[此贴子已经被作者于2023-1-17 16:44编辑过]

2023-01-17 16:36
igaoyuan
Rank: 2
等 级:论坛游民
帖 子:84
专家分:49
注 册:2022-12-19
得分:0 
回复 15楼 kangss
太好了!感谢感谢!看到有相关更换语音的选项参数
2023-01-17 17:08



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




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

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