语音识别系统
本系统旨在构建一个语音识别系统,实现电脑自动将人类的语音内容识别出来。
源代码(MATLAB版)
应各位读者的需求,现把该语音识别系统的源代码(MATLAB版)公布如下:
下载地址为:语音识别系统
原理
系统框架图 :
图1 系统框架图
如上面的系统框架图所示,语音识别系统的实现原理和流程是:
- 训练流程:首先利用麦克风来采集语音信号,由于我们采集到的语音信号是通过AD模块转换后的,所以得到的语音信号是数字信号,接下来把声音转化成.wav的格式存储在电脑的文件夹中,作为原始的音频信号保存下来,同时把得到的数字语音信号以及它的采样频率、ID和语音长度保存在数据库中,形成一个声音的样本特征库。
- 测试流程:首先利用麦克风来采集语音信号,同样地,我们得到的语音信号是数字信号,接下来把声音转化成.wav的格式存储在电脑的文件夹中,作为原始的音频信号保存下来,然后把得到的语音信号进行分帧、滤波等预处理,进行特征提取;最后把得到的特征与数据库中训练时建立好的样本特征库进行特征匹配,识别出结果来。
步骤
1. 声音采集
我们调用MATLAB的voicebox工具箱中的相关函数来进行语音的采集,具体的函数如下:
函数1 :
micrecorder = audiorecorder(samplingfrequency, samplingbits, 1);
函数的相关说明:
% 用于创建录音对象
% 参数1:samplingfrequency为采样率
% 参数2:samplingbits为指定采样点的比特数
% 第三个参数nChannels(int): 1时表示单通道录音,为2时表示双通道录音,会产生立体音效果
函数2:
record(micrecorder, durata);
函数的相关说明:
%用于录音
% 参数1:micrecorder为录音对象
% 参数2:durata为录音的持续时间
函数3:
isrecording(micrecorder);
函数的相关说明:
% 判断是否正在录音
% 参数1:micrecorder为录音对象
函数4:
getaudiodata (micrecorder);
函数的相关说明:
% 用于提取录音数据
% 参数1:micrecorder为录音对象
2. 声音的预处理
1) 语音信号分帧:
因为语音信号在短时间内是平稳的,为了能够用一些比较传统的方法来对语音信号进行分析(例如:接下来的端点检测),我们需要得到短时的语音信号,所以就引出了语音信号分帧,我们是通过对语音信号进行加窗操作来分帧的,我们可以调用MATLAB的voicebox工具箱中的分帧函数:
f=enframe(x, len, inc);
其中:x为要分帧的语音信号,len为帧长,inc为帧移。
帧长和帧移的关系如图所示:
图2 帧长和帧移的关系图
语音信号通过分帧后,变成了若干帧短时的语音信号。
2) 端点检测:
目的是为了检测出有用语音信号的开始和结束,去除静音和噪音部分,既可以减少噪音带来的干扰,也可以降低计算量。
端点检测需要两种方法结合,包括计算短时能量和短时过零率其中:
离散信号的能量计算公式如下:
短时过零率的定义如下:
通过短时过零率的定义可以算出语音信号的过零次数。而语音信号一般可分为无声段、清音段和浊音段。其中在短时能量方面:无声 < 清音 <<浊音,在短时过零率方面:无声 <浊音 << 清音;所以端点检测就是首先判断有声还是无声, 如果有声,则还可以判断是清音还是浊音。为正确地实现端点检测, 一般综合利用短时能量和过零率两个特征,采用双门限端点检测法。根据信号设置三个阈值:能量阈值,TL,TH;过零率阈值ZCRL、ZCRH,,当某帧信号大于TL或者大于ZCRL时,认为信号的开始、起点,但有可能是时间比较短的噪音,当大于TH或大于ZCRH时,则认为是正式的语音信号,如果保持一段时间,则确认这信号即所需信号。最后我们通过双门限端点检测法检测出有用语音信号的开始和结束,去除静音和噪音部分,既可以减少噪音带来的干扰,也可以降低计算量。
3. 特征提取
我们知道声音是通过声道来产生的,声道的结构决定了发出怎样的声音。声道的结构构成包括舌头,牙齿等。如果我们可以准确的知道这个结构,那么我们就可以对产生的声音的音素进行准确的描述。声道的结构在语音短时功率谱的包络中显示出来。而MFCCs(梅尔频率倒谱系数)就是一种准确描述这个包络的一种特征,所以我们需要把音频信号中具有辨识性的成分提取出来,如:MFCCs(梅尔频率倒谱系数),然后把其他多余的信息(例如情绪之类的)去掉。
1) 倒谱分析:
图3是一个语音的频谱图。峰值就表示语音的主要频率成分,我们把这些峰值称为共振峰(formants),而共振峰就是携带了声音的辨识属性(就是个人身份证一样)。所以它特别重要。用它就可以识别不同的声音。
图3 语音的频谱图
我们要提取的不仅仅是共振峰的位置,还得提取它们转变的过程。所以我们提取的是频谱的包络(Spectral Envelope)。这包络就是一条连接这些共振峰点的平滑曲线。如图4所示:
图4 频谱的包络图示例
将原始的频谱由两部分组成:包络和频谱的细节。这里用到的是对数频谱,所以单位是dB,对数可以把它的横坐标放大,有利于我们分析。那现在我们需要把这两部分分离,这样我们就可以得到包络了。而事实证明我们可以把原来的频谱看成:X[k]=H[k]E[k];只考虑幅度就是:|X[k] |=|H[k]||E[k] |;然后我们取的是对数频谱,所以变成:log||X[k] ||= log ||H[k] ||+ log ||E[k] ||,如图5所示:
图5 包络和频谱的细节图
但是我们还没有把它们分开,我们是对log||X[k] ||= log ||H[k] ||+ log ||E[k] ||两边同时求逆傅里叶变换,得到x[k]=h[k]+e[k],变成了一个时域信号,然后得出h[k]属于低频部分,e[k]属于高频信号,最后通过低通滤波器来把h[k]滤出来。因为这里取的是对数的频谱,所以求逆傅里叶变换后,虽然也是一个时域信号,但很明显跟原来的时域不一样了,我们把现在的x[k]称为倒谱,我们所关心的h[k]就是倒谱的低频部分。h[k]描述了频谱的包络,它在语音识别中被广泛用于描述特征。总而言之,倒谱(cepstrum)就是一种信号的傅里叶变换经对数运算后再进行傅里叶反变换得到的谱。它的计算过程如图6所示:
图6 倒谱的计算过程
而我接下来所说的MFCC(梅尔频率倒谱系数)就是在这个基础上得来的,和前面一样,要求梅尔频率倒谱系数,我们先说一下怎么得到梅尔频率倒谱,Mel(梅尔)频率分析就是基于人类听觉感知实验的,实验观测发现人耳就像一个滤波器组一样,它只关注某些特定的频率分量(人的听觉对频率是有选择性的),把其他的频率滤掉,而剩下的这些频率恰好却可以语音特征。梅尔频率倒谱系数(Mel Frequency Cepstrum Coefficient, MFCC)考虑到了人类的听觉特征,先将原来线性频谱映射到基于听觉感知的Mel非线性频谱中,然后转换到倒谱上。其转换公式如图7所示:
图7 梅尔频率倒谱系数转换公式
我们将频谱通过一组Mel滤波器就得到Mel频谱。公式表述就是:log X[k] = log (Mel-Spectrum)。这时候我们在log X[k]上进行倒谱分析:
1)取对数:log X[k] = log H[k] + log E[k]。
2)进行逆变换:x[k] = h[k] + e[k]。
倒谱系数h[k]就称为Mel频率倒谱系数,简称MFCC。而实际逆变换一般是通过DCT离散余弦变换来实现,取DCT后的第2个到第13个系数作为MFCC系数),获得Mel频率倒谱系数MFCC,这个MFCC就是这帧语音的特征;语音就可以通过一系列的倒谱向量来描述了,每个向量就是每帧的MFCC特征向量。因为前面都是基于一帧信号来分析的,最后形成一个特征库。
4. 特征匹配与识别结果
在特征匹配阶段,我们使用了一种基于矢量量化(VQ,Vector Quantization)的特征匹配算法。矢量量化(VQ,Vector Quantization)是一种极其重要的信号压缩方法。VQ在语音信号处理中占十分重要的地位。广泛应用于语音编码、语音识别和语音合成等领域。VQ实际上就是一种逼近。它的思想和“四舍五入”有异曲同工之妙,都是用一个和一个数最接近的整数来近似表示这个数。我们来看一个二维VQ例子,如图8所示:
图8 VQ划分示例
在这里,我们用蓝色实线将这张图划分为16个区域。任意的一对数(也就是横轴x和纵轴y组成的任意的一个坐标点(x, y))都会落到上面这张图中的某一特定区域。然后它就会被该区域的红星的点近似。上面这些红星点就是量化矢量,表示图中的任意一个点都可以量化为这16个矢量中的其中一个,因此我们可以对特征提取阶段得到的Mel频率倒谱系数(MFCC)进行矢量量化为K个红星点(K可以根据实际情况进行调整)。在特征匹配的时候,我们先把样本特征库中的每一个样本的Mel频率倒谱系数(MFCC)都矢量量化为图8所示的二维VQ划分,每个二维VQ划分有K个区域,即有K个红星点,每个区域由该区域的红星点所代替;然后我们把测试样本的Mel频率倒谱系数(MFCC)散步在这张二维VQ划分中,每个区域都会分布若干个点,然后在每个区域中求每个点到红星点的欧式距离(两点间欧式距离的计算公式如图9所以),再把K个区域的欧式距离进行求平均,得到平均欧式距离,若某个样本的欧式距离最小,则该训练样本与测试样本特征最匹配,则我们可以判断这个训练样本与该测试样本属于同一语音信号的概率最大,得出识别的结果。
图9 两点间欧式距离的计算公式
结果演示
1) 语音识别系统界面,如图10所示:
图10 语音识别系统界面
2) 点击添加声音按钮,进行添加训练样本,总共添加三个训练样本,如图11、图12和图13所示。
图11 样本1添加过程
图12 样本2添加过程
图13 样本3添加过程
3) 进行测试“关茂柠”这段语音,测试结果如图14、图15所示:
图14 测试结果
图15 测试结果
4) 进行测试“teacher zhou”这段语音,测试结果如图16、图17所示:
图16 测试结果
图17 测试结果