【语音识别】基于DTW算法实现0~9数字含Matlab源码

 1 简介

语音识别技术就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令的高技术,语音识别是一门交叉学科。人们预计,不久的未来年,语音识别技术将进入工业、家电、通信、汽车电子、医疗、家庭服务、消费电子产品等各个领域。语音识别是人机交互里很重要的模块,从PC时代到现在的移动互联时代,人机交互由鼠标键盘走向智能手机、Pad等的多点触摸。到了智能硬件时代,交互则更加多元,不仅有触摸,还有基于语音、视觉的交互。原本是以机器为中心的人机交互,逐渐走向以人为中心的自然交互。

语音识别技术主要包括特征提取技术、模式匹配准则及模型训练技术三个方面。语音识别常见的五种算法:动态时间伸缩算法(Dynamic Time Warping,DTW)、基于规则的人工智能、人工神经网络(Artificial Neural Network,ANN)方法、隐马尔可夫(Hidden Markov Model、HMM)方法,HMM和ANN混合模型。本文利用MATLAB强大的数学运算能力,实现孤立语音信号的识别。本文应用DTW为识别算法,采用MFCC(MEL频率倒谱系数)为主要语音特征参数。其中包括语音信号处理,特征参数提取,识别模板训练,识别匹配算法。识别效果可以达到预期。

DTW算法原理:在孤立词语音识别中,最为简单有效的方法是采用DTW(Dynamic Time Warping,动态时间归整)算法,该算法基于动态规划(DP)的思想,解决了发音长短不一的模板匹配问题,是语音识别中出现较早、较为经典 的一种算法。

用于孤立词识别,DTW算法与HMM算法在训练阶段需要提供大量的语音数据,通过反复计算才能得到模型参数,而DTW算法的训练中几乎不需要额外的计算。所以在孤立词语音识别中,DTW算法仍然得到广泛的应用。

DTW一般算法:无论在训练和建立模板阶段还是在识别阶段,都先采用端点算法确定语音的起点和终点。已存入模板库的各个词条称为参考模板,一个参考模板可表示为R={R(1),R(2),……,R(m),……,R(M)},m为训练语音帧的时序标号,m=1为起点语音帧,m=M为终点语音帧,因此M为该模板所包含的语音帧总数,R(m)为第m帧的语音特征矢量。

所要识别的一个输入词条语音称为测试模板,可表示为T={T(1),T(2),……,T(n),……,T(N)},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

DP算法可以归结为寻找一条通过此网络中若干格点的路径,路径通过的格点即为测试和参考模板中进行计算的帧号。路径不是随意选择的,首先任何一种语音的发音快慢都有可能变化,但是其各部分的先后次序不可能改变,因此所选的路径必定是从左下角出发,在右上角结束。

2 部分代码

function cc=mfcc(k)%------------------------------% cc=mfcc(k)计算语音k的MFCC系数%------------------------------% M为滤波器个数,N为一帧语音采样点数M=24; N=256;% 归一化mel滤波器组系数bank=melbankm(M,N,8000,0,0.5,'m');bank=full(bank);bank=bank/max(bank(:));% DCT系数,12*24for i=1:12  j=0:23;  dctcoef(i,:)=cos((2*j+1)*i*pi/(2*24));end% 归一化倒谱提升窗口w=1+6*sin(pi*[1:12]./12);w=w/max(w);% 预加重AggrK=double(k);AggrK=filter([1,-0.9375],1,AggrK);% 分帧FrameK=enframe(AggrK,N,80);% 加窗for i=1:size(FrameK,1)    FrameK(i,:)=(FrameK(i,:))'.*hamming(N);endFrameK=FrameK';% 计算功率谱S=(abs(fft(FrameK))).^2;colorbar;% 将功率谱通过滤波器组P=bank*S(1:129,:);% 取对数后作离散余弦变换D=dctcoef*log(P);% 倒谱提升窗for i=1:size(D,2)    m(i,:)=(D(:,i).*w')';end% 差分系数dtm=zeros(size(m));for i=3:size(m,1)-2  dtm(i,:)=-2*m(i-2,:)-m(i-1,:)+m(i+1,:)+2*m(i+2,:);enddtm=dtm/3;%合并mfcc参数和一阶差分mfcc参数cc=[m,dtm];%去除首尾两帧,因为这两帧的一阶差分参数为0cc=cc(3:size(m,1)-2,:);

3 仿真结果

【语音识别】基于DTW算法实现0~9数字含Matlab源码_第1张图片

【语音识别】基于DTW算法实现0~9数字含Matlab源码_第2张图片

4 参考文献

[1]薛凤.陈骑兵.数学试验与数学模型.北京:科学出版社,2016.7

[2] 王中群.MATLAB建模与仿真应用.北京:机械工业出版社,1010

[3]聂晓燕.信号与系统分析.北京:人民邮电出版社,2014.8

[4]Oppenheim Alan V.Willsky Alan s.Signals and Systems[M].2en ed.Prentice-Hall,Inc,1997

[5] 张焱.张杰.黄志同.语音识别中动态时间规整和隐马尔可夫统一模型.数据采集与处理 1997年03期 p.218-222

[6] 何强.何英.MATLAB扩展编程[M].北京:清华大学出版社,2002.6

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除

你可能感兴趣的:(图像处理,语音识别,算法,matlab)