【问题标题】:Compare two spoken words with MFCC and DTW using Aquila library使用 Aquila 库将两个口语单词与 MFCC 和 DTW 进行比较
【发布时间】:2015-07-21 10:47:55
【问题描述】:

我正在尝试使用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;

它工作正常,只是它不够准确。有时它显示口语“开始”和“停止”之间的距离比两个口语“开始”之间的距离更小。

我的代码正确吗?如何改进程序以便获得更准确的结果? 任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: speech-recognition mfcc


    【解决方案1】:

    整体 DTW 实现起来并不容易。您可以查看本讲座以了解必须执行的操作:

    http://www.fit.vutbr.cz/~grezl/ZRE/lectures/08_reco_dtw_en.pdf

    您需要尝试弄清楚为什么起点和终点之间的距离小于起点之间的距离。是因为音量不同还是你使用了不同的声音?可能有很多问题。相同样本之间的距离必须为 0。您可能希望在样本之间逐帧转储对齐,以便查看什么与什么对齐。

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

    为了获得更准确的特征提取管道,应包括用于倒谱和倒谱均值归一化(本质上是体积归一化)的提升器。

    您使用的音频不应包含静音,您需要使用语音活动检测来去除它。

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

    【讨论】:

      猜你喜欢
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多