2018年2月1日 星期四

HTK Tools (3): 單音素建模 - 建立隱式馬爾可夫模型

上一小節已經將 WAV 檔案轉成 MFCC 檔案,接下來本章節說明建立 hmm 馬爾可夫模型部分。
本章節對應 Chapter 3 - Creating Monophone HMMs 第一小節 3.2.1 Step 6 - Creating Flat Start Monophones,工作區於測是語料資料夾的 /etc 目錄。

建立向量檔案


建立向量檔案,最主要是要讓接下來使用指令時,HTK 工具可以修改這個向量檔案範本,在 2018 年來看,HTK 官方這種做法看起來就十分麻煩,但不用懷疑,流程就是如此。

這個向量檔案叫做 proto,按照 HTK Books (3.2.1) 中一開始描述的一大串檔案內容,其中的 "..." 三個逗點,意思是請你打完的意思,總共要打完 39 個 1.0 或 0.0。

範例說明 (勿複製):

............................
<NumStates> 5
<State> 2
<Mean> 39
0.0 0.0 0.0 ... #請打完 39 個
<Variance> 39
1.0 1.0 1.0 ... #請打完 39 個
<State> 3
<Mean> 39
0.0 0.0 0.0 ...
<Variance> 39
1.0 1.0 1.0 ...
<State> 4
<Mean> 39
0.0 0.0 0.0 ...
<Variance> 39
1.0 1.0 1.0 ...
<TransP> 5
............................

請在 /etc 裡面,新增一個 proto 的檔案,裡面輸入 HTK Books (3.2.1) 的範例內容,或複製以下範例:
~o <VecSize> 39 <MFCC_0_D_A>
~h "proto"
<BeginHMM>
<NumStates> 5
<State> 2
<Mean> 39
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<State> 3
<Mean> 39
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<State> 4
<Mean> 39
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
<Variance> 39
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
<TransP> 5
0.0 1.0 0.0 0.0 0.0
0.0 0.6 0.4 0.0 0.0
0.0 0.0 0.6 0.4 0.0
0.0 0.0 0.0 0.7 0.3
0.0 0.0 0.0 0.0 0.0
<EndHMM>

請注意,結尾一定要斷空一行,否則可能會導致程式指令出錯。

39 是指這個 MFCC 向量總共有 39 個,是從靜態 MFCC 參數 (13 個) 加上一次微分運算的 MFCC 參數 (13個) 再加上 二次微分運算的 MFCC 參數 (13個) ,這樣總共就有 39 個。

訓練描述檔案


要建立模型前,要先給定需要訓練的 MFCC 模型,請在 /etc 目錄底下新增一個 train.scp 的檔案,並且在檔案內容加入 MFCC 檔案路徑,分行輸入如下範例 (結尾請斷行):
C:\...\mfcc\a0319.mfc
C:\...\mfcc\a0320.mfc
C:\...\mfcc\a0321.mfc

設定檔案調整


前面的章節,可能因為使用 WAV 檔案的關係,把 /etc/config 這個設定檔案,增加了一段:
SOURCEFORMAT = WAV
現在則是要將這一段移除,避免指令出錯。

然後,設定 config 檔案上方的 TARGETKIND 這個設定,變成:
TARGETKIND = MFCC_0_D_A

這個意思是,訓練的檔案包含靜態參數 (0次微分) 及一階微分運算、二階微分運算。 (或指差分運算、階參數)

建立第一個原型 HMM模型


請在執行指令的目錄或 /etc 裡面建立一個 hmm0 的資料夾,然後請先確認以下步驟,再輸入指令建立。

必要步驟:

  • 建立 hmm0 目錄
  • 有 train.scp 檔案
  • 有 proto 檔案
  • config 檔案已更正 (移除 SOURCEFORMAT 參數)
然後,執行:
HCompV -C config -f 0.01 -m -S train.scp -M hmm0 proto

然後,就會在 /hmm0 目錄得到 proto (原來輸入的 0 值會被替換成全域平均值和標準差) 和 vFloor (變異量定義檔案 "Variance")。

參數重估


建立 hmm0 原型馬可夫模型參數後,要再進行每個音素的訓練,首先,前面章節都沒有從 HTK Books 的一開始做起,也就是從文法規則建立字典等步驟,文章並直接使用語料庫,而文中提到的語料庫中,有 phones 的檔案,劍橋大學的 beep 字典是 phone45.tab, 美國卡內基梅隆大學的字典是 cmudict-0.7b.phones ,請將任一個字典,複製到 /etc 目錄下,並且取名改為 monophones0 。

圖示為字典中的 phones 檔案。

請注意,美國卡內基梅隆大學的 phones 檔案,每行有兩格欄位,請自行移除第二個欄位,保留剩下每行一個欄位 (音素文字)。

然後,請在 /etc/hmm0 中建立一個 hmmdefs 檔案,然後把 monopones0 檔案的內容複製到 hmmdefs,接著,要對這個檔案做一點處理,就是每行的文字,都要做一樣的處理:

範本 (勿複製):
~h "sil" #音素加上引號,前方還要有 ~h ,且換行後加入一些內容 (見下方)。
<BEGINHMM>
<NUMSTATES> 5
<STATE> 2
<MEAN> 39
 -1.331621e+001 -1.542020e+000 7.845812e+000 5.224572e+000 1.263358e+001 1.965803e+000 -2.537553e+000 4.187221e+000 1.359798e+000 -3.699118e+000 3.690852e+000 2.985368e+000 6.999219e+001 -9.220263e-003 1.235684e-003 2.119860e-002
........
.......

本文章使用 Sublime Text 做處理,比較方便,做為參考,首先,複製 /etc/hmm0/proto 這個檔案中,從大約第五行開始,也就是 <BEGINHMM> 這個標籤,開始複製一直到 <ENDHMM> ,然後先存在剪貼簿中。

接著,在 /etc/hmm0/hmmdefs 這個檔案做這樣的處理:

CTRL + A (全選)
CTRL + SHIFT + L (選擇每行的行尾)
按一下雙引號,就會在前後自動插入雙引號 "

然後,請:

CTRL + A (全選)
CTRL + SHIFT + L (選擇每行行尾)
按一下左邊箭頭,就會回到每行的一開始,請直接輸入:
~h (空白)


大概就會變成上圖所示,接著,再輸入一次全選,選擇每行行尾,然後斷行,斷行後直接貼上剛才複製的東西。

即會如圖示:


請一樣記得在最後尾斷一行。


Label 檔案處理


一開始訓練出來的 Label 檔案,叫做 "phones0.mlf",請將這個檔案裡面,每個音檔的音素,去掉 #!MLF!#" 及 "*/xxxx.lab" 後,各自儲存成 "*/xxxx.lab" 的檔名,放在上一個章節建立的 mfc 檔案同一位置。

這個部分需要一點耐心處理,或寫程式自動處理也可以。

參數重估指令 


確認好以下內容後,再進行下一步驟:
  • 建立 hmm1 目錄
  • 已經處理完 hmmdefs 檔案
  • 複製字典的 phones 檔案,到 /etc 目錄變成 monophones0
  • 已經有之前的 train.scp 檔案
  • 已經有之前的 phones0.mlf 檔案
  • 確定處理完 label 檔案,放到跟 mfc 同目錄
確定後,使用指令,建立到 /etc/hmm1:
HERest -C config -I phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H .\hmm0\proto -H .\hmm0\hmmdefs -M hmm1 monophones0

其將會產生到 hmm1 目錄中,共有 hmmdefs 和 proto 兩個檔案。

參數重估重複執行


參數執行,通常會做三次,所以 HRest 做三次,請連續的建立 hmm2 和 hmm3 的目錄,然後依序執行重複指令,只是每次重複時會把新的參數模型放到新的 hmm 目錄:

執行第二次 (HMM2)
HERest -C config -I phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H .\hmm1\proto -H .\hmm1\hmmdefs -M hmm2 monophones0

執行第三次 (HMM3)
HERest -C config -I phones0.mlf -t 250.0 150.0 1000.0 -S train.scp -H .\hmm2\proto -H .\hmm2\hmmdefs -M hmm3 monophones0

Reference:
https://github.com/webplus/blog/issues/4
http://www1.icsi.berkeley.edu/Speech/docs/HTKBook3.2/node210_mn.html
https://github.com/sonnylazuardi/htk-gram/blob/master/gram
https://zh.wikipedia.org/wiki/方差

沒有留言:

張貼留言

© ERIC RILEY , 自由無須告知轉貼
Background Japanese Sayagata by Olga Libby