TTS语音如何停止及异步?SAPI.SpVoic 停止播放和异步播放的办法

71 篇文章 6 订阅

SAPI.SpVoic微软的这个组件非常强大,但是网上中文资料十分少,遇到的问题只能靠自己摸索,一个个坑自己填。

比如我就遇到语音播放异步的问题,正常都是播放完了才能继续下面的代码,而这个却不行,网上搜索到的代码是speak方法后面加个1就可以,但是我使用了就是不行,后来调查发现是没有声明变量导致的。

CreateObject("SAPI.SpVoice").speak "你好",1  '错误的异步使用方式

上面这样写是不可以的,问题现象是直接没声音了。原理很简单,这个是临时创建的,如果是异步的话运行下一行代码这个就结束了,创建的临时变量随即释放,当然声音也没了。必须要修改为下面的:

Dim objSpeech As Object
objSpeech.speak "你好", 1

也就是必须要声明,执行下一行代码后这个变量还是存在的。

不过这里有另外一个问题,也就是停止播放的问题,为什么需要停止播放呢?因为有的时候我们在当前播放一句话的时候需要改播放新的信息,然而由于之前的没播放完,那么程序只能等待之前的播放完才行,这样就造成了系统有点卡,而且体验很不好。我之前做的办法是将对象释放,一释放世界就立马安静了。

'停止当前播放,不推荐
If objSpeech.Status.runningState = 2 Then '如果当前正在播放,那么就销毁之前的对象然后重建
    Set objSpeech = Nothing
    Set objSpeech = CreateObject("SAPI.SpVoice")
End If

释放后立马再创建,这样保证下面的代码能正常调用。

可是后来在网上看到一个帖子,他不是这样干的,而是用的下面代码:

'停止当前播放,推荐
If objSpeech.Status.runningState = 2 Then '如果当前正在播放,那么就播放一个空字符串,并且使用挂断之前的模式
    objSpeech.Speak "", 2
End If

确实也可以达到效果,再看看我之前的方法,比他这方法差多了,我那方法消耗系统资源比较大,甚至在对象创建与销毁的时候我觉得软件有那么一点点的小卡顿一下。所以推荐大家用上面的代码。

关于vb调用发声代码,我写了个方便调用的函数:

Public objSpeech As Object

'发声函数 sysdzw整理
Public Sub playContent(ByVal str1$)
    If objSpeech.Status.runningState = 2 Then '如果当前正在播放,那么就播放一个空字符串,并且使用挂断之前的模式
        objSpeech.Speak "", 2
    End If
    objSpeech.Speak str1, 1
End Sub

附上一张spvoice的类成员图:

可以看到SAPI还有很多其他的类,而一个spvoice就够我们研究的了,真是太强大了。虽然中文文档不全,但是好在微软的变量命名十分规范,根据名字基本就能猜出意思,上面那个判断是否是播放状态我就是根据变量名猜想加验证实现的。

再看下speak的第二个参数的情况,它是一个枚举类型,有很多值。我们可以看到上面代码中第二参数的1和2分别是什么意思,根据变量名几乎是一目了然,学计算机还是需要一点英文基础的呀。

Const SVSFlagsAsync = 1 '异步

Const SVSFPurgeBeforeSpeak = 2 '挂起之前播放

sapi.spvoice是Windows操作系统中的一个语音合成技术,它可以通过人工智能算法将文本转化为声音,并通过电脑的音频输出设备播放出来。 sapi.spvoice的使用非常简单。首先,我们需要通过COM接口获取sapi.SpVoice对象。然后,我们可以调用该对象的相关方法和属性来实现我们想要的功能。 通过sapi.spvoice,我们可以将文本合成为语音。可以使用Speak方法来实现这一功能,例如: ```python import win32com.client # 获取sapi.SpVoice对象 voice = win32com.client.Dispatch("SAPI.SpVoice") # 将文本合成为语音播放 text = "你好,欢迎使用sapi.spvoice技术" voice.Speak(text) ``` 此外,sapi.spvoice还支持一些其他的功能。我们可以通过设置voice对象的属性来实现特定的效果,例如设置语速和音量: ```python # 设置语速和音量 voice.Rate = 1 # 语速,范围从-10到10,默认为0 voice.Volume = 100 # 音量,范围从0到100,默认为100 # 合成为语音播放 text = "你好,欢迎使用sapi.spvoice技术" voice.Speak(text) ``` 除了上述的基本功能之外,sapi.spvoice还支持其他一些高级的功能,例如选择不同的音频输出设备、选择不同的语音合成引擎等等。具体的使用方法可以参考相关的文档或者教程。 总的来说,sapi.spvoice是Windows平台上实现文本合成语音的技术之一,通过简单的调用相关的方法和属性,我们可以实现将文本转化为声音并播放的功能。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无·法

别打赏了,这C币又不能买咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值