DTW算法原理分析与源码

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

引言随着时代的发展,人们越来越注重生活的品质。便捷时尚成为当代人们的追求目标。现在,语音信号处理的技术趋于完善,语音识别技术的应用有两个发展方向:一个是大词汇量连续语音识别系统,主要应用于计算机的听写输入等;另一个是小型化﹑便携式语音模块的应用,如手机的拨号﹑汽车设备的语音控制等方面的应用,这些应用大多都需要使用硬件实现。在此次课程设计中,我们引用现今较为成熟的语音信号处理技术,设计一个简单的非实时语音信号识别系统。其主要技术指标是识别率和计算量,其关键是特征参数的提取和模式识别方法。测试模板将预先录制好的0-9的语音文件用按键方式输入,经过A/D转换芯片0809后转化为数字信号,在单片机AT89C52中,先用端点检测将语音中有用的语音部分提取出来(即将头部和尾部的静音部分除掉),然后用LPC算法提取语音信号的特征参数,进行动态归整(DTW算法)后与模板库里面的标准语音作比较,最后将识别结果进行D/A转化后播放出来。在本部分的设计中,则主要完成语音识别的模式匹配算法部分的软件实现。1为什么要用DTW算法孤立词识别方案主要有:(1)采用动态规划(DynamicProgramming)的方法。这是一种运算量较大,但技术上较简单,正识率也较高的方法。其中的失真测度可以用欧氏距离(适于短时谱或倒谱参数),也可以用对数似然比距离(适于LPC参数).决策方法可用最近邻域准则.(2)采用矢量量化(VectorQuantization)的方法.它既可用于语音通信中的波形或参数的压缩,也可用于语音识别.尤其有限状态矢量量化(FSVQJ)方法,对于语音识别更为有效。决策方法一般用最小平均失真准则。(3)采田隐马尔柯夫横型(HMM)的方法,该模型的参数既可以用离散概率分布函数,也可以用最新的连续概率密度函数(如:正态高斯密度,高斯自回归密度等)。决策方法则用最大后验概率准则.(4)采用混合技术的方法。例如:用矢量量化作为第一级识别(作为预处理,从而得出若干候选的识别结果),然后,再用DTW或HMM方法做最后的识别,因此,可有VQ/DTW和VQ/HMM等识别方法.目前,语音识别的匹配主要应用HMM和DTW两种算法。DTW算法由于没有一个有效地用统计方法进行训练的框架,也不容易将低层和顶层的各种知识用到语音识别算法中,因此在解决大词汇量、连续语音、非特定人语音识别问题时较之HMM算法相形见绌。HMM是一种用参数表示的,用于描述随机过程统计特性的概率模型。而对于孤立词识别,HMM算法和DTW算法在相同条件下,识别效果相差不大,又由于DTW算法本身既简单又有效,但HMM算法要复杂得多。它需要在训练阶段提供大量的语音数据,通过反复计算才能得到参数模型,而DTW算法的训练中几乎不需要额外的计算。鉴于此,DTW更适合本系统的要求。2DTW算法原理在孤立词语音识别中,最为简单有效的方法是采用DTW(DynamicTimeWarping,动态时间归整)算法,该算法基于动态规划(DP)的思想,解决了发音长短不一的模板匹配问题,是语音识别中出现较早、较为经典的一种算法。用于孤立词识别,DTW算法与HMM算法在训练阶段需要提供大量的语音数据,通过反复计算才能得到模型参数,而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,LPC系数)、相同的帧长、相同的窗函数和相同的帧移。假设测试和参考模板分别用T和R表示,为了比较它们之间的相似度,可以计算它们之间的距离D[T,R],距离越小则相似度越高。为了计算这一失真距离,应从T和R中各个对应帧之间的距离算起。设n和m分别是T和R中任意选择的帧号,d[T(n),R(m)]表示这两帧特征矢量之间的距离。距离函数取决于实际采用的距离度量,在DTW算法中通常采用欧氏距离。若N=M则可以直接计算,否则要考虑将T(n)和R(m)对齐。对齐可以采用线性扩张的方法,如果NM可以将T线性映射为一个M帧的序列,再计算它与{R(1),R(2),……,R(M)}之间的距离。但是这样的计算没有考虑到语音中各个段在不同情况下的持续时间会产生或长或短的变化,因此识别效果不可能最佳。因此更多的是采用动态规划(DP)的方法。如果把测试模板的各个帧号n=1~N在一个二维直角坐标系中的横轴上标出,把参考模板的各帧号m=1~M在纵轴上标出,通过这些表示帧号的整数坐标画出一些纵横线即可形成一个网络,网络中的每一个交叉点(n,m)表示测试模式中某一帧的交汇点。DP算法可以归结为寻找一条通过此网络中若干格点的路径,路径通过的格点即为测试和参考模板中进行计算的帧号。路径不是随意选择的,首先任何一种语音的发音快慢都有可能变化,但是其各部分的先后次序不可能改变,因此所选的路径必定是从左下角出发,在右上角结束,如图2-1所示。图2-1DTW算法搜索路径为了描述这条路径,假设路径通过的所有格点依次为(n,m),……,(n,m),……,(n,m),其中(n,m)=(1,1),(n,m)=(N,M)。路径可以用函数m=Ø(n)描述,其中n=i,i=1,2,……,N,Ø(1)=1,Ø(N)=M。为了使路径不至于过倾斜,可以约束斜率在0.5~2的范围内,如果路径已经通过了格点(n,m),那么下一个通过的格点(n,m)只可能是下列三种情况之一:(n,m)=(n+1,m+2)(n,m)=(n+1,m+1)(n,m)=(n+1,m)用r表示上述三个约束条件。求最佳路径的问题可以归结为满足约束条件r时,求最佳路径函数m=Ø(n),使得沿路径的积累距离达到最小值,即:搜索该路径的方法如下:搜索从(n,m)点出发,可以展开若干条满足ŋ的路径,假设可计算每条路径达到(n,m)点时的总的积累距离,具有最小累积距离者即为最佳路径。易于证明,限定范围的任一格点(n,m)只可能有一条搜索路径通过。对于(ni,mi),其可达到该格点的前一个格点只可能是(n,m)、(n,m-1)和(n,m-2),那么(n,m)一定选择这3个距离之路径延伸而通过(n,m),这时此路径的积累距离为:D[(n,m)]=d[T(n),R(m)]+D[(n,m)]其中的n=n-1,m-1由下式决定:D[(n,m)]=min{D[(n,m)],D[(n,m-1)],D[(n,m-2)]}这样可以从(n,m)=(1,1)出发搜索(n,m),再搜索(n,m),……,对每一个(n,m)都存储相应的前一格点(n,m)及相应的帧匹配距离d[n,m]。搜索到(n,m)时,只保留一条最佳路径。如果有必要的话,通过逐点向前寻找就可以求得整条路径。这套DP算法便是DTW算法。DTW算法可以直接按上面的描述来实现,即分配两个N×M的矩阵,分别为积累距离矩阵D和帧匹配距离矩阵d,其中帧匹配距离矩阵d(i,j)的值为测试模板的第i帧与参考模板的第j帧间的距离。D(N,M)即为最佳匹配路径所对应的匹配距离。3Matlab程序的实现3.1DTW的一般算法实现DTW算法的函数Dtw.mfunctiondist=dtw(t,r)n=size(t,1);m=size(r,1);%帧匹配距离矩阵d=zeros(n,m);fori=1:nforj=1:md(i,j)=sum((t(i,:)-r(j,:)).^2);endend%累积距离矩阵D=ones(n,m)*realmax;D(1,1)=d(1,1);%动态规划fori=2:nforj=1:mD1=D(i-1,j);ifj1D2=D(i-1,j-1);elseD2=realmax;endifj2D3=D(i-1,j-2);elseD3=realmax;endD(i,j)=d(i,j)+min([D1,D2,D3]);endenddist=D(n,m);程序中,首先申请两个n×m的距阵D和d,分别为累积距离和帧匹配距离。这里n和m为测试模板与参考模板的帧数。然后通过一个循环计算两个模板的帧匹配距离距阵d。接下来进行动态规划,为每个格点(i,j)都计算其三个可能的前续格点的累积距离D1、D2和D3。考虑到边界问题,有些前续格点可能不存在,因此要加入一些判断条件。最后利用最小值函数min,找到三个前续格点的累积距离的最小值作为累积距离,与当前帧的匹配距离d(i,j)相加,作为当前格点的累积距离。该计算过程一直达到格点(n,m),并将D(n,m)输出,作为模板匹配的结果。3.2DTW的高效算法由于匹配过程中限定了弯折的斜率,因此许多格点实际上是到达不了的,如图3-1所示。因此菱形之外的格点对应的帧匹配距离是不需要计算的。另外也没有必要、保存所有的帧匹配距离距阵和累积距阵,因为每一列各格点上的匹配计算只用到了前一列的三个网格。充分利用这两个特点可以减少计算量和储存空间的需要。如图3-1所示,把实际的动态弯折分为三段,(1,Xa),(Xa+1,Xb)和(Xb+1,N),其中:图3-1匹配路径约束示意图Xa和Xb都取相近的整数。由此也得出对M和N长度的限制条件:当不满足以上条件时,认为两者差别实在太大,无法进行动态弯折匹配。在X轴上的每一帧不再需要与Y轴上的每一帧进行比较,而只是与Y轴上[y,y]间的帧进行比较,y和y的计算如下式:也可能会出现XaXb的情况,此时弯折匹配的三段为(1,Xb),(Xb+1,Xa)和(Xa+1,N)。对于X轴上每前进一帧,虽然所要比较Y轴上的帧数不同,但弯折特性是一样的,累积距离的更新都是用下式实现的:由于X轴上每前进一帧,只需要用到前一列的累积距离距阵。每前进一帧都进行更新,即按上式利用前一列的累积距离D和当前列的所有帧匹配的距离d(x,y),求出当前帧的累积距离,保存于矢量d中,再把更新的距离d赋值给D,作为新的累积距离,供下一列使用。如图3-2所示。这样一直前进到X轴上最后一列,矢量D的第M个元素即为两个模板动态弯折的匹配距离。图3-2累积距离矢量的动态更新用这种方法实现的另一种DTW算法的代码如下:functiondist=dtw(test,ref)globalxy_miny_maxglobaltrglobalDdglobalmnt=test;r=ref;n=size(t,1);m=size(r,1);d=zeros(m,1);D=ones(m,1)*realmax;D(1)=0;%如果两个模板长度相差过多,匹配失败if(2*m-n3)|(2*n-m2)dist=realmax;returnend%计算匹配区域xa=round((2*m-n)/3);xb=round((2*n-m)*2/3);ifxbxa%xbxa,按下面三个区域匹配%1:xa%xa+1:xb%xb+1:Nforx=1:xay_max=2*x;y_min=round(0.5*x);warpendforx=(xa+1):xby_max=round(0.5*(x-n)+m);y_min=round(0.5*x);warpendforx=(xb+1):ny_max=round(0.5*(x-n)+m);y_min=round(2*(x-n)+m);warpendelseifxaxb%xaxb,按下面三个区域匹配%0:xb%xb+1:xa%xa+1:Nforx=1:xby_max=2*x;y_min=round(0.5*x);warpendforx=(x

1 / 28
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功