VB基于Speech SDK的语音信号识别
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计
(说明书)
基于Speech SDK的语音信号识别
班级 / 学号 *
学生姓名 *
指导教师 *
课程设计任务书
课程名称综合课程设计
院(系)电*院专业电*程
班级* 学号* 姓名*
课程设计题目基于Speech SDK的语音信号识别
课程设计时间: 20* 日
课程设计的内容及要求:
一、设计说明
语音识别研究在国内外已经有了很多年的发展历史,特别是在近些年,随着实验室条件下语音识别的飞速发展,语音识别的应用已经离我们越来越近。
语音识别作为一种重要的信息识别方式在金融、人机交互、电信等领域有着极大的应用空间。
课程设计基本要求
①学会Speech SDK 的使用,掌握其语音识别工具包的设计方法。
②掌握在Windows 环境下语音信号采集的方法。
③掌握语音信号识别的基本概念、基本理论和基本方法。
④掌握语音信号识别经典算法。
⑤学会用Speech SDK对信号进行识别。
三、实验要求
1.根据设计要求制定方案;
2.进行语音测试数据的分析。
四、推荐参考资料
[1] 李禹才, 左友东, 郑秀清等. 基于Speech SDK 的语音控制应用程序的设计
与实现[J].计算机应用, 2004
[2]易克初,田斌,付强编著 .语音信号处理 .北京:国防工业出版社,2000
[3]胡航编著.语音信号处理.哈尔滨:哈尔滨工业大学出版社, 2000
[4]蔡莲红,黄德智,蔡锐.现代语音技术基础与应用[M].清华大学出版社,2003.
五、按照要求撰写课程设计报告
指导教师2011 年12 月19 日
负责教师年月日
学生签字2011 年12 月19 日
成绩评定表
目录
一、概述 (5)
1. 分类 (5)
2. 语音信号处理 (5)
3. Microsoft Speech SDK简介 (7)
二、方案论证 (8)
三、程序设计 (10)
1. 窗口载入及初始化子程序 (10)
2. 语音命令子程序 (11)
3. 听写子程序 (11)
4. 朗读子程序 (12)
5. 预处理及语法规则 (13)
四、性能测试 (14)
1.程序界面载入测试 (14)
2.孤立词识别测试 (14)
3.听写模式测试 (16)
五、结论 (16)
六、课设体会及合理化建议 (17)
附录 I 源程序 (18)
附录Ⅱ语法规则 (21)
一、概述
语音识别研究在国内外已经有了很多年的发展历史,特别是在近些年,随着实验室条件下语音识别的飞速发展,语音识别的应用已经离我们越来越近。
语音识别作为一种重要的信息识别方式在金融、人机交互、电信等领域有着极大的应用空间。
近二十年来,语音识别技术取得显著进步,开始从实验室走向市场。
语音识别是一门交叉学科,语音识别技术所涉及的领域包括:信号处理、模式识别、概率论和信息论、发声机理和听觉机理、人工智能等等。
1.分类
根据识别的对象不同,语音识别任务大体可分为3类,即孤立词识别(isolated word recognition),关键词识别(或称关键词检出,keyword spotting)和连续语音识别。
其中,孤立词识别的任务是识别事先已知的孤立的词,如“开机”、“关机”等;连续语音识别的任务则是识别任意的连续语音,如一个句子或一段话;连续语音流中的关键词检测针对的是连续语音,但它并不识别全部文字,而只是检测已知的若干关键词在何处出现,如在一段话中检测“计算机”、“世界”这两个词。
根据针对的发音人,可以把语音识别技术分为特定人语音识别和非特定人语音识别,前者只能识别一个或几个人的语音,而后者则可以被任何人使用。
非特定人语音识别系统实际运用更多,但它要比针对特定人的识别困难得多。
语音识别的应用领域非常广泛,常见的应用系统有:语音输入系统,语音控制系统,智能对话查询系统,等等。
2.语音信号处理
语音识别方法主要是模式匹配法。
在训练阶段,用户将词汇表中的每一个词依次说一遍,并且将其特征矢量作为模板存入模板库。
在识别阶段,将输入语音的特征矢量依次与模板库中的每个模板进行相似度比较,将相似度最高者作为识别结果输出。
前端处理是指在特征提取之前,先对原始语音进行处理,部分消除噪声和不同说话人带来的影响,使处理后的信号更能反映语音的本质特征。
最常用的前端处理有端点检测和语音增强。
端点检测是指在语音信号中将语音和非语音信号时段区分开来,准确地确定出语音信号的起始点。
经过端点检测后,后续处理就可以只对语音信号进行,这对提高模型的精确度和识别正确率有重要作用。
语音增强的主要任务就是消除环境噪声对语音的影响。
目前通用的方法是采用维纳滤波,该方法在噪声较大的情况下效
果好于其它滤波器。
声学特征的提取与选择是语音识别的一个重要环节。
声学特征的提取既是一个信息大幅度压缩的过程,也是一个信号解卷过程,目的是使模式划分器能更好地划分。
由于语音信号的时变特性,特征提取必须在一小段语音信号上进行,也即进行短时分析。
这一段被认为是平稳的分析区间称之为帧,帧与帧之间的偏移通常取帧长的1/2或1/3。
通常要对信号进行预加重以提升高频,对信号加窗以避免短时语音段边缘的影响。
对语音信号进行数字信号处理常用的算法有:
1. 线性预测系数LPC:线性预测分析从人的发声机理入手,通过对声道的短管级联模型的研究,认为系统的传递函数符合全极点数字滤波器的形式,从而n 时刻的信号可以用前若干时刻的信号的线性组合来估计。
通过使实际语音的采样值和线性预测采样值之间达到均方差最小LMS,即可得到线性预测系数LPC。
对 LPC的计算方法有自相关法、协方差法、格型法等。
计算上的快速有效保证了这一声学特征的广泛使用。
2.倒谱系数CEP:利用同态处理方法,对语音信号求离散傅立叶变换DFT后取对数,再求反变换(IDFT)就可得到倒谱系数。
对LPC倒谱,在获得滤波器的线性预测系数后,可以用一个递推公式计算得出。
实验表明,使用倒谱可以提高特征参数的稳定性。
3.Mel倒谱系数MFCC和感知线性预测PLP:Mel倒谱系数MFCC和感知线性预测 PLP是受人的听觉系统研究成果推动而导出的声学特征。
当两个频率相近的音调同时发出时,人只能听到一个音调。
临界带宽指的就是这样一种令人的主观感觉发生突变的带宽边界,当两个音调的频率差小于临界带宽时,人就会把两个音调听成一个,这称之为屏蔽效应。
Mel刻度是对这一临界带宽的度量方法之一。
首先用FFT将时域信号转化成频域,之后对其对数能量谱用依照Mel刻度分布的三角滤波器组进行卷积,最后对各个滤波器的输出构成的向量进行离散余弦变换DCT,取前N个系数。
PLP 仍用自相关法去计算LPC参数,但在计算自相关参数时用的也是对听觉激励的对数能量谱进行DCT的方法。
语音识别系统的模型通常由声学模型和语言模型两部分组成,分别对应于语音到音节概率的计算和音节到字概率的计算。
声学建模:马尔可夫模型的概念是一个离散时域有限状态自动机,隐马尔可夫模型HMM是指这一马尔可夫模型的内部状态外界不可见,外界只能看到各个时刻的输出值。
对语音识别系统,输出值通常就是从各个帧计算而得的声学特征。
HMM的打分、解码和训练相应的算法是前向算法、
Viterbi算法和前向后向算法。
上下文相关建模:协同发音,指的是一个音受前后相邻音的影响而发生变化,从发声机理上看就是人的发声器官在一个音转向另一个音时其特性只能渐变,从而使得后一个音的频谱与其他条件下的频谱产生差异。
上下文相关建模方法在建模时考虑了这一影响,从而使模型能更准确地描述语音,只考虑前一音的影响的称为Bi- Phone,考虑前一音和后一音的影响的称为Tri-Phone。
语言模型主要分为规则模型和统计模型两种。
统计语言模型是用概率统计的方法来揭示语言单位内在的统计规律,其中N-Gram简单有效,被广泛使用。
语言模型的性能通常用交叉熵和复杂度(Perplexity)来衡量。
交叉熵的意义是用该模型对文本识别的难度,或者从压缩的角度来看,每个词平均要用几个位来编码。
复杂度的意义是用该模型表示这一文本平均的分支数,其倒数可视为每个词的平均概率。
平滑是指对没观察到的N元组合赋予一个概率值,以保证词序列总能通过语言模型得到一个概率。
语音识别系统选择识别基元的要求是,有准确的定义,能得到足够数据进行训练,具有一般性。
英语通常采用上下文相关的音素建模,汉语的协同发音不如英语严重,可以采用音节建模。
系统所需的训练数据大小与模型复杂度有关。
模型设计得过于复杂以至于超出了所提供的训练数据的能力,会使得性能急剧下降。
以上介绍了实现语音信号识别的各个方面的技术。
这些技术在实际使用中达到了较好的效果,但如何克服影响语音的各种因素还需要更深入地分析。
目前听写机系统还不能完全实用化以取代键盘的输入,但识别技术的成熟同时推动了更高层次的语音理解技术的研究。
由于英语与汉语有着不同的特点,针对英语提出的技术在汉语中如何使用也是一个重要的研究课题,而四声等汉语本身特有的问题也有待解决。
3.Microsoft Speech SDK简介
目前,微软、IBM等公司都相继推出了它们基于PC的语音识别产品。
其中,微软Speech SDK完全支持简体中文语音系统的开发,是开发语音软件的一个理想工具。
它是基于COM标准开发的,底层协议以COM组件的形式完全独立于应用程序层,为应用程序设计人员屏蔽了复杂的语音技术,充分体现了COM的技术优点。
语音识别由识别引擎(Recognition Engine)管理,能实现从语音中识别出汉字;语音合成由语音合成引擎(TTS Engine)负责,实现语音朗读。
程序员只需专注于自己的应用,调用相关的语音应用程序接口(SAPI)来实
现语音功能,该语音框架主要靠SAPI运行来实现应用程序与语音引擎之间的协作,而SAPI提供各种接口来实现不同的语音功能,如识别、朗读、训练等。
(1) 语音识别引擎(ISpRecognizer)接口:用于创建语音识别引擎的实
例。
语音识别引擎对象有两种:独占( InProcRecognizer)的引擎和共享(SharedRecognizer)的引擎。
独占的引擎对象只能由创建的应用程序使用,而共享的引擎可以供多个应用程序共同使用。
(2) 语音识别上下文(ISpRecoContext)接口:主要用于发送和接收与
语音识别相关的消息通知,创建语法规则对象。
(3) 语法规则(ISpRecoGrammar)接口:定义引擎需要识别的具体内容,
用于创建、载入和激活识别用的语法规则。
而语法规则定义了期望识别的单词、短语和句子,通常有两种语法规则:听写语法(Dictation Grammer)和命令控制语法(Command and Control Grammer)。
命令控制语法主要用于识别用户在语法文件里自定义的一些特定的命令词汇和句子,这些语法规则以XML文件的格式编写,通过(ISpRecoGrammar)接口载入,并激活。
(4) 识别结果(ISpPhrase)接口:用于获取识别的结果,包括识别的文
字,识别的语法规则等。
(5) 语音合成(ISpVoice)接口:主要功能是通过访问TTS引擎实现文
本到语音的转换,从而使电脑会说话。
微软在office和vista中都应用了自己开发的语音识别引擎,微软语音识别引擎的使用是完全免费的,所以产生了许多基于微软语音识别引擎开发的语音识别应用软件,例如《语音游戏大师》《语音控制专家》《芝麻开门》《警卫语音识别系统》等等软件。
下面将通过一个例子,介绍如何用Speech SDK 创建语音识别程序。
二、方案论证
Microsoft Speech SDK 中包含着一系列支持COM(组件对象模型)组件的语音自动控制接口,只要具备支持OLE(对象连接与嵌入)自动控制的通用语言就可实现该类语音识别应用程序的开发。
因此在VB 环境下实现语音识别程序的开发就变得十分简单。
在Visual Basic 环境下,利用事件驱动的编程机制、易用的可视化设计工具,使用Windows 内部的广泛应用程序接口(API)函数,以用动态链接库(DLL)、对象的链接与对象连接与嵌入(OLE)、开放式数据连接(ODBC)等技术,可以高效、快速地开发Windows 环境下功能强大、图形界面丰富的应用软件。
Microsoft Speech SDK 的语音应用程序接口结构如图2.1所示:
图2.1 Microsoft Speech SDK 结构
该语音程序框架主要靠SAPI 运行来实现应用程序与语音引擎之间的协作,而SAPI 提供各种接口来实现不同的语音功能,如识别、朗读、训练等。
根据Microsoft Speech SDK 的上述特征及其COM 接口特征,设计语音识别程序的结构框图如图2.2
图2.2 语音识别程序框图
如程序框图2.2所示,可将程序划分为四个子程序:窗口载入及初始化、语音命令子程序、听写子程序、朗读子程序。
程序以SAPI对语音信号的采集和识别为中心,通过COM组件的对外接口与SAPI相连接,接受Speech SDK对语音信号的处理结果。
程序通过四个子程序对接收到的处理结果进行加工处理以实现用户需求。
三、程序设计
根据程序框图所示,将程序设计为四个子程序:窗口载入及初始化、语音命令子程序、听写子程序、朗读子程序。
下面对四个子程序进行具体设计实现。
1.窗口载入及初始化子程序
窗口载入及初始化子程序的任务是,打开程序窗口并完成对程序的初始化。
程序的初始化包括创建一个语音识别引擎的实例和定义一些参数等。
设计窗口载入及初始化子程序的程序框图如图3.1所示:
图3.1 窗口载入及初始化子程序框图
编写程序时,载入窗口命令为:Private Sub Form1_Load( ) Handles MyBase.Load
然后使用命令RC = New SpSharedRecoContext创建语音识别引擎实例。
创建语法规则,并导入语法规则词汇表的命令为:
myGrammar = RC.CreateGrammar()
myGrammar.CmdLoadFromFile("sol.xml",SLOStatic)
myGrammar.CmdSetRuleIdState(0, SpeechRuleState.SGDSActive)
2.语音命令子程序
语音命令子程序的任务是将收到的语音内容与语法规则中的内容进行对比,查找出语法规则中包含的命令,并执行相应的命令。
其框图设计如图3.2所示:
图3.2 语音命令子程序框图
根据命令子程序框图的设计,设计程序用if 语句判断用户是否选择了命令模式,例如:If i = True Then
当收到的语音信号是语法规则词汇表中的词时,使用select case 语句调用相应程序,执行相应的命令。
3.听写子程序
听写子程序的任务是将收到的语音内容转换为文本内容,达到使用语音输入文本的目的。
其框图设计如图3.3所示:
图3.3 听写子程序框图
由听写子程序框图设计:判断用户是否选择了听写模式,采用同命令子程序中一样的方法,也用if 语局。
当选择了听写模式后,使用Text=Result.PhraseInfo.GetText命令,将语音信号转换为文本内容输入文本框。
4.朗读子程序
听写子程序的任务是将文本框中的内容转换为语音内容读出。
其框图设计如图3.4所示:
图3.4 朗读子程序框图
编写朗读子程序时,首先使用“strData = StrConv(TextBox1.Text, VbStrConv.SimplifiedChinese, 2052)”语句,将文本转换为语音信号。
然后使用“RC.Voice.Speak(strData)”语句,播放语音内容。
这样一个TTS子程序便完成了。
5.预处理及语法规则
用于实现程序功能的四个子程序如上所述,设计完成。
此外除了上述四个子程序外,还要在程序开始处加上一段全局变量声明语句,并编写一个.XML语法规则项才能完成程序设计。
程序开始处的变量声明有:程序库引用(Imports SpeechLib)、语音事件声明(Public WithEvents RC As SpSharedRecoContext)、语法变量声明(Public myGrammar, b As ISpeechRecoGrammar)、其他全局变量声明(Dim i, j As Boolean)等。
建立语法规则,即用户词汇表。
用户词汇表即用户对语音识别程序所说命令的内容,用户对语音识别程序所说的词或词组所组成的集合便构成用户词汇表。
用户对语音识别程序的控制只能通过用户词汇表中词或词组来实现,用户词汇表中的内容将会与语音识别程序中的相关命令对应而最终转化为可供应用程序执行的控制命令。
用户词汇表中的内容也是用户在进行音频信息输入命令时唯一可被输入的信息,音频输入命令信息的内容必须在词汇表所覆盖的内容范围之内,一旦其超出词汇表范围,应用程序将无法识别。
另外,词汇表中的具体词或词组的内容一般与其所要实现的控制命令相对应,如在词汇表中定义“stop”这个词时,一般是要实现关闭程序的命令,当用户向应用程序说出“stop”时,应用程序便可执行关闭命令。
现编写语法规则.XML文件内容如下:
<GRAMMAR LANGID="409">
<DEFINE>
<ID NAME="RID_NewGame" VAL="101"/>
</DEFINE>
<RULE NAME="newgame" ID="RID_NewGame" TOPLEVEL="ACTIVE">
<L>
<P>开始</P>
<P>上网</P>
<P>结束</P>
<P>暂停</P>
</L>
</RULE>
</GRAMMAR>
综上所述,子程序设计完毕。
接着就可编写语音识别程序,首先在VB
中创建一个项目,并为项目建立一个windows窗口,再在窗口中添加一些控件。
然后将上述的各子程序和语法规则编写完成,程序大体上便编辑完成了。
然后在引用项中为项目添加Microsoft Speech Object Library,最后编译项目,产生可执行.exe文件,这样一个语音识别程序便编写完成了。
四、性能测试
程序编写完成后,还需要测试该应用程序,以判断其是否符合设计要求,达到用户需求,以及实现效果是否良好。
1.程序界面载入测试
首先载入窗口。
载入时程序会用语音报告"now system started",载入后窗口界面如图4.1所示:
图4.1 界面载入测试
如上图所示,窗口载入成功,界面符合设计,包含了一个文本框用于与用户进行交互,一组二选一按钮用于选择语音识别模式,一个命令按钮用于下达朗读命令。
2.孤立词识别测试
下面进行程序的孤立词识别性能测试,首先按照窗口界面上的提示,选择语音识别模式为命令模式(选择cmd),然后对麦克风说出命令信息,该语音识别程序即可执行相关操作来实现用户的预定义要求。
如当发出“网络”命令后,打开网络,如图4.2所示:
图4.2 命令模式示例
在本语音识别程序的命令模式中还可执行其他一些用户命令,如暂停、结束、打开播放器等。
由于语音信号自身就有难识别,模糊性强,噪音干扰大等特点,再有语音识别技术还不是十分完善,所以语音识别存在不小的错误率。
现在对该语音识别程序的识别性能进行测试,检测其对语音输入的孤立词识别错误率如何。
首先对程序进行一些修改,以方便进行测试:程序在接到语音信号后,会将收到的信号转换为文本信息在文本框中显示;语法规则词汇表设为包含:金、木、水、火、土、乾、坤、坎、泽、开始、暂停、网络等12个词,以方便测试;并且识别收到的信息是孤立词后,将不再执行相应的命令。
测试效果如图4.3所示:
图4.3 命令模式测试效果
在上图中,一共输入了57个孤立词,其中程序正确识别了57个,错误9个。
按照示例所述,再进行行了2次测试。
测试结果如表4.1所示: 02040
6080100东部西部北部
输入词数 正确识别数
正确率 测试一 57 48 84.2% 测试二 63 51 81.0% 测试三 59 47 79.7% 总和
179
146
81.6%
表4.1 孤立词测试结果
由上表可得:总共输入词179个,其中146个被程序准确识别,该语音识别程序对孤立词识别的准确率为81.6%,识别率偏低但基本符合程序设计要求。
3.
听写模式测试
接着选择听写模式(选择write ),在此模式下,用户所说的话将会转换为文本显示在文本框中,实现听写要求。
如图4.4所示:
图4.4 听写模式示例
在听写模式下语音识别的准确率比命令模式更小,错误跟多,所以语音识别现在还更适合用于输入固定此表中的内容,而不太适合用于听写输入。
在听写完成后,可点击read 按钮,程序便会将文本框中的内容朗读出来。
综上,该语音识别程序能够正常运行,且性能满足设计要求,能够实现语音识别功能。
五、 结论
使用VB ,运用Microsoft Speech SDK 开发语音识别程序同开发一般应用程序
一样具有简单易用,开发周期短,出错率低,程序可读性强等诸多优点。
然而其缺点也是很明显的,这主要表现在VB 语言自身的缺点上,如VB不是真正的面向对象编程语言,没有自己的类库,和系统打交道难,程序员对资源的分配所能做的很有限,不支持指针,将太多的东西“隐蔽”起来,不能知道程序的真正工作流程等等。
此外,VB 缺乏工程支持,难以实现大型工程的开发。
但VB 有易学易用、开发方便,应用范围广,使用人数多等优势,也十分有利于语音识别应用程序的进一步发展和推广。
在以上实例中只用到简单的语音识别同应用程序的接口间的操作,而VB 语言同语音识别引擎的良好接口的强大功能在此时并未真正体现出来,在此基础上开发出更多更实用的用语音识别应用程序,甚至是用语音识别控制计算机硬件的应用程序都是不难实现的。
六、课设体会及合理化建议
通过此次课程设计,我学习到了VB编程的基础知识,VB2010的使用发法,还用Microsoft Speech SDK的运用,我学到的这些知识使我受益颇多,也必将有益于我今后的学习、工作。
在为课设学习各种知识的过程中,我不仅加深了对以往知识的认识,还还学到了新的学习方法、研究方法。
并且在学习开发语音识别程序的过程中,我还认识到,程序开发工作只有在实践中才能摸索出更多先进的技术手段来为开发程序服务。
通过利用先进完善的技术可以缩短应用程序的开发周期, 同时提高程序的可扩展性和可维护性。
同时在课设过程中需要学习各种新的、陌生的知识,学习量很大,内容很庞杂,所以学习中不仅离不了先进检索方法的支持,同时也离不开老师的指导和帮助,所以十分感谢课设指导老师*老师的指导帮助。
参考文献
[1] 李书琴等主编. Visual Basic程序设计基础. [M]北京:清华大学出版社,2006年
[2] Bill Evjen等编著. 高级编程. [M]北京:清华大学出版社,2005年
[3] 李禹才, 左友东, 郑秀清等. 基于Speech SDK 的语音控制应用程序的设计
与实现[J].计算机应用, 2004
[4]易克初,田斌,付强编著 .语音信号处理 .北京:国防工业出版社,2000
[5]赵力著.语音信号处理.北京:机械工业大学出版社, 2007
[6]蔡莲红,黄德智,蔡锐.现代语音技术基础与应用[M].清华大学出版社,2003.
附录 I 源程序
Option Explicit On
Imports SpeechLib
Public Class Form1
Public WithEvents RC As SpSharedRecoContext
Dim Recognizer As SpInprocRecognizer
Public myGrammar, b As ISpeechRecoGrammar
Dim i, j As Boolean
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
RC = New SpSharedRecoContext
Dim SharedRecognizer As SpSharedRecognizer
SharedRecognizer = CreateObject("SAPI.SpSharedRecognizer")
myGrammar = RC.CreateGrammar()
Call myGrammar.CmdLoadFromFile("sol.xml", 0)
myGrammar.CmdSetRuleIdState(0, SpeechRuleState.SGDSActive)
RC.Voice.Speak("now system started")
End Sub
Private Sub RC_FalseRecognition(ByVal StreamNumber As Long, ByVal StreamPosition As Object, ByVal Result As SpeechLib.ISpeechRecoResult) TextBox1.Text = "(no recognition)"
End Sub
Private Sub RC_Recognition(ByVal StreamNumber As Long, ByVal StreamPosition As Object, ByVal Result As SpeechLib.ISpeechRecoResult) If i = True Then
TextBox1.Text = Result.PhraseInfo.GetText
RC.Voice.Speak("now i'am listening your command")
Select Case Result.PhraseInfo.GetText。