Arrays 如何在MFCC系数数组上执行DTW?
目前我正在MATLAB中从事语音识别项目。 我采集了两个语音信号,并提取了它们的MFCC系数。 据我所知,我现在应该计算两者之间的欧几里德距离,然后应用DTW算法。这就是为什么我计算了两者之间的距离,得到了一组距离。 所以我的问题是如何在结果数组上实现DTW 以下是我的MATLAB代码: 清除所有;全部关闭;clcArrays 如何在MFCC系数数组上执行DTW?,arrays,matlab,speech-recognition,voice-recognition,mfcc,Arrays,Matlab,Speech Recognition,Voice Recognition,Mfcc,目前我正在MATLAB中从事语音识别项目。 我采集了两个语音信号,并提取了它们的MFCC系数。 据我所知,我现在应该计算两者之间的欧几里德距离,然后应用DTW算法。这就是为什么我计算了两者之间的距离,得到了一组距离。 所以我的问题是如何在结果数组上实现DTW 以下是我的MATLAB代码: 清除所有;全部关闭;clc % Define variables Tw = 25; % analysis frame duration (ms) Ts = 10;
% 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');
免责声明:我不是matlab用户 我认为在你的陈述中可能有一个误解,“我现在应该计算两者之间的欧几里德距离,然后应用DTW算法” 使用DTW的意义在于,您必须比较两个系列(针对wav 1和wav 2的MFCCs系列),并且两个wav的持续时间可能不同,因此您将得到两组大小不同的MFCCs向量。DTW帮助您比较两个MFCC系列,而不管它们的大小(请参阅) 因此,例如,如果您提取了wav 1的3个MFCC特征向量和wav 2的5个MFCC特征向量,通过应用DTW,您可以比较它们,从而有效地获得它们之间的差异或距离。您不必在“之前”计算距离DTW,您可以使用DTW来计算它(事实上,否则我不知道如何计算到不同长度序列之间的距离) 正如我在开始时所说,我不是matlab用户,但在google上快速搜索“matlab dtw”后,我找到了这篇文章:,其中他们指的是
dtw()
:
免责声明:我不是matlab用户 我认为在你的陈述中可能有一个误解,“我现在应该计算两者之间的欧几里德距离,然后应用DTW算法” 使用DTW的意义在于,您必须比较两个系列(针对wav 1和wav 2的MFCCs系列),并且两个wav的持续时间可能不同,因此您将得到两组大小不同的MFCCs向量。DTW帮助您比较两个MFCC系列,而不管它们的大小(请参阅) 因此,例如,如果您提取了wav 1的3个MFCC特征向量和wav 2的5个MFCC特征向量,通过应用DTW,您可以比较它们,从而有效地获得它们之间的差异或距离。您不必在“之前”计算距离DTW,您可以使用DTW来计算它(事实上,否则我不知道如何计算到不同长度序列之间的距离) 正如我在开始时所说,我不是matlab用户,但在google上快速搜索“matlab dtw”后,我找到了这篇文章:,其中他们指的是
dtw()
:
我建议使用标准的欧几里德距离而不是欧几里德距离,因为de MFCC系数在每个维度上都有不同的范围 例如,如果您有以下两个维度向量A(500,4)、B(504,4)和C(502,3),使用欧几里德距离将导致dist(A,C)dist(A,B),因为每个维度距离都已标准化为其平均值。因此,您将(504-500)/502<(4-3)/3.5
因此,对于MFCC,最好使用此归一化步骤来改善结果。我建议使用标准欧几里德距离而不是欧几里德距离,因为de MFCC系数在每个维度上的范围不同 例如,如果您有以下两个维度向量A(500,4)、B(504,4)和C(502,3),使用欧几里德距离将导致dist(A,C)dist(A,B),因为每个维度距离都已标准化为其平均值。因此,您将(504-500)/502<(4-3)/3.5 因此,对于MFCC,最好使用此规范化步骤来改进结果
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