kaldi triphone decision tree 訓練生成的tree結構是怎樣的?

kaldi 訓練時用data-driven自動生成決策樹,不用手工根據拼音知識輸入決策樹了很方便,想看看其生成的tree結構和問題集。請問生成的tree的結構是怎樣的?生成的問題集是怎樣的?


tree的結構可以用 draw-tree命令列印出來,然後用graphviz畫出來看。

需要首先 . ./path.sh 命令導入路徑以後運行。./path.sh前面還有一個小點.


以下內容出自 Kaldi 文檔 How decision trees are used in Kaldi 一文中 An example of a decision tree 一節,我用大白話重新敘述一下。

決策樹文件開頭一般會有這麼幾個詞:

ContextDependency 3 1 ToPdf

這裡 3 表示上下文窗口的長度為 3 個音素(即包括上一個、這一個、下一個音素),1 表示「這一個音素」的下標為 1(下標從 0 起算)。如果一棵決策樹是適用於上下文無關音素模型的,那麼這兩個數字就會是 1 和 0。

文件之後的內容,是遞歸保存了一棵決策樹。樹中的結點被稱為 EventMap,這個名字起得不好,不必深究其意思。結點有三種類型:Constant、Split、Table(嘛,還有一種空結點)。它們的遞歸定義如下:

EventMap := ConstantEventMap | SplitEventMap | TableEventMap | "NULL"
ConstantEventMap := "CE" &
SplitEventMap := "SE" & "[" yes-value-list "]" "{" EventMap EventMap "}"
TableEventMap := "TE" & & "(" EventMapList ")"

Constant 結點就是葉子結點,它的表示方式就是 CE 加一個整數,這個整數表示 PDF(即高斯混合分布)的編號。

Split 結點表示有兩個分支的結點,其格式為 SE &<屬性&> [ &<值的列表&> ] { &<是分支&> &<否分支&> }。它針對一個屬性提問,問題就是這個屬性的值是否在一個列表中。屬性可以是 0, 1, 2 這樣的非負整數,表示針對上下文窗口中的第幾個音素提問。比如在通常的三音素模型中,對屬性 1 提問就是問「這一個音素」,對屬性 0 提問就是問「上一個音素」。此時中括弧中的整數就是音素的編號。屬性還可以是 -1,表示問的是「當前狀態是 HMM 中的第幾個狀態」,中括弧中的整數就是狀態的下標(從 0 起算)。大括弧裡面是兩棵決策樹,分別代表屬性的值在和不在中括弧中時,後續的決策樹。

Table 結點表示有多個分支的結點,其格式為 TE &<屬性&> &<值的個數&> ( &<每個值對應的決策樹&> )。屬性值必須是從 0 開始的連續整數。如果某個值不可能取到,相應的決策樹可以是 NULL。

Table 結點常用於屬性是 -1 的情況,因為 HMM 狀態的下標是從 0 開始的連續整數,而且每個狀態往往有不同的 PDF。Split 結點則一般不用於屬性是 -1 的情況。

Split 結點中的「值的列表」,也就是問題涉及的音素集合,一般是對音素自動聚類獲得的,而不是語言學家手動創建的。


鑒於最近也在倒騰kaldi的決策樹,在這裡仔細說下自己理解的kaldi決策樹生成過程,以及決策樹的結構;

決策樹的生成過程有兩個步驟:問題集的生成和狀態綁定;

問題集的生成:首先需要搞清楚什麼是問題集,問題集的本質就是將具有相同特點的數據歸為一個類別;由於kaldi問題集不方便理解,我這裡列舉htk的一個問題作為例子:

QS "L_Rounded" { ao1-*,ao2-*,ao3-*,ao4-*,ao5-* }

上面那段是htk中文模型的一個問題,該問題分成三部分,QS命令(htk工具的一個子命令,表示創建問題),問題名稱"L_Rounded", 問題內容: { ao1-*,ao2-*,ao3-*,ao4-*,ao5-* }; 這個問題的含義就是定義一個問題,該問題的名字叫"L_Rounded",任何音素x,一旦它左邊的音素為ao1, ao2, ao3, ao4, ao5當中的任意一個,那麼在L_Rounded這個問題下,這些音素都可以視為同一類別;定義此問題的人(htk問題集是語言學家定義的)認為滿足此問題集的音素x的在聲音上存在很高的相似性,進而表現為在特徵上也具有很高的相似性,所以定義此問題集將這類音素x歸為一個類別;

那麼我們再來看kaldi的問題的例子,如下

7 8 9 10 11 21 22 23 24 25

可以看到是一串數字,轉換成音素則為: 

ai1 ai2 ai3 ai4 ai5 e1 e2 e3 e4 e5

這串音素的含義與我上面例子當中列舉第一個例子中的第三部分「{ ao1-*,ao2-*,ao3-*,ao4-*,ao5-* }」的本質其實是一樣的表示,只是少了命令QS和問題名稱;上述kaldi問題表示任意音素x,一旦它本身(左邊, 或者右邊)的音素為ai1 ai2 ai3 ai4 ai5 e1 e2 e3 e4 e5則,在該問題下可視這些音素為同一個類別;上述問題等效於為以下三個htk問題:

QS "XX1" { *-ai1+, *-ai2+, *-ai3+*, *-ai4+*, *-ai5+*, *-e1+, *-e2+*, *-e3+*, *-e4+*, *-e5+*, }

表示將中間音素為ai1 ai2 ai3 ai4 ai5 e1 e2 e3 e4 e5的三音素視為一類

QS "XX2" { ai1-*, ai1-*, ai1-*, ai1-*, ai1-*, e1-*, e2-*, e3-*, e4-*, e4-*, }

表示將左邊音素為ai1 ai2 ai3 ai4 ai5 e1 e2 e3 e4 e5的三音素視為一類

QS "XX3" { *+ai1, *+ai2, *+ai3, *+ai4, *+ai5, *+e1, *+e2, *+e3, *+e4, *+e5, }

表示將右邊音素為ai1 ai2 ai3 ai4 ai5 e1 e2 e3 e4 e5的三音素視為一類

狀態綁定: 決策樹的創建過程是將所有音素沿著tree的根節點,根據問題集決定該因素最終被分配到tree的哪個葉子節點上;kaldi決策樹的構建過程與htk決策樹類似,只是構建決策樹輸入的數據結構不同,閱讀htkbook可以幫助理解kaldi決策樹的創建過程;kaldi決策樹創建的輸入數據格式包含兩部分: phone context和Clusterable類; phone context包含了數據的狀態編號,以及左右音素信息;Clusterable類應該是經過kaldi處理的音頻特徵;

舉個例子假設有一個音頻的內容為: 「語音識別」; 對應的音素則為" y u3 y i1 n sh i2 b ie2"該音頻包含了1000個特徵,現在已知第500個特徵ot屬於音素sh的第1個hmm狀態(kaldi默認音素的hmm狀態為3個); 那麼在三音素的條件下,此數據在參與決策樹創建過程中的phone context為[ 0, n, sh,i2 ],其中0代表狀態編號(kaldi默認hmm的第1個狀態編號為0, n代表sh左邊的音素為n, i2代表sh右邊的音素為i2; 而特徵ot則會經過kaldi處理變成Clusterable類用於計算狀態綁定過程中需要的「似然度"; 同htk一樣,tree的深度也是根據"似然度"的變化來確定的,只是似然度的計算方式貌似與htk不同;感興趣的同學可以閱讀htk book第十章的內容;

最後想要查看tree的結構,可以通過以下命令完成

draw-tree phones.txt tree | dot -Tsvg -o tree.svg

生成的tree.svg矢量圖可以用瀏覽器查看;最後放張我生成的tree的部分結構圖;


【kaldi常用工具(原理分析) - zjm750617105的專欄 - CSDN博客】http://m.blog.csdn.net/zjm750617105/article/details/52548798

之前整理過一次,在第4條有一個copy-tree的命令,還可以列印成樹狀的圖像,之前了解的不多,寫的比較亂,有時間再整理一下。


推薦閱讀:

如何實現兩個聲音相似度匹配演算法?
大家怎麼看待現在市面上的智能語音產品?訊飛語點、智能360、口袋語音助手、小i機器人
搜狗的語音交互引擎「知音」技術水平如何?
訊飛語點和 Siri 在體驗和技術上有哪些區別?
Siri 將通過什麼方式支持中文?

TAG:語音識別 | 決策樹 | 中文語音識別 | kaldi |