1 简介
1、语音识别系统概述
语音信号是一种典型的非平稳信号,并且在录音过程中不免受到电噪音,呼吸产生的气流噪音以及录音环境下的突发噪音的影响,所以语音信号要经过预滤波、采样量化、分帧、加窗、预加重、端点检测等预处理过程后才可以进行下一步的特征征参数提取等工作。在接下来的语音训练阶段,我们将那些信号状态良好,携带噪声小且特征参数稳定的语音信号作为指定词条的模板,进而为每个词条创建一个模板并保存为模板库。在识别阶段,语音信号经过相同的通道生成测试模板,用相同的方法计算测试模板的特征参数后,将其与模板库模板的特征参数进行匹配,配分数最高的参考模板作为识别结果。
2、语音信号的录入
语音信号的采集方法有很多,鉴于该系统是在MATLAB上实现,且MATLAB本身提供了一定的音频处理函数,因此我们完全可以采用在MATLAB中先完成录音函数的编写,然后再结合windows自带的录音设备进行录音。录音得到的wav文件即是经过预滤波采样和量化的语音。利用soundview读所录入的文件时,会弹出一个GUI界面,并可以通过输出设备对所录语音进行回访,该GUI界面如图1所示。单击Play Again按钮可可回放,单击Done按钮可关闭界面。
3、语音信号的预加重
我们知道,对语音识别更有用的是语音的高频部分,而对于语音信号的频谱,通常是频率越高幅值越低。因此我们必须对语音的高频进行加重处理。处理方法是将语音信号通过一个一阶高通滤波器,即预加重滤波器,它不仅能滤除低频提升高频,还能很好的抑制50Hz到60Hz的工频干扰。尤其在短点检测之前进行预加重还可起到消除直流漂移、抑制随机噪声和提升清音部分能量的效果。预加重在Matlab中可由语句x=filter([1-0.9375],1,x)实现。
4、语音信号的分帧和加窗
经过数字化的语音信号实际上是一个时变信号,为了能用传统的方法对语音信号进行分析,应假设语音信号在10ms-30ms内是短时平稳的。为了得到短时的语音信号,要对语音信号进行加窗操作。窗函数平滑地在语音信号上滑动,将语音信号进行分帧,帧与帧的交叠为帧移,一般为窗长的一半。
语音信号的分帧采用enframe函数,其语法为f=enframe(x,len,inc);其中X为输入的语音信号,len为制定的帧长,inc为指定帧移。函数将返回一个n×len的一个矩阵,每行都是一帧数据。在本系统中帧长取240,帧移取80。在Matlab中要实现加窗即将分帧后的语音信号乘上窗函数,本文加汉明窗,即为x=x.*hamming(N)。
5、端点检测
在语音识别系统中,训练阶段和建模阶段都比较重要的环节都是要先通过端点检测找到语音的起点和终点,这样,我们就可以只对有效语音进行处理,这对于识别的准确率和识别效率至关重要。本论文在短点检测环节采用双门限端点检测法,即采用短时能量检测和短时过零率检测双重指标约束。结合实际,我们将整个语音端点检测分为四个段落,即:无声段、等待段、语音段、结束段,再为短时能量和短时过零率各设置一个高门限和一个低门限:EHigh、ELow和ZHigh、ZLow。结合MATLAB中所编程序,可以较准确的确定语音的各个部分。图2所示为语音“1”的处理结果。
6、特征参数的提取
经过预处理的语音数据就可以进行特征参数提取,特征参数的好坏将直接影响系统的性能和效率。本文将梅尔倒谱系数(MFCC)和一阶MFCC系数的差分结合起来,将其合并为一个矢量作为一帧语音信号的参数,这样,不仅描述了语音的静态特性,由于加入了差分倒谱参数,语音的动态特性得到了更好的体现。梅尔倒谱参数的计算流程为:先将预处理过的语音信号进行快速傅立叶变换,将时域信号变换成为信号的功率谱。再用一组Mel频标上线性分布的三角窗滤波器(本文采用24个三角窗滤波器)对信号的功率谱滤波,每一个三角窗滤波器覆盖的范围都近似于人耳的一个临界带宽,以此来模拟人耳的掩蔽效应。然后对三角窗滤波器组的输出求取对数,可以得到近似于同态变换的结果。最后去除各维信号之间的相关性,将信号映射到低维空间。梅尔倒谱系数的计算差分参数的计算采用下面的公式:
7、模式匹配
本语音识别系统的模式匹配算法采用动态时间弯折(Dynamic Time Warping,DTW)算法,该算法基于动态规划的思想,解决了发音长短不一的模板匹配问题。DTW是语音识别中出现较早,较为经典的一种算法。与HMM算法相比而言,DTW算法具有计算量小,识别效率高的特点。模式匹配的过程其实就是根据一定的规则,计算输入矢量特征与库存模式之间的相似度,判断出输入语音的语意信息。本文中,失真测度采用下式所示的欧式距离:
其中,l=1,2,…M;i=1,2,…I;k=1,2,…K.是待测矢量之间的距离,是第i个码本的第l个码字矢量的第k个分量。I为说话者的数量,M为码本的大小,K为参数矢量的总维数。由上式得出该语音相对于该命令词的最短距离,然后取最短距离最小的命令词作为该段语音的首先识别结果。结合MATLAB程序,得到数字1-10的匹配距离矩阵:
图3即为针对数字1-10的待测模板和模板库模板匹配距离的现实,由该距离矩阵,我们可以很清楚的看到,左上角到右下角的对角线上的距离匹配值在该值所在的行和列都是最小的。即距离最短的命令词为识别结果。
8、结语
该论文阐述了基于DTW的语音识别系统在MATLAB上实现的基本过程,在实验室录音情况下,该识别系统的识别率可以达到百分之九十以上,效果良好。
2 部分代码
clear allcloseclc;disp('正在计算参考模板的参数...')for i=1:10fname=sprintf('%d0.mp3',i-1);[x,fs]=audioread(fname);sound(x,fs); [x1 x2]=vad(x);% x1=abs(round(x1));% x2=abs(round(x2)); m=mfcc(x); m=m(x1-2:x2-4,:); ref(i).mfcc=m;enddisp('正在分析语音信号...')for i=1:10fname=sprintf('%d0.mp3',i-1);%[x,fs,bit]=audioread(fname,[2000,2512]); %采样%[x,fs]=audioread(fname,[2000,2512]);%sound(x,fs); %播放语音信号figure(i);subplot(3,3,1);plot(x(1:256)); %原始语音信号的时域图形%title('原始信号')subplot(3,3,2)[h,w]=freqz(x,fs); %原始语音信号的频率响应图hr=abs(h); %求系统幅频响应plot(w,hr);title('幅频图');xlabel('Frequency in rad mple')ylabel('Magnitude in dB')subplot(3,3,3)hphase=angle(h);hphase=unwrap(hphase); %求系统相频响应plot(w,hphase);title('相频图');xlabel('Frequency in rad mple')ylabel('Phase in degrees')y=fft(x,512); %傅立叶变换%mag=abs(y);mag1=10*log10(mag);f=fs*(0:255)/512;subplot(3,3,4)plot(f,mag(1:256)); %FFT频谱图 %title('fft变换后信号')iff=ifft(y,512); %反傅立叶变换%ifm=abs(iff);subplot(3,3,5)plot(f,ifm(1:256))title('ifft后信号')% 短时傅里叶变换Ts=1/fs;%N=T/Ts;N=512;Nw=20; %窗函数长L=Nw/2; %窗函数每次移动的样点数 Tn=(N-Nw)/L+1; %计算把数据x共分成多少段nfft=32;%FFT的长度Tn=round(Tn);TF=zeros(Tn,nfft); %将存放三维谱图,先清零for i=1:Tn xw=x((i-1)*10+1:i*10+10); %取一段数据 temp=fft(xw,nfft); %FFT变换 temp=fftshift(temp); %频谱以0频为中心 for j=1:nfft TF(i,j)=temp(j); %把谱图存放在TF中 endendsubplot(3,3,6)fnew=((1:nfft)-nfft/2)*fs/nfft;tnew=(1:Tn)*L*Ts;[F,T]=meshgrid(fnew,tnew);mesh(F,T,abs(TF))title('短时傅立叶变换时频图')subplot(3,3,7)contour(F,T,abs(TF))title('等高线表示')enddisp('正在计算测试模板的参数...')for i=1:10 fname=sprintf('%d2.mp3',i-1);x=audioread(fname);disp('正在进行模板匹配...')dist=zeros(10,10);for i=1:10enddisp('正在计算匹配结果...')for i=1:10 [d,j]=min(dist(i,:)); fprintf('测试信号%d的识别结果为:%d\n',i-1,j-1);end
3 仿真结果
4 参考文献
[1]肖利君. 基于DTW模型的孤立词语音识别算法实现研究[D]. 中南大学, 2010.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。