Я пытаюсь реализовать код из Вот
И я обучил 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)
но не повезло.
Любая помощь будет принята с благодарностью
В этом примере мне кажется, что (q) — это скрытая последовательность состояний, поэтому список чисел от 0 до> 9. Если у вас есть два аудиосэмпла, скажем, test и train, и вы генерируете две последовательности q_test и q_train, то думать о | q_test — q_train |, где норма — это компонентное расстояние, бесполезно, поскольку оно не представляет понятие расстояния правильно, поскольку метки скрытого состояния в HMM могут быть произвольными.
Более естественный способ думать о расстоянии может быть следующим, учитывая q_train, вас интересует вероятность того, что ваш тестовый образец выберет тот же путь, который вы можете вычислить, когда у вас есть матрица переходов и вероятности выбросов.
Пожалуйста, дайте мне знать, если я неправильно понимаю ваш вопрос.
Других решений пока нет …