2016-09-28 28 views
1

目前我正在研究MATLAB中的語音識別項目。 我已經拍攝了兩個聲音信號,並提取了相同的MFCC係數。 據我所知,我現在應該計算兩者之間的歐幾里德距離,然後應用DTW算法。這就是爲什麼我計算了兩者之間的距離,並得到了一系列距離。 所以我的問題是如何在結果數組上實現DTW?如何在MFCC係數陣列上執行DTW?

這裏是我的MATLAB代碼:

清除所有;關閉所有; CLC;

% Define variables 
Tw = 25;    % analysis frame duration (ms) 
Ts = 10;    % analysis frame shift (ms) 
alpha = 0.97;   % preemphasis coefficient 
M = 20;     % number of filterbank channels 
C = 12;     % number of cepstral coefficients 
L = 22;     % cepstral sine lifter parameter 
LF = 300;    % lower frequency limit (Hz) 
HF = 3700;    % upper frequency limit (Hz) 
wav_file = 'Play.wav'; % input audio filename 
wav_file1 = 'Next.wav'; 


% Read speech samples, sampling rate and precision from file 
[ speech, fs, nbits ] = wavread(wav_file); 
[ speech1, fs, nbits ] = wavread(wav_file1); 

% Feature extraction (feature vectors as columns) 
[ MFCCs, FBEs, frames ] = ... 
       mfcc(speech, fs, Tw, Ts, alpha, @hamming, [LF HF], M, C+1, L); 
[ MFCC1s, FBEs, frames ] = ... 
       mfcc(speech1, fs, Tw, Ts, alpha, @hamming, [LF HF], M, C+1, L); 

L = pdist2(MFCCs, MFCC1s, 'euclidean'); 

回答

0

聲明:我不是一個matlab用戶。

我認爲您的陳述中可能存在一個誤解:「我現在應該計算兩者之間的歐幾里得距離,然後應用DTW算法」。

使用DTW的要點是,你必須比較兩個系列(MFCC系列爲wav 1和wav 2),並且很可能兩個wav的持續時間不同,所以你最終會得到兩組MFCCs不同大小的向量。 DTW可幫助您比較兩個MFCC系列,而不考慮其尺寸(請參見https://en.wikipedia.org/wiki/Dynamic_time_warping)。例如,如果您已經提取了3個MFCC特徵向量(用於wav 1)和5個MFCC特徵向量(用於wav 2),那麼通過應用DTW,您可以比較它們,從而有效地獲得兩者之間的差異或距離他們。你不必在「DTW」之前計算距離,你可以用DTW來計算它(事實上,我不知道如何計算一系列不同長度之間的距離)。

就像我在開始時說,我不是一個MATLAB用戶,但快速谷歌搜索「MATLAB DTW」向我指出這篇文章:https://www.mathworks.com/help/signal/ref/dtw.html,他們在參考dtw()

dist = dtw(x,y) stretches two vectors, x and y, onto a common set of 
    instants such that dist, the sum of the Euclidean distances between 
    corresponding points, is smallest