1. 程式人生 > >[轉]kaldi基於GMM做分類問題

[轉]kaldi基於GMM做分類問題

keyword 特征 類別 like 分開 eight csdn pre 維度

轉自:http://blog.csdn.net/zjm750617105/article/details/55211992

對於每個類別的GMM有幾種思路:
第一是將所有訓練數據按類別分開每類的數據訓練一個GMM模型
第二是將所有的數據訓練一個UBM模型,然後將訓練數據按類別分開,用MAP去訓練每個類別的GMM(對角UBM的MAP貌似kaldi 沒有
第三就是將所有的數據訓練一個UBM模型,然後不做MAP,直接用訓好的UBM所GMM的初始值,然後將所有訓練數據按類別分開,訓練三個GMM模型在第一種方法的GMM初始化用訓好的UBM

準備測試集數據,如果訓練GMM是用的是原始的MFCC特征的話,也就是不經過add-delta apply-cmvn selected-voiced

等操作的話,那就直接用測試集的MFCC特征的feats.scp文件就好了。
但是如果你的特征在訓GMM的腳本裏經過一些處理,那就是按照相同的處理,意思就是在輸入模型之前特征的前端處理必須保持一致
比如:

select-voiced-frames scp:feats.scp scp:vad.scp ark:- | compute-cmvn-stats ark:- ark:- | apply-cmvn --norm-vars=false ark:- scp:feats.scp ark:- | add-deltas --delta-window=3 --delta-order=2 ark:- ark:- | select-voiced-frames ark:- scp:vad.scp ark,t:final_feats.txt
#經過處理之後的特征在final_feats.txt中,可以直接vim打開驗證一下維度對不對.

訓好三個diag_GMM之後, 可以直接用kaldi的工具進行計算對數似然值

#這個可以,計算的每一幀的似然值
gmm-global-get-frame-likes final.dubm scp:feats.scp ark,t:F_likes  
#對每一幀的似然值取平均,每句話得到一個似然值
gmm-global-get-frame-likes --average=true final.dubm scp:feats.scp ark,t:F_likes  
#由於上面測試集的數據是 final_feats.txt,那麽我們的腳本就是:
gmm-global-get-frame-likes --average=true final.dubm ark,t:final_feats.txt
ark,t:F_likes #得到的輸出文件F_likes,內容格式: uttId score

計算似然值的公式也很簡單,很多現有值在GMM的模型裏已經算出來了, weights , gconst , invvars, means_invvars直接根據這些結果只進行計算就可以了。

訓練得到的diag gmm 模型是 final.dubm ,可以用轉化成文本

gmm-global-copy --binary=false final.dubm final_dubm.txt

[轉]kaldi基於GMM做分類問題