完整版DTW算法原理分析与源码Word文档格式.docx
- 文档编号:20746783
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:26
- 大小:29.75KB
完整版DTW算法原理分析与源码Word文档格式.docx
《完整版DTW算法原理分析与源码Word文档格式.docx》由会员分享,可在线阅读,更多相关《完整版DTW算法原理分析与源码Word文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
鉴于此,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)对齐。
对齐可以采用线性扩张的方法,如果N<
M可以将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.m
functiondist=dtw(t,r)
n=size(t,1);
m=size(r,1);
%帧匹配距离矩阵
d=zeros(n,m);
fori=1:
n
forj=1:
m
d(i,j)=sum((t(i,:
)-r(j,:
)).^2);
end
%累积距离矩阵
D=ones(n,m)*realmax;
D(1,1)=d(1,1);
%动态规划
fori=2:
D1=D(i-1,j);
ifj>
1
D2=D(i-1,j-1);
else
D2=realmax;
2
D3=D(i-1,j-2);
D3=realmax;
D(i,j)=d(i,j)+min([D1,D2,D3]);
dist=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的计算如下式:
也可能会出现Xa>
Xb的情况,此时弯折匹配的三段为(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_max
globaltr
globalDd
globalmn
t=test;
r=ref;
d=zeros(m,1);
D=ones(m,1)*realmax;
D
(1)=0;
%如果两个模板长度相差过多,匹配失败
if(2*m-n<
3)|(2*n-m<
2)
dist=realmax;
return
%计算匹配区域
xa=round((2*m-n)/3);
xb=round((2*n-m)*2/3);
ifxb>
xa
%xb>
xa,按下面三个区域匹配
%1:
%xa+1:
xb
%xb+1:
N
forx=1:
y_max=2*x;
y_min=round(0.5*x);
warp
forx=(xa+1):
y_max=round(0.5*(x-n)+m);
forx=(xb+1):
y_min=round(2*(x-n)+m);
elseifxa>
%xa>
xb,按下面三个区域匹配
%0:
elseifxa==xb
%xa=xb,按下面两个区域匹配
%返回匹配分数
dist=D(m);
functionwarp
d=D;
fory=y_min:
y_max
D1=D(y);
ify>
D2=D(y-1);
D3=D(y-2);
d(y)=sum((t(x,:
)-r(y,:
)).^2)+min([D1,D2,D3]);
D=d;
程序中首先进行两个模板长度的比较,如果长度差别太大,将返回一个很大的数realmax,表示匹配失败。
按下来计算Xa和Xb,根据两者大小的比较,将匹配区域划分为二段或三段。
对每一帧分别计算出y_min和y_max,调用函数warp进行匹配。
最后的结果保存在D中,而D(m)就是整个模板匹配的总累积距离。
3.3测试程序Testdtw.m
用测试程序Testdtw.m测试Dtw.m,其代码在下面。
disp('
正在计算参考模板的参数...'
)
fori=1:
10
fname=sprintf('
d:
\\matlab6p5\\work\\%da.wav'
i-1);
x=wavread(fname);
[x1x2]=vad(x);
m=lpc(x);
m=m(x1-2:
x2-2,:
);
ref(i).lpc=m;
正在计算测试模板的参数...'
d:
\\matlab6p5\\work\\%db.wav'
test(i).lpc=m;
正在进行模板匹配...'
dist=zeros(10,10);
forj=1:
dist(i,j)=dtw(test(i).lpc,ref(j).lpc);
正在计算匹配结果...'
[d,j]=min(dist(i,:
));
fprintf('
测试模板%d的识别结果为:
%d\n'
i,j);
程序中用到了20个wav文件,分别是0a.wav、1a.wav、……、9a.wav以及0b.wav、1b.wav、……、9b.wav,分别保存数码0到9的发音。
其中a结尾的10个文件作为参考模板,b结尾的0个文件作为测试模板。
首先用wavread函数读入wav文件,用lpc函数获得其lpc参数,用vad函数对其进行端点检测,并保存语音部分的lpc参数到参考模板的结构数组ref(i).lpc中或测试模板的结构数组test(i).lpc中。
模板匹配阶段,计算所有测试模板和参考模板之间的距离,保存到距阵dist中,将最后的匹配分数用min函数找到最小值对应的模板。
在Matlab上运行后,输出的结果为:
>
Testdtw
正在计算参考模板的参数...
正在计算测试模板的参数...
正在进行模板匹配...
正在计算匹配结果...
测试模板1的识别结果为:
测试模板2的识别结果为:
测试模板3的识别结果为:
3
测试模板4的识别结果为:
4
测试模板5的识别结果为:
5
测试模板6的识别结果为:
6
测试模板7的识别结果为:
7
测试模板8的识别结果为:
8
测试模板9的识别结果为:
9
测试模板10的识别结果为:
从输出的结果看,识别得到了正确的结果,为了进一步验证识别的正确性,看一下匹配距离距阵dist的数据:
dist
dist=
1.0e+004*
0.57411.85753.71642.75673.27322.49462.12081.85653.45301.7783
1.61830.62015.47114.00244.51693.84223.02561.43985.56603.4090
3.58795.27630.41471.44352.49243.15202.53713.50351.00292.9692
2.26573.62501.05110.54872.12232.25731.84052.56381.03032.0788
2.40523.91302.14181.80480.42342.96292.62612.56002.11392.2589
2.28963.24253.09962.78533.05290.50022.22293.23172.78731.9719
2.16923.83113.19972.61732.93062.44120.62072.96752.64891.5591
1.94282.24704.03262.69343.13623.66823.49820.75674.30602.6786
3.20844.73741.03191.47392.29922.91042.25093.84640.49462.5945
2.22314.43862.91132.57312.79942.28831.37793.65572.24120.3803
距离距阵的对角线上是正确匹配模板的对应分数,可见对角线上的10个数值都是在本行中最小的,由此验证了识别结果的正确性。
4DTW算法的研究和改进
4.1动态规划存在下列问题
(1)运算量大。
由于要找出最佳匹配点,因此要考虑多种可能的情况.虽然路径限制减少了运算晕,但运算量仍然很大,因而使识别速度减慢.这在大词汇量的识别中是一个严重缺点。
(2)识别性能过分依赖于端点检测.端点检测的精度随着不同音素而有所不同,有些音素的瑞点检测精度较低.由此影响识别率的提高.
(3)没有充分利用语音信号的时序动态信息。
观已提出多种方法来克服这一缺点.
4.2对端点检测算法的改进
对端点检测精度的敏感性是DTW算法主要缺陷之一。
解决的办法无非是两个,一个是从DTW算法本身出发,例如采用对前后端点的放松来降低其对端点的敏感性;
另一个是从DTW算法的外界出发,能够尽量精确地检测语音的端点。
笔者通过对短时窗函数和窗长的研究,提出一种能够比较精确检测端点的方法。
在检测语音信号的端点时,一般采用平均能量或平均幅度值与过零率相乘的方法来判断。
如果所取窗长度较小,显然能够比较精确地检测到语音的端点,但会使运算量加大识别速度减慢,同时会把一些短时的脉冲噪音误认为语音,从而产生错误的识别。
如果所取窗长较大,可以加快语音处理的速度,会跳过一些短时噪音,但是端点的检测误差增加,对DTW这种端点非常敏感的算法几乎是致命的。
窗长取一合适的中间值固然可以减少窗长过短和过长的消极影响,但毋庸置疑也减弱了其积极的一面。
笔者提出一种策略能够比较精确地检测端点,同时能避免窗长过短引起的弊端,并在实现的系统中采用了这一策略,取得了良好的效果。
窗长可变的语音策略及算法如图4-1所示
图4-1变窗长端点检测程序框图
4.3端点检测的抗噪性
考虑到计算机的工作环境在室外,因此在程序调试时特别增加了白噪声,结果发现加噪之后对端点检测影响比较大。
在一定强度的白噪声下,调好了作为端点检测的过零率和能量值,端点检测准确率达90%&
以上(与人直接观察语音波形检测端点相比),但当改变环境噪声后,端点的检测准确率则只有82%这样就提出了如何能适应环境的变化,改变因环境不同造成端点检测误差的问题。
经过研究,采用了如下方法,比较好地解决了这一问题。
单纯用过零率和能量值作为检测端点的手段,由于没有考虑到背景噪声,有不可避免的缺点。
采用当前帧与前一帧的过零率和能量值的差作为检验端点的标准就能很好地解决了背景噪声的问题。
4.4对孤立词算法的改进
传统的DTW算法虽然解决了语音识别中说话不均匀造成的语音信号非平稳特性,但还存在着许多问题,可以从以下几个方面加以改进。
4.4.1改进局部路径限制
局部路径的限制主要是解决畸形匹配的问题,传统DTW算法对路径限制较严格。
这样实现的系统对训练与测试时语音均匀度变化比较剧烈情况的处理不大合理。
笔者提出了一种局部路径限制的方法,对处理均匀度变化较剧烈的情况有比较明显的优势。
如图4-2所示,将匹配的跳变间隔增大为3。
图4-2改进的局部路径限制
4.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整版 DTW 算法 原理 分析 源码