【老生谈算法】matlab特定人语音识别算法——语音识别算法

基于MATLAB的特定人语音识别算法设计

摘要
在高度发达的社会,语言是一种人类交流最方便的,最速度的信息,在高度发达的社会中,用数字化的方式举行语音的保存、传递、判别、加强和合成等是全部数字化通信过程中最基础、最重要的组成的一部分。由于人类进入信息社会节奏加快, 语音信号处理方面的知识被越来越多的地方需要。

本设计主要在MATLAB平台下先语音信号的端点检测、预处理,然后提取特征参数,建立两个模块,一个为参考模块,一个为测试模块,然后通过动态时间归整技术(DTW)算法进行匹配,算出匹配结果。最后在用户开发界面(GUI界面)直观地呈现出来。
本次设计录制010的数字做为参考库(model),测试库(test)中为需要测试及识别的语音,0的序号为11,19的数字以相应数字做为文件名的命名。

关键词:端点检测; MFCC特征提取;语音识别;DTW算法

1概述
1.1研究的目的和意义
随着计算机技术和科技成果的的飞速发展,人们早已不再满足于让计算机做一些简单的科学计算和运算,而是向它提出了更高的要求,即要求我们的计算机向智能化方向发展,于是人们便开始了第五代计算机(即智能计算机)的研究。计算机人工智能方面的研究内容有很多,诸如计算机知识处理、专家系统、视觉、计算机语音等。其中人机自然语言的接口是一个非常重要的部分。它要求人工智能计算机能说会听,应此要求出现了语音识别和语音合成两门学科。语音识别是人机通信的关键技术之一,也是一种最为理想的人机通信方式。

对于许多应用来说,一个语音识别系统只要一组词汇或命令就能为用户提供一个有效的工具,因此简单有效的特定人语音识别系统就能满足要求。同时特定人语音识别系统具有广阔的应用前景,比如工业命令控制、计算机控制、家庭电器服务、个人移动通信呼叫等,尤其当人手已被占用或无法使用的情况下必须进行声音控制时,更可以起到不可替代的作用,这项技术将给人们的日常生活带来极大的便利。

1.2国内外发展状况
1.2.1国外研究历史及现状
国外的语音识别方面的研究工作可以追溯到20世纪50年代AT&T贝尔实验室的Audry系统,它是第一个可以识别十个英文数字的语音识别系统。
但是真正取得实质性进展,并将其作为一个重要的课题开展研究则是在60年代末70年代初。这首先是因为计算机技术的发展为语音识别的实现提供了硬件和软件的可能,更重要的是语音信号线性预测编码(LPC)技术和动态时间规整(DTW)技术的提出,有效的解决了语音信号的特征提取和不等长匹配问题。

实验室语音识别研究的巨大突破产生于20世纪80年代末:人们终于在实验室突破了大词汇量、连续语音和非特定人这三大障碍,第一次把这三个特性都集成在一个系统中,比较典型的是卡耐基梅隆大学(CarnegieMellonUniversity)的Sphinx系统,它是第一个高性能的非特定人、大词汇量连续语音识别系统。 这一时期,语音识别研究进一步走向深入,其显著特征是隐马尔可夫模型(HMM)模型和人工神经元网络(ANN)在语音识别中的成功应用。HMM模型的广泛应用应归功于AT&TBell实验室Rabiner等科学家的努力,他们把原本艰涩的HMM纯数学模型工程化,从而为更多研究者了解和认识,从而使统计方法成为了语音识别技术的主流。

20世纪90年代前期,许多著名的大公司如IBM、苹果、AT&T和NTT都对语音识别系统的实用化研究投以巨资。语音识别技术有一个很好的评估机制,那就是识别的准确率,而这项指标在20世纪90年代中后期实验室研究中得到了不断的提高。比较有代表性的是:IBM公司推出的ViaVoice和DragonSystem公司的NaturallySpeaking,Nuance公司的NuanceVoicePlatform语音平台,Microsoft的Whisper,Sun的VoiceTone等。
其中IBM公司于1997年开发出汉语ViaVoice语音识别系统,次年又开发出可以识别上海话、广东话和四川话等地方口音的语音识别系统ViaVoice’98。它带有一个32,000词的基本词汇表,可以扩展到65,000词,还包括办公常用词条,具有“纠错机制”,其平均识别率可以达到95%。该系统对新闻语音识别具有较高的精度,是目前具有代表性的汉语连续语音识别系统。

1.2.3国内研究历史及现状
我国语音识别研究工作起步于五十年代,但近年来发展很快。研究水平也从实验室逐步走向实用。从1987年开始执行国家863计划后,国家863智能计算机专家组为语音识别技术研究专门立项,每两年滚动一次。我国语音识别技术的研究水平已经基本上与国外同步,在汉语语音识别技术上还有自己的特点与优势,并达到国际先进水平。

清华大学电子工程系语音技术与专用芯片设计课题组,研发的非特定人汉语数码串连续语音识别系统的识别精度,达到94.8%(不定长数字串)和96.8%(定长数字串)。在有5%的拒识率情况下,系统识别率可以达到96.9%(不定长数字串)和98.7%(定长数字串),这是目前国际最好的识别结果之一,其性能已经接近实用水平。研发的5000词邮包校核非特定人连续语音识别系统的识别率达到98.73%,前三选识别率达99.96%;并且可以识别普通话与四川话两种语言,达到实用要求。
中科院自动化所及其所属模式科技(Pattek)公司2002年发布了他们共同推出的面向不同计算平台和应用的“天语”中文语音系列产品——PattekASR,结束了中文语音识别产品自1998年以来一直由国外公司垄断的历史。

2语音识别系统的概述
语音识别系统的总体结构框图如图2-1所示。从图中可以看出语音识别系统的本质就是一种模式识别系统,它也包括特征提取、模式匹配、参考模式库等基本单元。由于语音信号是一种典型的非平稳信号,加之呼吸气流、外部噪音、电流干扰等使得语音信号不能直接用于提取特征,而要进行前期的预处理。

首先通过语音的录制作为输入信号,输入的模拟语音信号要进行预处理,包括预滤波、采样和量化、加窗、端点检测、预加重等等。经过预处理后,接下来就是重要的一环:特征参数提取,在训练阶段,将特征参数进行一定的处理之后,为每个词得到一个模型,保存为模板库。在识别阶段,语音信号经过相同的通道得到语音参数,生成测试模板,与参考模板进行匹配,将匹配分数最高的参考模板作为识别结果。

在这里插入图片描述

图2.1 语音识别总体架构

3 MATLAB中的语音信号的采集
语音信号的采集也可以使用Windows中的“录音机”录制成.wav格式。而在MATLAB环境中语音信号的采集可使用wavrecord函数录制,然后使用wavread函数读入,wavplay函数播放,uiputfile函数保存。

3.1 wavrecord函数
wavrecord的用法:
y = wavrecord(n,Fs);
y = wavrecord(n,Fs,ch);
其中n为样本个数,Fs为频率,默认值为11025,本设计采用16000,ch为通道数,默认为1,若为2,则表示采样为双声道立体声数据,本设计ch为1
Audiorecorder函数也可以用来录制音频,但在本次设计的操作上,通常采用的语音格式以wav格式为主,在保存语音上,uiputfile能更好的与wavrecord相结合,所以用wavrecord比较好。

3.2 wavplay函数
wavplay函数的用法:
wavplay(y,Fs)
其中y为输入信号,Fs为频率
sound函数与soundsc函数也可以用来播放音频,虽然它们可以在任何操作系统平台上使用,而wavplay只支持Windows平台。但因为在语音识别中,我们通常采用的语音格式为wav格式,而wavplay函数与wavrecord函数的配合能更好的操作运行起来,两者结合共同使用。举个例子:
Fs=16000;
y=wavrecord(5*Fs,Fs,’int16’);
wavplay(y,Fs);
该段代码意思为:通过Windows的录音设备以16000Hz的采样频率录制5秒的数据,采样精度为16位,存储格式为int16;随后通过Windows的音频设备进行播放, 如图3-1所示为采集到的信号波形图。
【老生谈算法】matlab特定人语音识别算法——语音识别算法_第1张图片

图3-1 语音信号波形

在MATLAB平台处理语音信号时,可以通过wavplay函数回放录制好了的语音,次函数具有快速检验数据和计算可靠性。但是在录音的时候,wavrecord函数有很大的局限性,在录制语音的时候必须事先制定语音的时间。如果在指定的时间内用户没有说话,就会漏掉全部或部分的语音数据,操作起来不方便。并且,在一个语音识别系统中,程序会自动判断当前是用户在说话还是静音,如果检测用户有发出语音,那么就会保存该段语音,然后将删除掉头部和尾部的静音部分,这一功能被称为语音信号的端点检测。

4语音信号的端点检测
无论是测试和建立模板阶段还是在识别阶段,都先采用端点检测算法确定语音的起点和终点。语音端点检测是指用计算机数字处理技术从包含语音的一段信号中找出起始点及结束点,从而只存储和处理有效语音信号。语音端点检测是语音分析和识别中的一个重要环节,其算法的优劣在某种程度上也直接决定了整个语音识别系统的优劣。

4.1语音信号端点检测的流程
语音端点检测流程如图4-1所示。
【老生谈算法】matlab特定人语音识别算法——语音识别算法_第2张图片

图4-1端点检测算法流程图
(1)归一化:为了后面处理方便,通常将读取的语音信号进行归一化到[-1,1]
(2)短时能量的作用: 可以较好地区分出浊音和静音。
(3)短时过零的作用:检测清音。由于其能量较小,在短时能量检测中会因为低于能量门限而被误判为静音;短时过零率则可以从语音中区分出静音和清音(如“S”、“C”)
(4)高低门限的作用:检测之前,先为短时能量和过零率分别确定两个门限。一个是比较低的门限,其数值比较小,对信号的变化能够敏感,很容易就会被超过;而另一个是比较高的门限,数值要求比较大,信号要达到一定的强度,该门限才可能被超过。不过,低门限被超过未必就是语音的开始,有可能是时间很短的噪声引起的。高门限被超过的话则可以基本确定是由于语音信号引起的。

在了解语音信号的端点检测之前,我们先来了解一下语音信号的特征,如图4-2可以看到,信号在大致0.48~0.84之间的采样点属于发音状态,在头部跟尾部的信号幅度很低,属于静音或噪音。
【老生谈算法】matlab特定人语音识别算法——语音识别算法_第3张图片

图4-2 语音信号波形
图4-1中的图(II)和图(III)是信号波形的头部放大图,可以看出,在0.48之前的信号幅度很低,明显属于静音,而从0.48开始,幅度开始增强,并且有明显的周期性,两个尖峰之间的距离就是所谓的基音周期,也就是人的声带振动的周期。

于是我们可以用信号的幅度作为特征来区分静音和语音。这样只要设定一个门限,当语音信号幅度超过这个门限时,就当作语音开始,当幅度降低到门限以下时就认为语音结束。

于是,我们可以采用短时能量来描述语音信号的幅度。比如,对于一个读取到的语音信号x(n),n为采样点,首先对其进行分帧,将语音信号分为每20-30ms一段,相邻两帧起始点之间的间隔为10ms,也就是说两帧之间有10-20ms的交叠。由于采样频率的差异,帧长和帧移所对应的实际采样点数都不一样。比如:一个8kHz的采样频率,30ms的帧长对应240点,记为N,而10ms的帧移对应为80点,记为M。

对应第i帧,第n个样本,与原始语音信号的关系为:
xi(n)=x[(i-1)M+n]
第i帧的语音信号的短时能量就可以用下面几种算法得到:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分别为绝对值的累加、平方累加和平方的对数的累加,以上任意一种都可以。

计算完每帧的短时能量,接着再设定一个门限,便实现一个简单的检测算法了。但是这种算法并不可靠,因为人的发音有浊音和清音之分,浊音为声带振动发出,幅度高,周期性明显,而清音则不会有声带的震动,只是靠空气在口腔中的摩擦和冲击,其短时能量一般比较小。如声母“s”、“c”等的幅度就很低。所以基于短时能量的算法对这些语音信号几乎无能为力。

不过虽然不能用短时能量区分开,但是可以通过用一帧信号中波形穿越零电平的次数来描述这种变化的剧烈程度,称为过零率,公式为:
在这里插入图片描述

实际上,为了避免静音段的随机噪声产生过高的过零率,通常都会先设定一个门限,当前后两个采样的符号不同时,而且差值大于该门限的时候,就将过零率的数值加1。

4.1.1短时能量
语音和噪声的主要区别在它们的能量上,如图4-3所示。语音段的能量比噪声段的大,语音段的能量是噪声段能量叠加语音声波能量的和。对第n帧语音信号的短时能量En的定义为:
在这里插入图片描述

xn为原样本序列在窗函数所切取出的第n段短时语音,N为帧长。因为在计算时使用的是信号的平方,故将En作为一个度量语音幅度值变化的函数有一个缺陷,即对高电平非常敏感。因此在许多场合会将En用下式来代替:
在这里插入图片描述

这样就不会因为取平方而造成信号的小取样值的大取样值出现较大差异。

4.1.2过零率的计算
短时过零表示一帧语音信号波形穿过横轴(零电平)的次数。对于连续语音信号,过零意味着时域波形通过时间轴;而对于离散信号,如果相邻的取样值的改变符号则称为过零。过零率就是样本改变符号次数,定义语音信号)的短时过零率Zn为:
在这里插入图片描述
在这里插入图片描述

清音的平均过零率要高于浊音,它的能量多集中在较高的频率上,故短时过零率可以用来区分清音、浊音以及无声。图4-3(II)和图4-4(II)分别为数字6数字4的短时过零率。从图中可以看到清音‘S’的过零率明显高于其后的‘L’音,有声段过零率明显高于无声段,但在鼻音阶段过零率迅速滑落到无声水平而能量值则是缓慢下滑。在实际应用时并不能直接计算过零率,因为在无声段噪声使语音波形在0值附近来回摆动,导致计算出的过零率和有声段的区别并不十分明显。比较简单的解决方法是设定一个差的阈值δ,使不仅xn(m)*xn(m-1)<0,还要|xn(m) - xn(m-1)| > δ。在本系统中经多次试验取定δ=0.01。
【老生谈算法】matlab特定人语音识别算法——语音识别算法_第4张图片

图4-3 数字“6”的过零率波形图
【老生谈算法】matlab特定人语音识别算法——语音识别算法_第5张图片

图4-4 数字“4”的过零率波形图

完成计算短时能量及过零率后,并调整好能量门限,接下里进入到最关键的一步,即变量status分析,status可以分为四种状态:
(1)在静音段,如果能量或过零率超越了低门限,就应该开始标记起始点,进入过渡段。
(2)在过渡段,由于参数的数值小,不能确定是否处于真正的语音段,所以只要当两个参数的数值都回落到低门限以下,就要将当前状态恢复到静音状态,但是如果在过渡段中两个参数中的任何一个超过了高门限,那么就可以确定进入语音段了。
(3)结束段。
但是一些突发性的噪声当然也会引起过零率或者短时能量的数值变高,但是都不能维持足够长的时间,比如开关门窗、物体的碰撞等等引起的噪声。这些都可以通过设置最短时间门限来判定。若当前状态假如处于语音段时,若两个参数的数值降低到最低门限以下,并且总的记时长度小于最短的时间门限,那么我们认为这一段为噪声,然后继续扫描接下来的语音数据。

图4-5为语音信号的端点检测结果,竖线之间的部分为检测出的语音有声段。
【老生谈算法】matlab特定人语音识别算法——语音识别算法_第6张图片

图4-5 端点检测结果

4.1.3双门限端点检测
双门限端点检测顾名思义需要两级检测,即短时能量检测和短时过零率检测。在开始检测之前需要设定4个门限,即分别为短时能量和短时过零率各设置一个高门限和一个低门限:EHigh、ELow和ZHigh、ZLow。整个语音端点检测分为四部分:静音段、过度段、语音段、结束段。在静音段中如果能量或过零率有一个超过了其低门限,则认为进入了过度段。在过度段中,由于参数数值较小,还不能确定是否真的进入语音段,只有两个参数的其中一个超越了高门限才被认为是进入语音段。当参数降至低门限则认为进入结束。此外,还有两种可能会引起端点检测的误判:一是短时噪音引起的误判,此时则需要引入最小语音长度门限进行噪声判定,即语音段时间小于一定数值则认定为是噪声,重新回到静音段,本系统设为20ms;二是语音中字与字的时间空隙引起的误判,此时需要设定最大静音长度门限来降低识别的错误率,本系统所训练和识别的都为单字,故无需设置此门限。

在双门限端点检测中4个门限的设定至关重要,门限设定的好坏将直接影响端点检测的结果。门限值的设置还没有一个通用可靠的方法,需要根据经验和特定环境进行调整。常见的方法有最大值乘上某个比率、中位值乘上某个比率、最小值乘上某个常数、前三帧平均值乘上某个常数等。本系统中EHigh,ELow,ZHigh,ZLow的算法分别为:
在这里插入图片描述

在这里插入图片描述

5语音识别参数提取
语音信号进行端点检测及预处理后便会进行MFCC(特征参数提取),特征参数提取的好坏对系统的性能和准确率的影响非常大,对MFCC参数的要求如下:
(1)提取具有很好区分性及能够有效地代表语音特征的参数特;
(2)各个参数之间有良好的独立性;
(3)为了确保语音识别的实时实现,计算特征参数方便,最好是有效的计算方法。

5.1 MFCC的基本原理
近年来,以一种能充分利用人耳的感知性能系数有这被大量而广泛应用,这个系数就是Mel尺度倒谱系数(MFCC)。在整个语音识别的过程中,MFCC参数为了方便建模及计算,是按照帧计算的。其特征提取的过程如图5-1所示。

在这里插入图片描述

图5-1 MFCC特征提取及计算流程

Mel频率可以用如下公式表示:
在这里插入图片描述

MFCC系数按每个帧计算后,我们必须通过FFT得到对应帧信号的功率谱S(n),转换为Mel频率下的功率谱。这必须在计算先前在语音频谱范围之内设置的几个带通滤波器:
Hm(n) m=0,1,…,M-1; n=0,1,…,N/2-1
M是滤波器的数目,通常取24;一帧语音信号的点数为N,通常取256,这样计算FFT的方便。滤波器是一个简单的三角形的频域滤波器的中心频率,FM是均匀地分布在频率轴。语音信号帧长取为256个点,包含了24个滤波器,本设计语音信号的采样频率设为8KHz。

事先计算好带通滤波器的系数,再计算MFCC系数。MFCC特征系数的计算过程如下:
(1)预处理:首先确定N为每一帧语音采样点,如:N=256,并对每一帧序列s(n)进行分帧、预加重和加窗处理;
(2)离散功率谱的计算:先对预处理的每一帧进行离散傅里叶变换得到其频谱,再通过模的平方计算离散功率谱S(n),功率谱如图5-2所示。
【老生谈算法】matlab特定人语音识别算法——语音识别算法_第7张图片

图5-2 DTW功率谱图
(3)将离散功率谱经过滤波器组:将S(n)通过M个滤波组后得到功率值,也就是在各离散频率点上将S(n)和Hm(n)的乘积并相加,得到M个参数Pm,m=0,1,……M-1;
(4)对数的计算:得到Lm,m=0,1,……M-1;

6特定人语音识别算法-DTW算法
语音识别中较为经典的一种算法是DTW算法(动态时间规整)。在词,音节识别系统,识别率和HMM算法的识别率几乎是一样的。但是相比之下HMM算法相当的复杂,在识别阶段需要进行大量的反复计算语音数据才能得到模型参数,但是DTW算法不需要反复计算,因此本设计采用DTW算法。

6.1DTW算法原理
不管是在测试和建立参考模块还是在识别阶段,语音的起点和终点都必须用端点检测来确定。已存入模板库的各个词条称为参考模板,一个参考模板可以表示为 ,m为训练语音帧的时序标号,m=1为起点语音帧,m=M为终点语音帧,因此M为该模板所包含的语音帧总数,R(m)为第m帧语音特征矢量。所要识别的一个输入词条语音称为测试模板,可表示为 ,n为测试语音帧的时序标号,n=1为起点语音帧,n=N为终点语音帧,因此N为该模板所包含的语音帧总数,T(n)为第n帧语音特征矢量。参考模板与测试模板一般采用相同类型的特征矢量(如MFCC系数)、相同的帧长、相同的窗函数和相同的帧移。

假设测试和参考模板分别用T和R表示,为了比较它们之间的相似度,可以计算它们之间的距离D[T,R],距离越小则相似度越高。为了计算这一失真距离,应从T和R中各个对应帧之间的距离算起。设n和m分别是T和R中任意选择的帧号,d[T(n),R(m)]表示这两种特征矢量之间的距离。距离函数取决于实际采用的距离度量,在DTW算法中通常采用欧氏距离。

若N=M则可以直接计算,否则要考虑将T(n)和R(m)对齐。对齐可以采用线性扩张的方法,如果N

通常,规整函数被限制在一个平行四边形的网格内,如图6-1所示。它的一条边斜率为2,另一条边斜率为1/2。规整函数的起点是(1, 1),终点为(N,M)。DTW算法的目的是在此平行四边形内由起点到终点寻找一个规整函数,使其具有最小的代价函数,保证了测试模板与参考模板之间具有最大的声学相似特性。
【老生谈算法】matlab特定人语音识别算法——语音识别算法_第8张图片

图6-1 DTW原理图

由于在模板匹配过程中限定了弯折的斜率,因此平行四边形之外的格点对应的帧匹配距离是不需要计算的。另外,因为每一列各格点上的匹配计算只用到了前一列的3个网格,所以没有必要保存所有的帧匹配距离矩阵和累积距离矩阵。充分利用这两个特点可以减少计算量和存储空间的需求,形成一种高效的DTW算法,如图所示。图中,把实际的动态弯折分为三段,(1,xa),(xa+1,xb),(xb+1,N),其中:
xa= (2M-N)/3,
xb=2(2N-M)/3
xa和xb都取最相近的整数,由此可得出对M和N长度的限制条件:
2M-N≥3,
2N-M≥2
当不满足以上条件时,认为两者差别太大,则无法进行动态弯折匹配。在x轴上的每一帧不再需要与y轴上的每一帧进行比较,而只是与y轴上[ymin,ymax]间的帧进行比较,ymin和ymax的计算公式为:
ymin=x/2,0≤x≤xb,
2x+(M-2N),xb< x≤N
ymax=2x,0≤x≤xa,
x/2+(M-N/2),xa< x≤N
如果出现xa> xb的情况,则弯折匹配的三段为(1,xb),(xb+1,xa),(xa+1,N)。

对于x轴上每前进一帧,虽然所要比较的y轴上的帧数不同,但弯折特性是一样的,累积距离的更新都是用下式实现的:
D(x,y) = d(x,y)+min[D(x-1,y),D(x-1,y-1),D(x-1,y-2)]
6.2DTW算法流程及实验结果
通过DTW算法原理,得出DTW算法的流程如图6-2所示

在这里插入图片描述

图6-2 DTW算法流程

首先申请两个n*m的矩阵D和d,分别为累计距离和帧匹配距离。这里n和m为测试模板与参考模板的帧数。然后通过一个循环计算两个模板的帧匹配距离矩阵d。接下来进行动态规划,为每个格点(i,j)都计算其三个可能的前续格点的累积距离1D,2D和3D。考虑到边界问题,有些前续格点可能不存在,因此要加用一些判断条件。最后利用最小值函数min,找到三个前续格点的累积距离的最小值作为累积距离,与当前帧的匹配距离d(i,j)相加,作为当前格点的累积距离。该计算过程一直达到格点(n,m),并将D(n,m)输出,作为模板匹配的结果。

通过点击语音识别组件,MATLAB将会自动读取对应文件夹中的wav格式的语音,然后进行前期的端点检测和预处理,通过计算非线性预测系数(MFCC),并保留为参考库及测试库。接着通过DTW算法进行匹配并计算它们的dist距离。最终得出结果,其运行结果窗口如图6-3所示。
【老生谈算法】matlab特定人语音识别算法——语音识别算法_第9张图片

图6.3 运行结果窗口图

7 GUI界面的设计
光标、按键、窗口、菜单、图标、对话框和文本等各种图形对象组成的用户界面组成了图形用户界面(GUI)。它让我们用户自己定制MATLAB与用户的交互方法,使命令窗口不是唯一与MATLAB的交互方式。其能够使使用者的学习和使用更为方便、简单。用户不需要了解应用程序到底怎么样执行各种命令的,而只需要知道GUI的使用方法;用户也不必要了解命令是怎么样执行的,用户只需通过与界面交互就可以使指定行为可以正确执行。

7.1图形用户界面设计工具的启动
单击如图7-1所示的红色框,有三个设计模式,选择一个GUI设计模板,选择自己的存储路径,然后点击OK按钮后,MATLAB就会跳出如图7-2所示GUI设计窗口,当然选择不同的GUI设计模式时,在进入GUI设计窗口后显示的结果当然也是不一样的。
【老生谈算法】matlab特定人语音识别算法——语音识别算法_第10张图片

图7-1 GUI打开方式
(1)组件面板
在GUI界面中放置组件, GUI组件布置完成后,可以单击菜单栏中最后一个三角形按钮选项来观察GUIDE的设计结果。这时会自动生成一个FIG文件和一个M文件,FIG文件会提示保存路径。双击界面区域内的按钮就会弹出属性窗口,可以修改自己需要的属性。
(2)编程回调函数
布置完GUI组件后,接下来最重要的一步就是编程每个按钮的回调函数,实现自己需要的功能,其编程过程为:
① 选择右键单击按钮,弹出窗口,选择最后一项views callbacks;
② 鼠标放在views callbacks后就会弹出子选择窗口,根据自己的按钮属性选择相应的函数回调;
③选择完函数后,则会自动跳到M文件中该按钮所对应的回调函数,在该段函数中,可以编写自己需要实现该按钮的功能的代码。
待所有按钮的功能的回调函数都编写完毕后,点击保存,然后点击菜单栏中的三角形按钮,则会弹出用户开发界面,在该用户开发界面中,用户可以单击按钮以实现该按钮所拥有的功能。

7.3测试与分析
在MATLAB窗口中选择自己弄好的GUI的路径,打开GUI。然后单击菜单栏中的三角形按钮则弹出如图7-2 的用户开发界面。

在我的这次设计中,组建了三个模块,即参考模块、测试模块、分析模块,参考模块和测试模块均有相同的功能,即录音、暂停、播放、保存及读取,分析模块包含语音识别和退出。

用户可以在点击录音后,录制字、词,录制完毕后,可以点击播放进行回放自己所录制的语音,通过保存(uiputfile函数),用户就可以保存数个录制的语音。通过读取(uigetfile函数),用户可以打开文件并读取语音信号波形。
【老生谈算法】matlab特定人语音识别算法——语音识别算法_第11张图片

图7-2运行界面
录制完成后,点击分析模块中的语音识别控件,系统就会将之前录制好的参考模板库与测试模板库中的语音自动进行匹配。并将结果在MATLAB命令窗口中显示出来,可以看到,显示结果如图7-3。
【老生谈算法】matlab特定人语音识别算法——语音识别算法_第12张图片

图7-3运行结果图
本设计采用端点检测算法,再经过特征提取,最后运用DTW算法来实现语音的识别。采样频率为8kHz语音,语音帧长20ms,一帧分为256点,帧移为80,采用汉明窗的窗函数。录制数字010的语音作为model(参考库),test(测试库)中有若干个需要识别语音,0的序号设置为11,且110的数字文件名的命名都依次从1~10命名。试验数据如表1-1。由以上数据分析可知识别率为86%。

数字 1 2 3 4 5 6 7 8 9 10 0 0-10
正确数 8 9 10 7 10 8 7 9 9 8 10 95
错误数 2 1 0 3 0 2 3 1 1 2 0 15
正确率 80% 90% 100% 70% 100% 80% 70% 90% 90% 80% 100% 86%
表1-1 结果分析
【老生谈算法】matlab特定人语音识别算法——语音识别算法_第13张图片

参考文献
[1] 张雪英.数字语音处理及MATLAB仿真[J].北京:电子工业出版社,2010.7
[2]韦丽兴,张淼,钟映春,韩光.采用PCNN的有噪特定人语音识别系统[J].2012.1
[3]张瑶.基于量子神经网络的特定人语音识别研究[D].天津师范大学.2013.4
[4] 何强,何英.MATLAB扩展编程[M].北京:清华大学出版社,2002
[5] 刘保柱,苏彦华,张宏林.MATLAB 7.0从入门到精通(修订版).北京:人民邮电出版社,2010.5
[6]陈立万.基于语音识别系统中DTW算法改进技术研究[J].微机计算机信息.2006.2
[7]胡金平,陈若珠,李战明.基于语音识别中DTW改进算法的研究[J].兰州.2011.11
[8]吴晓平,崔光照,路康.基于DTW算法的语音识别系统实现[J].2004.7
[9]惠博.语音识别特征提取算法的研究与实现[D].西北大学.2008.6
[10]詹新明,黄南山,杨灿. 语音识别技术研究进展[J]. 现代计算机(专业版).2008.9
[11]沈宏余,李英. 语音端点检测方法的研究[J]. 科学技术与工程.2008.8
[12]谭保华,熊健民,刘幺和. 语音识别技术概述[J]. 郧阳师范高等专科学校学报.2004.6
[13] 赵力.语音信号处理[M].北京:机械工业出版社.2003.7
[14] 熊伟,罗云贵.语音识别的MFCC 算法研究.武汉:2010年第三期
[15] 蔡妍. 语音信号端点检测方法的研究[硕士学位论文][D]. 江南大学, 2008.6
[16] 朱淑琴. 语音识别系统关键技术研究[硕士学位论文] [D]. 西安电子科技大学, 2004
[17] 刘金伟,黄樟钦,侯义斌 基于片上系统的孤立词语音识别算法设计[J]计算机工程2007,3
[18] 胡金平,陈若珠,李战明.基于语音识别中DTW改进算法的研究.兰州:TP391.42
[19] 李景川,董慧颖. 一种改进的基于短时能量的端点检测算法[J]. 沈阳理工大学学报,2008.6 [20] 王嘉梅.基于MATLAB的数字信号处理与时间开发.西安:西安电子科技大学出版社, 2007.12
[21] 熊伟,罗云贵.语音识别的MFCC 算法研究.武汉:2010年第三期
[22] 吴亚栋. 语音识别基础[R]. 上海交通大学计算机系, 2007.01
[23] 雷静.语音识别技术的研究及基本实现[D].武汉:武汉理工大学,2002
[24] 张雄伟,陈亮,杨吉斌.现代语音处理技术及应用[M].北京:机械工业版社,2003
[25] 张志敏,郭英,王博.一种基于倒谱特征的语音端点检测改进算法[J].电声技术,2006.4
[26] 刘羽.语音端点检测及其在MATLAB中的实现[J].计算机时代,2005.8
[27] 徐剐,徐华中.语音信号端点检测的实验研究[J].福建电脑,2006.1
[28] 胡光锐,韦晓东.基于倒谱特征的带噪语音端点检测[J].电子学报,2000.10
[29] 于迎霞,史家茂.一种改进的基于倒谱特征的带噪端点检测方法[J].计算机工程,2004.6
[30] 相征,朗朗,王静. 基于基音频能值的端点检测算法[J]. 安徽工程科技学院学报, 2008.9

附件
附录语音识别主函数

function varargout = GUI(varargin)
% GUI M-file for GUI.fig
%      GUI, by itself, creates a new GUI or raises the existing
%      singleton*.
%
%      H = GUI returns the handle to a new GUI or the handle to
%      the existing singleton*.
%
%      GUI('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in GUI.M with the given input arguments.
%
%      GUI('Property','Value',...) creates a new GUI or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before GUI_OpeningFunction gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to GUI_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Copyright 2002-2003 The MathWorks, Inc.

% Edit the above text to modify the response to help GUI

% Last Modified by GUIDE v2.5 30-Apr-2015 22:25:50

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @GUI_OpeningFcn, ...
                   'gui_OutputFcn',  @GUI_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT

% --- Executes just before GUI is made visible.
function GUI_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to GUI (see VARARGIN)

% Choose default command line output for GUI
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes GUI wait for user response (see UIRESUME)
% uiwait(handles.figure1);

% --- Outputs from this function are returned to the command line.
function varargout = GUI_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;

% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

global a;
fs=16000;
t=2;                        
a=wavrecord(t*fs,fs);
handles.a=a;
guidata(hObject, handles);

% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global a;
pause(handles.a);
guidata(hObject, handles);

% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global a;
wavplay(a,16000);
axes(handles.axes1);
plot(a);
guidata(hObject, handles);

% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton4 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global a;
[filename pathname]=uiputfile({'*.wav','wav-files(*.wav)';'*.*','All-files(*.*)'},'   ¨    ');
str=strcat(pathname,filename);
save(str,'a');
wavwrite(a,16000,str);
guidata(hObject, handles);

% --- Executes on button press in pushbutton5.
function pushbutton5_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton5 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global m1;
global x1;
global x2;
[fname,L]=uigetfile({'*.wav','All MATLAB Files(*.wav)';'*.*','All-files(*.*)'},'Pick a file','MultiSelect', 'on');
file=[L,fname];
[S,fs]=wavread(file);
figure
subplot(2,1,1);
plot(S);
[x1,x2]=vad(S,fs);
%axes(handles.axes1);
m1=mfcc(S);
%guidata(hObject, handles);

% --- Executes on button press in pushbutton11.
function pushbutton11_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton11 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global b;
fs=16000;
t=2;
b=wavrecord(t*fs,fs);      
handles.b=b;
guidata(hObject, handles);

% --- Executes on button press in pushbutton12.
function pushbutton12_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton12 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global b;
[filename pathname]=uiputfile({'*.wav','wav-files(*.wav)';'*.*','All-files(*.*)'},'   ¨    ');
str=strcat(pathname,filename);
save(str,'b');
wavwrite(b,16000,str);
guidata(hObject, handles);

% --- Executes on button press in pushbutton14.
function pushbutton14_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton14 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global b;
pause(handles.b);
guidata(hObject, handles);

% --- Executes on button press in pushbutton13.
function pushbutton13_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton13 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global b;
wavplay(b,16000);
axes(handles.axes2);
plot(b);
guidata(hObject, handles);

% --- Executes on button press in pushbutton15.
function pushbutton15_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton15 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global m2;
global x1;
global x2;
[fname,L]=uigetfile({'*.wav','All MATLAB Files(*.wav)';'*.*','All-files(*.*)'},'');
file=[L,fname];
[S,fs]=wavread(file);
figure
[x1,x2]=vad(S,fs);
%axes(handles.axes2);
m2=mfcc(S);
%guidata(hObject, handles);

% --- Executes on button press in pushbutton16.
function pushbutton16_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton16 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global m1;
global m2;
global x1;
global x2;
global a1;
global b1;
fs=16000;

for i=1:100
fname=sprintf('D:\\design\\test\\%d.wav',i);
   try 
  x=wavread(fname);
  [x1 x2]=vad(x,fs);
 %axes(handles.axes2);
  m2=mfcc(x);
  m2=m2(x1-2:x2-2,:);
  test(i).mfcc=m2;
   a1=i;
   catch
       break
   end 
end
for i=1:100
fname=sprintf('D:\\design\\model\\%d.wav',i);
try 
    x=wavread(fname);
  [x1 x2]=vad(x,fs);
 %axes(handles.axes2);
  m1=mfcc(x);
  m1=m1(x1-2:x2-2,:);
  ref(i).mfcc=m1;
    b1=i;
catch 
    break
end
end
dist=zeros(a1,b1);
for i=1:a1
for j=1:b1
  dist(i,j)=dtw(test(i).mfcc,ref(j).mfcc);
end
end
disp(dist);
disp('正在匹配…… ') 
for i=1:a1
  [d,j]=min(dist(i,:));
 fprintf('测试模板%d的识别结果为:%d\n',i,j);
end
%guidata(hObject, handles);

% --- Executes on button press in pushbutton17.
function pushbutton17_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton17 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

close;

2、源码下载:

语音识别算法matlab源码如下,有需要的朋友可以点击进行下载

序号 matlab语音识别源码(点击下载)
1 基于matlab时域频域处理的语音处理系统源码+项目设计文档+GUI图形用户界面_声音处理_时域频域变频_频谱分析_matlab
1 BP神经网络的数据分类_语音特征信号分类_matlab
1 语音激活检测算法_对基于短时能量和短时过零率双门限法语音激活检测的噪声估计算法_基于最小子带能量的噪声估计方法_matlab
1 马丁噪声估计算法_用于谱减法_基于统计模型等语音增强算法_噪音估计_matlab
1 LMS_RLS改进算法_语音增强_MATLAB程序_输入输出序列_读取数据_自适应增强算法

你可能感兴趣的:(matlab算法原理详解,语音识别,算法,matlab)