【发布时间】: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