2013-03-10 64 views
1

我試圖實現從here瞭解Viterbi算法

一些代碼,我與我的係數訓練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); 

誰能告訴我Viterbi解碼器是如何工作的,用於識別是從訓練拿地,到輸入端的最佳路徑的問題?我已經嘗試瞭解碼路徑(q)上的歐幾里得距離以及漢明距離,但沒有這樣的運氣。

任何幫助,將不勝感激

+0

訓練和樣本信號的長度是否相同?如果是這樣,那麼int *數組可能會返回訓練和樣本的mfcc數組之間的距離。回想一下,通常mfcc意味着你首先將音頻塊分段,然後從每個音頻中提取〜13 coeffecients得到mel特徵,所以mfcc的輸出是一個二維數組,因此兩個樣本(2 2d數組)之間的差異是1d數組,其中每個條目是二維數組的特定行的相應差異。 – 2013-03-14 07:39:46

回答

1

在這個例子在我看來,(q)爲隱藏狀態序列,所以從0-> 9號列表。如果你有兩個音頻樣本,測試和訓練,並且你生成兩個序列q_test和q_train,那麼考慮| q_test-q_train |,其中範數是分量距離,因爲它不代表距離的概念正確,因爲HMM中的隱藏狀態標籤可能是任意的。

考慮到距離的一種更自然的方式可能如下,給定q_train,您對測試樣本採用相同路徑的概率感興趣,一旦擁有轉換矩陣和發射概率,您可以計算該路徑。

請讓我知道,如果我誤解你的問題。