编程实现语音处理中的DTW算法_第1页
编程实现语音处理中的DTW算法_第2页
编程实现语音处理中的DTW算法_第3页
编程实现语音处理中的DTW算法_第4页
编程实现语音处理中的DTW算法_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、编程实现语音处理中的DTW算法在孤立词语音识别中,最为简单有效的方法是采用DTW(Dynamic Time Warping,动态时间归整)算法,该算法基于动态规划(DP)的思想,解决了发音长短不一的模板匹配问题,是语音识别中出现较早、较为经典的一种算法。用于孤立词识别,DTW算法与HMM算法在训练阶段需要提供大量的语音数据,通过反复计算才能得到模型参数,而DTW算法的训练中几乎不需要额外的计算。所以在孤立词语音识别中,DTW算法仍然得到广泛的应用。无论在训练和建立模板阶段还是在识别阶段,都先采用端点算法确定语音的起点和终点。已存入模板库的各个词条称为参考模板,一个参考模板可表示为R=R(1),

2、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表示,为了比较它们之间的相似度,可以计算它们之间的距离 DT,R

3、,距离越小则相似度越高。为了计算这一失真距离,应从T和R中各个对应帧之间的距离算起。设n和m分别是T和R中任意选择的帧号,dT(n),R(m)表示这两帧特征矢量之间的距离。距离函数取决于实际采用的距离度量,在DTW算法中通常采用欧氏距离。若N=M则可以直接计算,否则要考虑将T(n)和R(m)对齐。对齐可以采用线性扩张的方法,如果N<M可以将T线性映射为一个M帧的序列,再计算它与R(1),R(2),R(M)之间的距离。但是这样的计算没有考虑到语音中各个段在不同情况下的持续时间会产生或长或短的变化,因此识别效果不可能最佳。因此更多的是采用动态规划(DP)的方法。如果把测试模板的各个帧号n=1

4、N在一个二维直角坐标系中的横轴上标出,把参考模板的各帧号m=1M在纵轴上标出,通过这些表示帧号的整数坐标画出一些纵横线即可形成一个网络,网络中的每一个交叉点(n,m)表示测试模式中某一帧的交汇点。DP算法可以归结为寻找一条通过此网络中若干格点的路径,路径通过的格点即为测试和参考模板中进行计算的帧号。路径不是随意选择的,首先任何一种语音的发音快慢都有可能变化,但是其各部分的先后次序不可能改变,因此所选的路径必定是从左下角出发,在右上角结束,如图下图所示。 为了描述这条路径,假设路径通过的所有格点依次为(n ,m ),(n ,m ),(n ,m ),其中(n ,m )=(1,1),(n ,m )=

5、(N,M)。路径可以用函数m =Ø(n )描述,其中n =i,i=1,2,N,Ø(1)=1,Ø(N)=M。为了使路径不至于过倾斜,可以约束斜率在0.52的范围内,如果路径已经通过了格点(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 )

6、点出发,可以展开若干条满足的路径,假设可计算每条路径达到(n ,m )点时的总的积累距离,具有最小累积距离者即为最佳路径。易于证明,限定范围的任一格点(n ,m )只可能有一条搜索路径通过。对于(ni,mi),其可达到该格点的前一个格点只可能是(n ,m )、(n ,m -1)和(n ,m -2),那么(n ,m )一定选择这3个距离之路径延伸而通过(n ,m ),这时此路径的积累距离为: D(n ,m )=dT(n ),R(m )+D(n , m ) 其中的n = n -1 ,m -1由下式决定: D(n ,m )=minD(n , m ),D(n , m -1),D(n , m -2) 这

7、样可以从(n ,m )=(1,1)出发搜索(n ,m ),再搜索(n ,m ),对每一个(n ,m )都存储相应的前一格点(n ,m )及相应的帧匹配距离dn ,m 。搜索到(n ,m )时,只保留一条最佳路径。如果有必要的话,通过逐点向前寻找就可以求得整条路径。这套DP算法便是DTW算法。 DTW算法可以直接按上面的描述来实现,即分配两个N×M的矩阵,分别为积累距离矩阵D和帧匹配距离矩阵d,其中帧匹配距离矩阵d(i,j)的值为测试模板的第a帧与参考模板的第j帧间的距离。D(N,M)即为最佳匹配路径所对应的匹配距离。Matlab程序的实现:实现DTW算法的函数Dtw.mfunctio

8、n dist = dtw(t,r) n = size(t,1); m = size(r,1); % 帧匹配距离矩阵 d = zeros(n,m); for i = 1:n for j = 1:m  d(i,j) = sum(t(i,:)-r(j,:).2); end end % 累积距离矩阵 D = ones(n,m) *realmax;D(1,1) = d(1,1); % 动态规划 for i = 2:n for j = 1:m  D1 = D(i-1,j);  if j>1   D2 = D(i-1,j-1); else D2 = r

9、ealmax;  end  if j>2   D3 = D(i-1,j-2); else D3 = realmax;  end  D(i,j) = d(i,j) + min(D1,D2,D3); end end dist = D(n,m); 程序中,首先申请两个n×m的距阵D和d,分别为累积距离和帧匹配距离。这里n和m为测试模板与参考模板的帧数。然后通过一个循环计算两个模板的帧匹配距离距阵d。接下来进行动态规划,为每个格点(i,j)都计算其三个可能的前续格点的累积距离D1、D2和D3。考虑到边界问题,有些前续格点可能不

10、存在,因此要加入一些判断条件。 最后利用最小值函数min,找到三个前续格点的累积距离的最小值作为累积距离,与当前帧的匹配距离d(i,j)相加,作为当前格点的累积距离。该计算过程一直达到格点(n,m),并将D(n,m)输出,作为模板匹配的结果。 DTW算法也可以用C语言程序实现:/* function dist=dtw(t,r) */ #include "stdio.h" #include <conio.h> #define m 4 #define n 6 #define realmax 9.9e38 void main() float zmin(float,fl

11、oat,float); float t64=      1.0,2.0,3.0,4.0,2.0,3.0,4.0,5.0,3.0,4.0,5.0,6.0, 4,5.0,6.0,7.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0 ; /*测试值*/ float r64= 1.0,2.0,3.0,4.0,8.0,2.0,6.0,2.0,7.0,2.0,7.0,3.0,     9.0,2.0,1.0,6.0,2.0,6.0,5.0,3.0,8.0,3.0,6.0,9.0   ; /*参

12、考值*/ int i,j,g,k; float sum1,D3,D4,D5,dist; float D1nm,sum=0.0; float D2nm; clrscr(); printf("nThis is . nn"); for (i=0;i<n;i+) for (j=0;j<m;j+)   D1ij=0; for (i=0;i<n;i+)  for (j=0;j<n;j+)     float x,y;   sum1=0.0;   for(g=0;g<m;g+)   x=t

13、ig;   y=rjg;   sum1+=(x-y)*(x-y);     D1ij=sum1; /*帧匹配距离*/   printf("D1%d%d=%fttt",i+1,j+1,D1ij);   putchar('n'); for (i=0;i<n;i+) for (j=0;j<m;j+)   D2ij=realmax;   D200=D100;   putchar('n'); for(i=1;i<n;i+) for(j=0;j&l

14、t;n;j+)  D3=D2i-1j; if(j>0)   D4=D2i-1j-1; else   D4=realmax;   if(j>1)    D5=D2i-1j-2;   else    D5=realmax; D2ij=D1ij+zmin(D3,D4,D5);   dist=D2i-1j-1; /*累积距离*/   printf("nndist=%fn",dist); float zmin(float a,float b, float c) /*求D3,D4,D5的最小值*/ float w,aa; aa=realmax; if(aa=b&&aa=c&&

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论