我正在尝试使用aquila库找到口语之间的相似性。我目前的做法如下。
1)首先我把口语分解成更小的框架。
2)然后对每一帧应用MFCC并将结果存储在一个向量中。
3)最后使用DTW计算距离。
这是我正在使用的代码。
int frame_size = 1024;
Aquila::WaveFile waveIn0("start_1.wav");
Aquila::FramesCollection frameCollection0(waveIn0, frame_size);
vector<vector<double>> dtwdt0;
Aquila::Mfcc mfcc0(frame_size);
for(int i = 0; i < frameCollection0.count() ; i++)
{
Aquila::Frame frame = frameCollection0.frame(i);
vector<double> mfccValues = mfcc0.calculate(frame);
dtwdt0.push_back(mfccValues);
}
Aquila::WaveFile waveIn1("start_2.wav");
Aquila::FramesCollection frameCollection1(waveIn1, frame_size);
vector<vector<double>> dtwdt1;
Aquila::Mfcc mfcc1(frame_size);
for(int i = 0; i < frameCollection1.count(); i++)
{
Aquila::Frame frame = frameCollection1.frame(i);
vector<double> mfccValues = mfcc1.calculate(frame);
dtwdt1.push_back(mfccValues);
}
Aquila::Dtw dtw(Aquila::euclideanDistance, Aquila::Dtw::PassType::Diagonals);
double distance_1 = dtw.getDistance(dtwdt0, dtwdt1);
cout << "Distance : " << distance_1 << endl;
它工作正常,只是它不够准确。有时它显示口语“开始”和“停止”之间的距离比两个口语“开始”之间的距离更小。
我的代码正确吗?如何改进程序以便获得更准确的结果?任何帮助将不胜感激。
谢谢。