了解维特比算法

时间:2013-03-10 00:14:34

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

我正在尝试从here

实施一些代码

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

 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)上尝试了欧几里德距离和汉明距离,但没有这样的运气。

非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

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

考虑到距离的一种更自然的方式可能如下:给定q_train,您对测试样本采用相同路径的概率感兴趣,一旦有了转换矩阵和发射概率,就可以计算出来。

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