本章節對應 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 檔案,每行有兩格欄位,請自行移除第二個欄位,保留剩下每行一個欄位 (音素文字)。
然後,請在 /etc/hmm0 中建立一個 hmmdefs 檔案,然後把 monopones0 檔案的內容複製到 hmmdefs,接著,要對這個檔案做一點處理,就是每行的文字,都要做一樣的處理:
範本 (勿複製):
圖示為字典中的 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 檔案,叫做 "phones0.mlf",請將這個檔案裡面,每個音檔的音素,去掉 #!MLF!#" 及 "*/xxxx.lab" 後,各自儲存成 "*/xxxx.lab" 的檔名,放在上一個章節建立的 mfc 檔案同一位置。
這個部分需要一點耐心處理,或寫程式自動處理也可以。
接著,在 /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)
執行第三次 (HMM3)
參數重估重複執行
參數執行,通常會做三次,所以 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/方差
沒有留言:
張貼留言