Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在MFCC系数数组上执行DTW?_Arrays_Matlab_Speech Recognition_Voice Recognition_Mfcc - Fatal编程技术网

Arrays 如何在MFCC系数数组上执行DTW?

Arrays 如何在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;

目前我正在MATLAB中从事语音识别项目。 我采集了两个语音信号,并提取了它们的MFCC系数。 据我所知,我现在应该计算两者之间的欧几里德距离,然后应用DTW算法。这就是为什么我计算了两者之间的距离,得到了一组距离。 所以我的问题是如何在结果数组上实现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');

免责声明:我不是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