代码结构
已知函数或代码段详解
testdtw.m是测试脚本。
1 disp('正在计算参考模板的参数...') 2 for i=1:10 3 fname = sprintf('..\\ch6\\%da.wav',i-1); 4 x = wavread(fname); 5 [x1 x2] = vad(x); 6 m = mfcc(x); 7 m = m(x1-2:x2-2,:); 8 ref(i).mfcc = m; 9 end 10 11 disp('正在计算测试模板的参数...') 12 for i=1:10 13 fname = sprintf('..\\ch6\\%db.wav',i-1); 14 x = wavread(fname); 15 [x1 x2] = vad(x); 16 m = mfcc(x); 17 m = m(x1-2:x2-2,:); 18 test(i).mfcc = m; 19 end 20 21 disp('正在进行模板匹配...') 22 dist = zeros(10,10); 23 for i=1:10 24 for j=1:10 25 dist(i,j) = dtw(test(i).mfcc, ref(j).mfcc); 26 end 27 end 28 29 disp('正在计算匹配结果...') 30 for i=1:10 31 [d,j] = min(dist(i,:)); 32 fprintf('测试模板 %d 的识别结果为:%d\n', i, j); 33 end
- 使用同样的方法计算参考模板和测试模板的MFCC系数。
其中经过读入输入数据、计算MFCC、端点检测、截取需要帧的MFCC系数。 - 利用dtw计算相异程度。
- 比较相异程度,最低的为匹配值。
-
VAD
vad.m,端点检测。输入语音信号列向量,输出[x1 x2],x1开始点,x2结束点。
-
MFCC
mfcc.m,Mel频率倒谱系数的算法里面的一行代码是
bank=melbankm(24,256,8000,0,0.5,'m');
里面的24即计算24阶Mel频率倒谱系数。该函数输入整段语音列向量,即wavread读出的向量。输出为矩阵,每行代表一个帧计算得来的24维特征。在进行MFCC计算时一般需要检测端点。
-
DTW和DTW2
dtw/dtw.m和dtw/dtw2.m,这两个是动态时间规整算法,输入两个列数相同矩阵。矩阵每一行表示语音信号的每一个帧,一行中的每一个元素表示改帧通过特征提取而得来的一个值,比如24阶MFCC系数有24个特征值,那么一行就是24个元素。每一个帧的点数与这里的长度无关,因为这一步的输入是从特征提取函数而来比如MFCC。
输入两个比较矩阵,每行为一个帧的特征。输出为一个值,即匹配程度。