【问题标题】:Understanding Viterbi Algorithm了解维特比算法
【发布时间】:2013-02-25 09:09:48
【问题描述】:

我正在尝试实现来自here的一些代码

我已经用我的系数训练了 HMM,但不明白 Viterbi 解码器算法是如何工作的,例如:

 viterbi_decode(MFCC, M, model, q);
 where MFCC = coefficents 
 M = size of MFCC
 model = Model of HMM training using the MFCC coefficients 
 q = unknown (believed to be the outputted path).

但这是我不明白的:我正在尝试比较两个语音信号(训练、样本)以找出最接近的可能匹配。例如,使用 DTW 算法,返回一个整数,然后我可以找到最接近的整数,但是,使用此算法,它返回 int* array,因此很难区分。

这是当前程序的工作方式:

vector<DIMENSIONS_2> MFCC = mfcc.transform(rawData, sample_rate);

int N = MFCC.size();
int M = 13;

double** mfcc_setup = setupHMM(MFCC, N, M);

model_t* model = hmm_init(mfcc_setup, N, M, 10);

hmm_train(mfcc_setup, N, model);

int* q = new int[N];

viterbi_decode(mfcc_setup, M, model, q); 

谁能告诉我维特比解码器是如何解决从训练到输入的最佳路径识别问题的?我在解码路径(q) 上尝试了欧几里得距离和汉明距离,但没有这样的运气。

任何帮助将不胜感激

【问题讨论】:

  • 训练和样本信号的长度是否相同?如果是这样, int* 数组可能会返回训练的 mfcc 数组和样本之间的距离。回想一下,通常 mfcc 意味着您首先将音频分块,然后从每个音频中提取约 13 个系数以获得 mel 特征,因此 mfcc 的输出是一个 2d 数组,因此两个样本(2 个 2d 数组)之间的差异是 1d数组,其中每个条目是二维数组的特定行的各自差异。

标签: c++ algorithm hidden-markov-models viterbi


【解决方案1】:

在这个例子中,在我看来 (q) 是隐藏状态序列,因此是从 0->9 的数字列表。如果你有两个音频样本,比如测试和训练,然后生成两个序列 q_test 和 q_train,那么考虑 |q_test - q_train|,其中范数是分量距离,是没有用的,因为它不代表距离的概念正确,因为 HMM 中的隐藏状态标签可能是任意的。

考虑距离的更自然的方法可能是以下,给定 q_train,您对测试样本走相同路径的概率感兴趣,一旦您有了转移矩阵和发射概率,就可以计算该概率。

如果我误解了您的问题,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-27
    • 2012-04-01
    • 2011-05-02
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    相关资源
    最近更新 更多