摘要:语音识别技术的发展和广泛应用,使用户与计算机的对话方式不再仅仅局限在使用键盘或鼠标发送指令的方式。本文在visual basic 编程环境下使用Microsoft Speech SDK中的语音接口实现对计算机的语音控制。
关键字:Microsoft Speech SDK;语音识别;VB6.0
1 引言
随着计算机技术的飞速发展,用户与计算机对话的方式由机器语言指令,到图形用户界面,现发展到自然和谐的对话方式。其中语音交互则是其中的一个重要内容。
语音识别技术,也被称为自动语音识别(英语:Automatic Speech Recognition, ASR),其目标是将人类的语音中的词汇内容转换为计算机可读的输入,例如按键、二进制编码或者字符序列。与说话人识别及说话人确认不同,后者尝试识别或确认发出语音的说话人而非其中所包含的词汇内容。根据识别的对象不同,语音识别任务大体可分为3类,即孤立词识别(isolated word recognition),关键词识别(或称关键词检出,keyword spotting)和连续语音识别。语音识别语法规则分为两种:听说式(Dictation)和命令式(Command And Control C&C)。本文介绍应用程序使用的是命令式。
2 语音识别程序开发方法
2.1开发工具
下载speech SDK 安装包:微软公司为语音识别提供了开发包(Microsoft speech SDK),此开发包包含了语音识别和语音合成引擎两部分,应用程序通过SAPI来进行语音识别和文本——语音转换。
执行安装:将下载下的文件解压并执行安装。
环境配置:创建VB工程,并引用Microsoft Speech Object Library类库。引用步骤为:在VB开发环境中,选择"工程"/"引用"命令,在"引用"对话框中选中Microsoft Speech Object Library复选框,如图2.1所示,单击"确定"按钮添加。
2.2语法规则的编写
语法规则是一个符号xml规则的文本文件,将计算机需要识别的命令列在该文件中,这个文件可以预先定义,也可以用代码动态生成,在这个程序中该文件是预先定义的。该语法规则如下:
<GRAMMAR LANGID="804">
<RULE TOPLEVEL="ACTIVE" Name="number" ID="1">
<L PROPNAME="number">
<P VAL="1">命令提示符</P>
<P VAL="2">记事本</P>
<P VAL="3">录音机</P>
<P VAL="5">音量</P>
<P VAL="6">开始</P>
<P VAL="7">你好</P>
</L></RULE> </GRAMMAR>
此语法可用记事本编写。为更快速,准确写好语法规则,可选用适当的编写工具,比如Hbuilder。语句<GRAMMAR LANGID="804">中的编号804为中文识别引擎使用编号。若要使用英文识别,则应使用编号809.在<p></p>之间为本程序中计算机识别的词汇。输入完毕保存为.xml文件即可。
2.3 程序实现
程序运行效果图如图2.2。
对着麦克风说“开始”,语音识别程序即做出响应,弹出对话框“执行开始程序”,并显示“开始”程序。对麦克风说“音量”,语音识别程序即做出响应,调出操作系统自带的“音量”程序……。通过语音控制调用“音量”程序的运行结果如图2.3所示。
在工程中的默认窗体Form1上添加一个TextBox控件,命名为Txt_Show,其MultiLine属性为TRUE。
制作语音识别程序首先需要创建语音识别的语法环境,然后再该环境中创建用于语音识别的语法对象并加载该语法对象所需的语音识别规则,最后**语音识别对象。
**语音识别对象后,语音识别对象的识别事件可以对计算机用户发出的声音做出响应,判断用户发出的命令并执行相应的操作。
(1)创建语音识别的语法环境。
使用Set语句创建SpSharedRecoContext类型对象,SpSharedRecoContext类型在SpeechLib命名空间内。创建代码如下:
Set RecoContext = New SpSharedRecoContext
(2)创建语音识别的语法对象。
创建语音识别语法对象通过使用SpSharedRecoContext类型对象的CreateGrammar()方法实现,代码如下:
Set Grammar = RecoContext.CreateGrammar(0)
说明:上面代码中的参数1用于指定语法ID。语法ID可以识别每个语法对象。尽管每个语法对象只能有一个标识符,但语法ID设置值仍然可以是不唯一的,其默认值是0。CreateGrammar()方法返回的类型为ISpeechRecoGrammar。
(3)加载语音识别规则。
进行语音识别需要加载语音识别规则,本程序使用预定义的语法规则。
Grammar.CmdLoadFormFile “G:\project\VB\sol.xml”,SLODynamic
(4)**语音识别对象
**语音识别对象通过使用ISpeechRecoGrammar类型对象的CmdSetRuleIDState()方法将语音规则状态设置为SGDSActive实现。代码如下:
Grammar. CmdSetRuleIDState 0,SGDSActive
(5)通过语音识别控制计算机。通过对语音指令的判断,执行相应的操作,代码如下:
Private Sub RecoContext_Recognition(ByVal StreamNumber As Long, _
ByVal StreamPosition As Variant, _
ByVal RecognitionType As SpeechAudioFormatType, _
ByVal Result As ISpeechRecoResult _)
Dim strText As String
strText = Result.PhraseInfo.GetText(0, -1, True)
Text1.Text = strText
If strText = "命令提示符" Then
Shell "cmd", vbNormalFocus
ElseIf strText = "记事本" Then
Shell "notepad.exe", vbNormalFocus
ElseIf strText = "录音机" Then
Shell "sndrec32.exe", vbNormalFocus
ElseIf strText = "音量" Then
Shell "SndVol.exe", vbNormalFocus
ElseIf strText = "开始" Then
MsgBox "执行开始程序"
ElseIf strText = "你好" Then
MsgBox "你好,很高兴见到你"
End If
End Sub
(5)调试和运行应用程序
通过调试运行该应用程序,对着麦克风说出命令xml文档中预定义的命令时程序正确识别后会调出相应的计算机程序。
3 结束语
以上代码在win10+VB6.0环境下调试通过。其他同学使用时也非常容易上手,操作简单,非常有意思。但仍存在如下问题:
- 只能对部分简单的命令做出响应:不能满足个性化需求。
- 语音信息量大:随意说话和认真说话时识别的时间和效率不同。
- 对发出命令者的普通话有要求:普通话说的好的用户,程序响应和识别速度快,普通话不太标准的用户识别效率非常低。
- 环境噪声和干扰对语音识别有严重影响。环境嘈杂时,若不佩戴耳麦,识别效率也是特别低。
4 参考文献
[1]王军,童强.VB6.0环境下的语音识别程序开发方法
[J].河北软件职业技术学院学报,2010(6):35-38.