DTW算法原理分析与源码
- 格式:doc
- 大小:89.00 KB
- 文档页数:28
基于DTW算法的手势识别技术研究手势识别技术近年来得到了广泛的应用和迅猛的发展。
手势识别技术可以将人类的自然语言和手势转化成为计算机可以识别处理的数字信息,从而实现人机交互的自然化和智能化。
在生活中,我们可以利用手势识别技术控制手机或电脑的操作,进行语音输入、翻页、拍照等等,降低人与机器之间的交互门槛。
在手势识别技术中,基于动态时间规整(DTW)算法的手势识别技术具有广泛的应用前途和优势。
DTW算法是一种时间序列相似度度量方法,可以解决时间序列对齐、相似度比较、模式识别等多种实际问题。
在手势识别中,DTW算法可以将一些无序和连续的手势动作形成一个序列,然后通过DTW算法,将不同的手势序列进行时间对齐,并比较其相似度,从而实现手势识别的目的。
DTW算法的基本原理是:对于两条时间序列,设第一条时间序列为X=(x1,x2,......,xn),第二条时间序列为Y=(y1,y2,......,ym),其长度分别为n和m。
DTW算法的目标是将X序列对齐到Y序列中,在对齐时要求每个时间点上的距离之和最小。
具体实现中,DTW算法可以分为两个步骤:第一步是通过一个动态规划的过程,构建一个距离矩阵D(i,j),表示第一个序列中第i个元素和第二个序列中第j个元素之间的距离。
第二步是寻找一条从D(1,1)到D(n,m)的最小路径,使得路径上的点对应的距离之和最小。
通过这个路径,DTW算法可以得到X序列对齐到Y序列中时最小的时间差距,从而认为这两个序列是相似的。
基于DTW算法的手势识别技术的实现主要包括三个方面:手势数据采集、手势数据处理和手势识别分类。
在手势数据采集方面,我们需要用相机或者传感器等设备采集人类手势行为的动态信息,获得手势动作序列。
在手势数据处理方面,我们需要对原始的手势动作序列进行预处理,包括数据归一化、滤波处理等。
在手势识别分类方面,我们需要利用训练好的分类器,将预处理后的手势序列与训练集中的手势样本进行比较,并识别出相应的手势类型。
动态时间规整计算例子
动态时间规整(DTW,Dynamic Time Warping)是一种用于测量两个时间序列之间相似度的方法,即使两个序列在时间和速度上有所不同,也可以计算它们的相似度。
以下是一个简单的动态时间规整(DTW)计算例子:假设我们有两个时间序列:
●序列A:[1,3,4,2,5]
●序列B:[1,2,2,4,3,5]
现在我们想要计算这两个序列之间的相似度,我们可以使用动态时间规整算法来进行计算。
步骤:
1.创建距离矩阵:计算两个序列中每对点之间的距离(如欧氏距离、曼哈顿距
离等)。
2.初始化动态规划矩阵:创建一个矩阵来存储计算过程中的临时值。
3.动态规划计算:根据以下规则填充动态规划矩阵:
●初始化第一行和第一列为无穷大,矩阵第一行和第一列的值代表A或B的子
序列和空序列之间的最小距离。
●对于矩阵中的其他位置,计算当前位置的值为当前位置值与相邻三个位置中
的最小值(即对角线、上方、左方)加上当前位置的距离。
4.回溯路径:根据动态规划矩阵,找出路径,得到最小距离。
在示例中,我们可以通过手动计算或编写代码来执行动态时间规整算法,计算序列A和序列B之间的距离。
这个例子可以帮助理解DTW算法是如何在时间序列相似度比较中工作的。
标准化动态时间规整(DTW)距离是一种用于衡量时间序列相似性的方法,它在许多领域都有着广泛的应用,包括语音识别、手写体识别、生物信息学、金融时间序列分析等。
DTW距离可以帮助我们度量两个时间序列之间的相似程度,即使它们的长度不同或者存在一定程度的畸变。
在实际应用中,为了更准确地比较不同数据集之间的相似性,需要对DTW距离进行标准化处理。
本文将详细介绍标准化DTW距离的概念、计算方法以及在实际应用中的意义。
一、动态时间规整(DTW)距离简介动态时间规整是一种用于比较两个时间序列之间的相似性的方法,它可以解决在比较过程中时间序列长度不一致或者存在一定程度畸变的情况。
DTW算法的基本思想是通过将时间序列进行弯曲、拉伸等变换,找到它们之间的最佳匹配路径,从而得到它们之间的相似度。
在DTW 算法中,距离越小表示两个时间序列越相似。
二、标准化DTW距离的概念标准化DTW距离是指在计算DTW距离的基础上,对其进行标准化处理,以便更好地比较不同数据集之间的相似性。
由于原始的DTW距离受到时间序列长度和幅度的影响,在不同数据集之间进行比较时可能存在一定的偏差。
因此,需要对DTW距离进行标准化,消除这些影响,使得不同数据集之间的比较更加客观和准确。
三、标准化DTW距离的计算方法标准化DTW距离的计算方法可以通过以下步骤实现:1. 计算原始的DTW距离:首先,对给定的两个时间序列应用DTW算法,计算它们之间的原始DTW距离。
2. 标准化处理:对计算得到的原始DTW距离进行标准化处理,消除时间序列长度和幅度的影响。
常用的标准化方法包括z-score标准化、min-max标准化等。
在进行标准化处理时,需要考虑不同数据集的特点以及所处的应用场景,选择合适的标准化方法进行处理。
标准化后的DTW距离可以更好地反映时间序列之间的相似性,使得不同数据集之间的比较更加客观和准确。
四、标准化DTW距离在实际应用中的意义标准化DTW距离在实际应用中具有重要意义:1. 提高比较的准确性:标准化DTW距离消除了时间序列长度和幅度的影响,可以更准确地比较不同数据集之间的相似性,提高了比较的准确性。
DTW(动态时间规整)是一种用于序列匹配的算法,尤其在语音识别和手势识别等领域有广泛应用。
下面是DTW的数学模型:
假设有两个序列X和Y,长度分别为N和M,我们要找到一个时间规整函数w(t),使得X经过w(t)规整后与Y相似度最高。
定义距离矩阵D,其中D[i][j]表示X[i]和Y[j]之间的距离,通常采用欧式距离。
定义路径矩阵W,其中W[k] = (i, j)表示第k个路径点对应的X和Y的索引。
定义规整函数w(t),其中w(0)=0,w(t)单调递增,且w(N)=M。
DTW算法的目标是寻找一条从(0,0)到(N,M)的最短路径,使得路径上各个点之间的距离之和最小。
即求解以下问题:
min∑k=1KD[W[k-1]][W[k]]+d[X[w(k-1)][Y[W[k]]](1)
其中k表示路径上的第k个点,K表示路径上的点数,D表示距离矩阵,W表示路径矩阵,X和Y分别表示序列X和Y的元素。
根据连续性和边界条件,W[k]=(i,j)必须满足以下条件:
i-w(k-1)<=1,即X的索引只能向后移动一位。
j-W[k-1][2]<=1,即Y的索引只能向后移动一位。
w(k-1)<=i<=N,即X的索引必须在规整函数的作用范围内。
W[k-1][1]<=j<=M,即Y的索引必须在规整函数的作用范围内。
通过动态规划的方式,可以求解出最短路径W和规整函数w(t)。
最终的相似度可以定义为:
sim(X,Y)=minw(t)∑Ni=1∑Mj=1D[i][j]+d[X[i][Y[j]]](2)
其中sim(X,Y)表示序列X和Y的相似度,w(t)为规整函数。
dtw 算法结构化词义
【最新版】
目录
1.DTW 算法概述
2.结构化词义的含义
3.DTW 算法在结构化词义分析中的应用
4.DTW 算法的优势与局限性
正文
1.DTW 算法概述
DTW(Dynamic Time Warping)算法,即动态时间规整算法,是一种
基于时间的序列匹配算法。
它主要用于解决时间序列数据之间的相似度问题,如语音识别、字符识别和图像处理等领域。
DTW 算法通过计算两个时间序列之间的最短路径来评估它们之间的相似性。
2.结构化词义的含义
结构化词义是指词汇在语义结构中的位置和关系。
在自然语言处理中,结构化词义分析是指根据语义结构对词汇进行分析,从而得到词汇的结构化表示。
这种表示有助于计算机更好地理解词汇的含义和上下文关系。
3.DTW 算法在结构化词义分析中的应用
DTW 算法在结构化词义分析中的应用主要体现在对词汇的时间序列
建模。
首先,将词汇的语义结构转换为一个时间序列模型,其中每个节点表示一个词汇,每个节点的属性表示该词汇的语义特征。
接下来,通过计算不同词汇时间序列模型之间的 DTW 距离,来评估它们在结构化词义上
的相似性。
4.DTW 算法的优势与局限性
DTW 算法的优势在于能够处理不同长度的序列,并且对数据中的噪声具有较强的鲁棒性。
然而,DTW 算法也存在局限性,例如计算复杂度较高,对计算资源的需求较大;同时,在处理非线性序列时可能效果不佳。
总之,DTW 算法在结构化词义分析中具有重要作用,通过计算词汇时间序列模型之间的相似度,有助于揭示词汇在语义结构中的关系。
编程实现语音处理中的DTW算法在孤立词语音识别中,最为简单有效的方法是采用DTW(Dynamic Time Warping,动态时间归整)算法,该算法基于动态规划(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)}之间的距离。
dtw算法归一化
DTW(动态时间规整)算法的归一化是为了提高算法的鲁棒性,并减少不同量纲和范围的数据对距离计算的影响。
以下是关于dtw算法归一化的详细信息:
1. Z-归一化:在应用DTW之前,常见的做法是对时间序列进行z-归一化处理。
这一步骤涉及将数据按其平均值和标准差缩放,以确保数据具有零均值和单位方差。
这有助于确保不同的时间序列可以在相同的尺度上进行比较。
2. 局部归一化:在DTW算法中,可以对子序列进行局部归一化。
这意味着在计算过程中,仅对参与当前距离计算的子序列片段进行归一化,而不是对整个序列一次性完成。
这种方法通常涉及到计算子序列的均值和方差,然后使用这些统计值来归一化子序列。
3. 抗干扰能力:归一化后的数据具有更强的抗干扰能力,因为它减少了异常值或量纲不同带来的影响,使得DTW算法更加稳健。
4. 优化方法:除了基本的归一化技术,还有一些其他优化方法可以用于加速DTW计算,例如计算下界(Lower Bounding)以减少需要进行的距离计算数量。
综上所述,DTW算法中的归一化是一个重要步骤,它有助于提高算法的准确性和效率。
通过适当的归一化处理,可以确保时间序列数据在进行DTW距离度量时处于同一尺度,从而得到更可靠的相似度评估。
语⾳信号处理之(⼀)动态时间规整(DTW)语⾳信号处理之(⼀)动态时间规整(DTW)这学期有《语⾳信号处理》这门课,快考试了,所以也要了解了解相关的知识点。
呵呵,平时没怎么听课,现在只能抱佛脚了。
顺便也总结总结,好让⾃⼰的知识架构清晰点,也和⼤家分享下。
下⾯总结的是第⼀个知识点:DTW。
因为花的时间不多,所以可能会有不少说的不妥的地⽅,还望⼤家指正。
谢谢。
Dynamic Time Warping(DTW)诞⽣有⼀定的历史了(⽇本学者Itakura提出),它出现的⽬的也⽐较单纯,是⼀种衡量两个长度不同的时间序列的相似度的⽅法。
应⽤也⽐较⼴,主要是在模板匹配中,⽐如说⽤在孤⽴词语⾳识别(识别两段语⾳是否表⽰同⼀个单词),⼿势识别,数据挖掘和信息检索等中。
⼀、概述在⼤部分的学科中,时间序列是数据的⼀种常见表⽰形式。
对于时间序列处理来说,⼀个普遍的任务就是⽐较两个序列的相似性。
在时间序列中,需要⽐较相似性的两段时间序列的长度可能并不相等,在语⾳识别领域表现为不同⼈的语速不同。
因为语⾳信号具有相当⼤的随机性,即使同⼀个⼈在不同时刻发同⼀个⾳,也不可能具有完全的时间长度。
⽽且同⼀个单词内的不同⾳素的发⾳速度也不同,⽐如有的⼈会把“A”这个⾳拖得很长,或者把“i”发的很短。
在这些复杂情况下,使⽤传统的欧⼏⾥得距离⽆法有效地求的两个时间序列之间的距离(或者相似性)。
例如图A所⽰,实线和虚线分别是同⼀个词“pen”的两个语⾳波形(在y轴上拉开了,以便观察)。
可以看到他们整体上的波形形状很相似,但在时间轴上却是不对齐的。
例如在第20个时间点的时候,实线波形的a点会对应于虚线波形的b’点,这样传统的通过⽐较距离来计算相似性很明显不靠谱。
因为很明显,实线的a点对应虚线的b点才是正确的。
⽽在图B中,DTW就可以通过找到这两个波形对齐的点,这样计算它们的距离才是正确的。
也就是说,⼤部分情况下,两个序列整体上具有⾮常相似的形状,但是这些形状在x轴上并不是对齐的。
两条轨迹相似度算法
1. DTW(Dynamic Time Warping)
DTW是一种基于时间序列相似度的算法,它比较两个序列之间的相似度,可以解决序列在时间轴上的非线性对齐问题。
该算法将两个序列映射到一个二维网格中,然后在网格中计算最短路径,路径上的点即为相似的点。
DTW可以应用于识别音频、手写字体等。
2. LCS(Longest Common Subsequence)
LCS是一种寻找最长公共子序列的算法,是一个广泛应用于字符串匹配的算法。
在两个序列的相似度计算中,可以将序列转化为字符串,然后使用LCS算法求解最长公共子序列。
LCS算法的时间复杂度较低,且适用于处理较短的序列。
缺点是无法处理序列的形变和非线性对齐问题。
附录2:训练函数:train.mdisp('正在生成训练参数……');for i=1:20fname=sprintf('train\\%d0.wav',i);[k,fs]=audioread(fname);[StartPoint,EndPoint]=vad_m(k,fs);cc=mfcc(k);cc=cc(StartPoint-2:EndPoint-2,:);ref(i+1).StartPoint=StartPoint;ref(i+1).EndPoint=EndPoint;ref(i+1).mfcc=cc;enddisp('正在存储模板库……');save 'mfcc.mat' ref;disp('存储完毕')附录3:测试函数:dtwtest.mclear;close all;clc;disp('正在导入参考模板参数...');load mfcc.mat;disp('正在计算测试模板的参数...')for i=0:3fname = sprintf('test\\%d1.wav',i);[k,fs]=audioread(fname);[StartPoint,EndPoint]=vad_m(k,fs);cc=mfcc(k);cc=cc(StartPoint-2:EndPoint-2,:);test(i+1).StartPoint=StartPoint;test(i+1).EndPoint=EndPoint;test(i+1).mfcc=cc;enddisp('正在进行模板匹配...')dist = zeros(1,20);for i=1:4for j=1:20dist(i,j) = dtw(test(i).mfcc, ref(j).mfcc);endenddisp('正在计算匹配结果...')for i=1:4[d,j] = min(dist(i,:));if (j>=1 && j<=5)fprintf('测试模板%d1.wav 的识别结果为:前进\n',i-1);endif (j>= 6 && j<=10)fprintf('测试模板%d1.wav 的识别结果为:停止\n',i-1);endif (j>=11 && j<=15)fprintf('测试模板%d1.wav 的识别结果为:左转\n',i-1);endif (j>=16 && j<=20)fprintf('测试模板%d1.wav 的识别结果为:右转\n',i-1);endendclose all;附录4:特征提取函数:vad_m.mfunction [StartPoint,EndPoint]=vad(k,fs)%% [StartPoint,EndPoint]=vad(k,fs)%% 语音信号端点检测程序,k为语音信号,%% fs为其采样频率,程序绘制出语音信号%% 相关波形图并返回起止端点所对帧号close all% 幅度归一化到[-1,1]k=double(k);k=k./max(abs(k));%------------------------------% 显示波形%------------------------------SNR=5; % 设置SNRsignal=Gnoisegen(k,SNR); % 叠加噪声snr1=SNR_singlech(k,signal); % 计算叠加噪声后的信噪比N=length(k); % 信号长度t=(0:N-1)/fs; % 设置时间IS=.25; % 设置IS% 调用WienerScalart96m_2函数做维纳滤波output=WienerScalart96m_2(signal,fs,IS,0.12);ol=length(output); % 把output补到与x等长if ol<Noutput=[output; zeros(N-ol,1)];endsnr2=SNR_singlech(k,output); % 计算维纳滤波后的信噪比snr=snr2-snr1;fprintf('snr1=%5.4f snr2=%5.4f snr=%5.4f\n',snr1,snr2,snr); subplot 311; plot(t,k,'k'); grid; axis tight;title('纯语音波形'); ylabel('幅值')subplot 312; plot(t,signal,'k'); grid; axis tight;title(['带噪语音信噪比=' num2str(SNR) 'dB']); ylabel('幅值')subplot 313; plot(t,output,'k');grid; ylim([-1 1]);title('维纳滤波后波形'); ylabel('幅值'); xlabel('时间/s');disp('显示原始波形图……');t=0:1/fs:(length(k)-1)/fs;% subplot(3,1,1);plot(t,k);axis([0,(length(k)-1)/fs,min(k),max(k)]);title('语音信号波形');xlabel('Time:s');ylabel('Amplitude(normalized)');disp('显示语音起始处放大波形图……');t1=0.2:1/fs:0.3;k1=k(0.2*fs:0.3*fs);subplot(3,1,2);plot(t1,k1);axis([0.2,0.3,min(k),max(k)]);title('(II) “00.wav”语音起始处放大波形图');xlabel('Time:s');ylabel('Amplitude(normalized)');disp('显示语音结束处放大波形图……');t1=0.4:1/fs:0.5;k1=k(0.4*fs:0.5*fs);subplot(3,1,3);plot(t1,k1);axis([0.4,0.5,min(k),max(k)]);title('(III) “00.wav”语音结束处放大波形图');xlabel('Time:s');ylabel('Amplitude(normalized)');%------------------------------% 计算短时过零率%------------------------------k=output;FrameLen=240;FrameInc=80;FrameTemp1=enframe(k(1:end-1),FrameLen,FrameInc);FrameTemp2=enframe(k(2:end),FrameLen,FrameInc);signs=(FrameTemp1.*FrameTemp2)<0;diffs=abs(FrameTemp1-FrameTemp2)>0.01;zcr=sum(signs.*diffs,2);zcrm=multimidfilter(zcr,5);disp('显示原始波形图……');figure,subplot(3,1,1);plot(t,k);axis([0,(length(k)-1)/fs,min(k),max(k)]);title('(I) 语音信号波形');xlabel('Time:s');ylabel('Amplitude(normalized)');disp('显示短时过零率……')zcrInd=1:length(zcrm);subplot(3,1,2);plot(zcrInd,zcr);axis([0,length(zcr),0,max(zcr)]);title('(II) 短时过零率');xlabel('Frame');ylabel('Zcr');%------------------------------% 计算短时能量%------------------------------amp=sum(abs(enframe(filter([1 -0.9375], 1, k), FrameLen, FrameInc)), 2); ampm=multimidfilter(amp,5);disp('显示短时能量……')ampInd=1:length(ampm);subplot(3,1,3);plot(ampInd,amp);axis([0,length(amp),0,max(amp)]);title('(III) 短时能量');xlabel('Frame');ylabel('Energy');% ------------------------------% 设置门限%------------------------------disp('设置门限……');ZcrLow=max([round(mean(zcr)*0.1),3]); %过零率低门限ZcrHigh=max([round(max(zcr)*0.1),5]); %过零率高门限AmpLow=min([min(amp)*10,mean(amp)*0.2,max(amp)*0.1]); %能量低门限AmpHigh=max([min(amp)*10,mean(amp)*0.2,max(amp)*0.1]); %能量高门限%------------------------------% 端点检测%------------------------------MaxSilence=30; %最长语音间隙时间MinAudio=15; %最短语音时间Status=0; %状态:0静音段,1过渡段,2语音段,3结束段HoldTime=0; %语音持续时间SilenceTime=0; %语音间隙时间disp('开始端点检测……');for n=1:length(zcr)switch Statuscase{0,1}if amp(n)>AmpHigh | zcr(n)>ZcrHighStartPoint=n-HoldTime;Status=2;HoldTime=HoldTime+1;SilenceTime=0;elseif amp(n)>AmpLow | zcr(n)>ZcrLowStatus=1;HoldTime=HoldTime+1;elseStatus=0;HoldTime=0;endcase 2,if amp(n)>AmpLow | zcr(n)>ZcrLowHoldTime=HoldTime+1;elseSilenceTime=SilenceTime+1;if SilenceTime<MaxSilenceHoldTime=HoldTime+1;elseif (HoldTime-SilenceTime)<MinAudioStatus=0;HoldTime=0;SilenceTime=0;elseStatus=3;endendcase 3,break;endif Status==3break;endendHoldTime =HoldTime-SilenceTime;EndPoint=StartPoint+HoldTime;disp('显示端点……');figure,subplot(3,1,1);plot(k);axis([1,length(k),min(k),max(k)]);title('(I) 语音信号');xlabel('Sample');ylabel('Speech');line([StartPoint*FrameInc,StartPoint*FrameInc],[min(k),max(k)],'color','red'); line([EndPoint*FrameInc,EndPoint*FrameInc],[min(k),max(k)],'color','red'); subplot(3,1,2);plot(zcr);axis([1,length(zcr),0,max(zcr)]);title('(II) 短时过零率');xlabel('Frame');ylabel('ZCR');line([StartPoint,StartPoint],[0,max(zcr)],'Color','red'); line([EndPoint,EndPoint],[0,max(zcr)],'Color','red'); subplot(3,1,3);plot(amp);axis([1,length(amp),0,max(amp)]);title('(III) 短时能量');xlabel('Frame');ylabel('Energy');line([StartPoint,StartPoint],[0,max(amp)],'Color','red'); line([EndPoint,EndPoint],[0,max(amp)],'Color','red');附录5:DTW算法function dist = dtw(test, ref)global x y_min y_maxglobal t rglobal D dglobal m nt = 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-n<3) | (2*n-m<2)dist = realmax;returnend% 计算匹配区域xa = round((2*m-n)/3);xb = round((2*n-m)*2/3);if xb>xa%xb>xa, 按下面三个区域匹配% 1 :xa% xa+1:xb% xb+1:Nfor x = 1:xay_max = 2*x;y_min = round(0.5*x);warpendfor x = (xa+1):xby_max = round(0.5*(x-n)+m);y_min = round(0.5*x);warpendfor x = (xb+1):ny_max = round(0.5*(x-n)+m);y_min = round(2*(x-n)+m);warpendelseif xa>xb%xa>xb, 按下面三个区域匹配% 0 :xb% xb+1:xa% xa+1:Nfor x = 1:xby_max = 2*x;y_min = round(0.5*x);warpendfor x = (xb+1):xay_max = 2*x;y_min = round(2*(x-n)+m);warpendfor x = (xa+1):ny_max = round(0.5*(x-n)+m);y_min = round(2*(x-n)+m);warpendelseif xa==xb%xa=xb, 按下面两个区域匹配% 0 :xa% xa+1:Nfor x = 1:xay_max = 2*x;y_min = round(0.5*x);warpendfor x = (xa+1):ny_max = round(0.5*(x-n)+m);y_min = round(2*(x-n)+m);warpendend%返回匹配分数dist = D(m);function warpglobal x y_min y_maxglobal t rglobal D dglobal m nd = D;for y = y_min:y_maxD1 = D(y);if y>1D2 = D(y-1);elseD2 = realmax;endif y>2D3 = D(y-2);elseD3 = realmax;endd(y) = sum((t(x,:)-r(y,:)).^2) + min([D1,D2,D3]); endD = d;。
引言 随着时代的发展,人们越来越注重生活的品质。便捷时尚成为当代人们的追求目标。现在,语音信号处理的技术趋于完善,语音识别技术的应用有两个发展方向:一个是大词汇量连续语音识别系统,主要应用于计算机的听写输入等;另一个是小型化﹑便携式语音模块的应用,如手机的拨号﹑汽车设备的语音控制等方面的应用,这些应用大多都需要使用硬件实现。
在此次课程设计中,我们引用现今较为成熟的语音信号处理技术,设计一个简单的非实时语音信号识别系统。其主要技术指标是识别率和计算量,其关键是特征参数的提取和模式识别方法。测试模板将预先录制好的0-9的语音文件用按键方式输入,经过A/D转换芯片0809后转化为数字信号,在单片机AT89C52中,先用端点检测将语音中有用的语音部分提取出来(即将头部和尾部的静音部分除掉),然后用LPC算法提取语音信号的特征参数,进行动态归整(DTW算法)后与模板库里面的标准语音作比较,最后将识别结果进行D/A转化后播放出来。在本部分的设计中,则主要完成语音识别的模式匹配算法部分的软件实现。
1 为什么要用DTW算法 孤立词识别方案主要有: (1)采用动态规划(Dynamic Programming)的方法。这是一种运算量较大,但技术上较简单,正识率也较高的方法。其中的失真测度可以用欧氏距离(适于短时谱或倒谱参数),也可以用对数似然比距离(适于LPC参数).决策方法可用最近邻域准则.
(2)采用矢量量化(Vector Quantization)的方法.它既可用于语音通信中的波形或参数的压缩,也可用于语音识别.尤其有限状态矢量量化(FSVQJ)方法,对于语音识别更为有效。决策方法一般用最小平均失真准则。
(3)采田隐马尔柯夫横型(HMM)的方法,该模型的参数既可以用离散概率分布函数,也可以用最新的连续概率密度函数(如:正态高斯密度,高斯自回归密度等)。决策方法则用最大后验概率准则.
(4)采用混合技术的方法。例如:用矢量量化作为第一级识别(作为预处理,从而得出若干候选的识别结果),然后,再用DTW或HMM方法做最后的识别,因此,可有VQ/DTW和VQ/HMM等识别方法.
目前,语音识别的匹配主要应用HMM和DTW两种算法。DTW算法由于没有一个有效地用统计方法进行训练的框架,也不容易将低层和顶层的各种知识用到语音识别算法中,因此在解决大词汇量、连续语音、非特定人语音识别问题时较之HMM算法相形见绌。HMM是一种用参数表示的,用于描述随机过程统计特性的概率模型。而对于孤立词识别,HMM算法和DTW算法在相同条件下,识别效果相差不大, 又由于DTW算法本身既简单又有效,但HMM算法要复杂得多。它需要在训练阶段提供大量的语音数据,通过反复计算才能得到参数模型,而DTW算法的训练中几乎不需要额外的计算。鉴于此,DTW更适合本系统的要求。 2 DTW算法原理 在孤立词语音识别中,最为简单有效的方法是采用DTW(Dynamic Time Warping,动态时间归整)算法,该算法基于动态规划(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之间的距离。但是这样的计算没有考虑到语音中各个段在不同情况下的持续时间会产生或长或短的变化,因此识别效果不可能最佳。因此更多的是采用动态规划(DP)的方法。
如果把测试模板的各个帧号n=1~N在一个二维直角坐标系中的横轴上标出,把参考模板的各帧号m=1~M在纵轴上标出,通过这些表示帧号的整数坐标画出一些纵横线即可形成一个网络,网络中的每一个交叉点(n,m)表示测试模式中某一帧的交汇点。DP算法可以归结为寻找一条通过此网络中若干格点的路径,路径通过的格点即为测试和参考模板中进行计算的帧号。路径不是随意选择的,首先任何一种语音的发音快慢都有可能变化,但是其各部分的先后次序不可能改变,因此所选的路径必定是从左下角出发,在右上角结束,如图2-1所示。
图2-1 DTW算法搜索路径 为了描述这条路径,假设路径通过的所有格点依次为(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)即为最佳匹配路径所对应的匹配距离。
3 Matlab程序的实现 3.1 DTW的一般算法 实现DTW算法的函数Dtw.m function 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 = realmax; 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。考虑到边界问题,有些前续格点可能不存在,因此要加入一些判断条件。
最后利用最小值函数min,找到三个前续格点的累积距离的最小值作为累积距离,与当前帧的匹配距离d(i,j)相加,作为当前格点的累积距离。该计算过程一直达到格点(n,m),并将D(n,m)输出,作为模板匹配的结果。
3.2 DTW的高效算法 由于匹配过程中限定了弯折的斜率,因此许多格点实际上是到达不了的,如图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轴上的帧数不同,但弯折特性是一样的,累积距离的更新都是用下式实现的: