Speech recognition 使用Aquila库将两个口语单词与MFCC和DTW进行比较

Speech recognition 使用Aquila库将两个口语单词与MFCC和DTW进行比较,speech-recognition,mfcc,Speech Recognition,Mfcc,我试图通过图书馆找到口语单词之间的相似性。 我目前的做法如下。 1) 首先,我将口语分解成更小的框架。 2) 然后对每个帧应用MFCC,并将结果存储在向量中。 3) 最后使用DTW计算距离。 这是我正在使用的代码 int frame_size = 1024; Aquila::WaveFile waveIn0("start_1.wav"); Aquila::FramesCollection frameCollection0(waveIn0, frame_size); vector<vect

我试图通过图书馆找到口语单词之间的相似性。 我目前的做法如下。
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;
int frame\u size=1024;
阿奎拉:波文件waveIn0(“start_1.wav”);
Aquila::FramesCollection frameCollection0(waveIn0,帧大小);
矢量dtwdt0;
Aquila::Mfcc mfcc0(框架尺寸);
对于(int i=0;icout总体DTW不容易实现。您可以查看本课程,了解必须做的事情:

你需要试着找出为什么开始和停止之间的距离小于开始和停止之间的距离。是因为音量不同还是你用了不同的声音?可能有很多问题。相同样本之间的距离必须为0。您可能希望在采样之间逐帧转储对齐,以便查看对齐的对象

理想情况下,DTW不应允许帧之间出现非常大的跳跃。上面的讲座描述了这一点

为了获得更高的精度,特征提取管道应包括用于倒谱和倒谱平均归一化(基本上是体积归一化)的升降机

您使用的音频不应包括静音,您需要使用语音活动检测来消除静音

另外,我不确定音频的采样率,但1024个采样的帧大小可能太大了