对比十二年前的vb代码,发现了点有意思的东西

简介: 对比十二年前的vb代码,发现了点有意思的东西

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的类成员图:

image.png

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

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

Const SVSFlagsAsync = 1 '异步

Const SVSFPurgeBeforeSpeak = 2 '挂起之前播放

image.png


sysdzw
+关注
目录
打赏
0
0
0
0
2
分享
相关文章
从初学者到专家:掌握VB语言的10个技巧
【4月更文挑战第27天】本文介绍了10个关键技巧和最佳实践,助力Visual Basic初学者进阶为专家。包括理解基础概念与语法、精通事件驱动编程、面向对象编程、数据访问技术、异常处理、使用集合和泛型、代码性能优化、版本控制与团队协作、持续学习新特性和技术,以及通过实践提升技能。成为VB专家不仅需掌握语法,更在于解决问题和适应技术发展。
182 0
|
10月前
|
【C++航海王:追寻罗杰的编程之路】stack
【C++航海王:追寻罗杰的编程之路】stack
41 0
C语言实现三子棋,可拓展为n子棋的版本
C语言实现三子棋,可拓展为n子棋的版本
宝刀未老?VB语言迎来春天,低代码绝地逢生,程序员能淡定吗?
宝刀未老?VB语言迎来春天,低代码绝地逢生,程序员能淡定吗?
121 0
vb知识点查漏补缺
vb知识点查漏补缺
185 0
C语言程序设计教程任务;初步认识C语言,携君之手,步入编程之路。
C语言程序设计教程任务;初步认识C语言,携君之手,步入编程之路。
139 0
C语言程序设计教程任务;初步认识C语言,携君之手,步入编程之路。
计算机高职专业VB知识要点003 VB基础知识,案例:逐行输出
计算机高职专业VB知识要点003 VB基础知识,案例:逐行输出
141 0
计算机高职专业VB知识要点003 VB基础知识,案例:逐行输出
进阶C语言之路,携君之手,步入程序大堂
进阶C语言之路,携君之手,步入程序大堂
91 0
High&NewTech:新物种?这是一种不需要写代码的程序猿,这事,得从Ta们掌握了 iVX工具(首个无代码编程语言)说起……
High&NewTech:新物种?这是一种不需要写代码的程序猿,这事,得从Ta们掌握了 iVX工具(首个无代码编程语言)说起……
High&NewTech:新物种?这是一种不需要写代码的程序猿,这事,得从Ta们掌握了 iVX工具(首个无代码编程语言)说起……