有關於 CHMM 的實作,我們大部分是採用 HTK (Hidden Markov Model Toolket) 來進行語料的整理和訓練。以下將使用一個簡單的範例,來說明 HTK 的使用。在這個範例中,我們將進行中文數字辨識(從 0 到 9)的工作,包含使用 HTK 進行聲學模型的訓練,並計算相關的辨識率。本頁使用了幾個特定的附檔名(mlf、scp、template、cfg、pam、init、hmm、net、grammar 等),若要正確顯示這些檔案於瀏覽器,請取消這些附檔名所對應的應用程式,以便直接將檔案內容呈現於瀏覽器。(若不取消這些相關的應用程式,瀏覽器將跳出對話視窗,詢問是否進行下載。)你可以使用下例的 batch 檔案來取消這些附檔名和應用程式的關連:
接著,你必須下載下列檔案:
請開啟 DOS 視窗,進入 chineseDigitRecog/training 目錄後,直接在 DOS 視窗下執行 goSyl13.bat,即可進行訓練,並計算辨識率。你也可以在 MATLAB 下,進入此目錄,並執行 goSyl13.m,可以得到相同的結果。
- 下載 HTK 指令:展開後,有兩個目錄 bin 及 bin.win32,裡面包含我們會用到的 HTK 指令和其他資料處理指令。請由「控制台/系統/進階/環境變數/系統變數」,將這兩個目錄加入 path 的環境變數,以便後續由 DOS 視窗呼叫這些指令。
- 下載訓練指令及音訊檔案:展開後,有兩個目錄:
請將上述目錄,放在沒有空格的路徑上。(請勿放在桌面,因為桌面的路徑有包含空格。)
- training:訓練所用到的程式碼。
- waveFile:0 到 9 數字錄音的音訊檔案。
在進行所有的工作之前,我們要手動準備兩個檔案,第一個檔案是 digitSyl.pam,指明如何將每一個數字的拼音(Phonetic Alphabets)拆解成聲學模型(Acoustic Models),我們目前的作法,是將每一個音節看成一個聲學模型,如下:
以上的拆解方法,是屬於比較簡略的方法,所得到的辨識效果也會比較差。後續會再說明比較精細的方法,例如以 Monophone 或是 Biphone 來做為聲學模型。
第二個檔案則是 digitSyl.mlf,紀錄每一個音訊檔案所對應的文句內容(以音節為單位),如下:
在上述檔案中,sil 代表靜音,因此當我們在 ling 前後都會加上 sil,就代表 "0" 的發音前後都有靜音。
以下將將針對 MATLAB 指令檔 goSyl13.m 及 Batch 指令檔 goSyl13.bat 來進行說明,這邊共包含了三大項工作:
分別說明如下。
- 語音特徵的擷取:計算 MFCC
- 聲學模型的訓練:使用 EM 來求取最佳參數
- 聲學模型的效能評估:辨識率的計算
- 語音特徵的擷取:計算 MFCC
- 產生輸出目錄
我們先產生三個放置輸出檔案的目錄:MATLAB 指令如下:
- output:放置各種輸出檔案。
- output\feature:放置語音特徵檔案。
- output\hmm:放置訓練過程所產生的 HMM 參數檔案。
mkdir('output'); mkdir('output/feature'); mkdir('output/hmm');Batch 指令如下:for %%i in (output output\feature output\hmm) do mkdir %%i > nul 2>&1若目錄已經存在,則 Batch 指令不會印出任何警告訊息。
- 產生 digitSyl.mnl 及 digitSylPhone.mlf
先產生 syl2phone.scp 檔案,MATLAB 指令如下:fid=fopen('output\syl2phone.scp', 'w'); fprintf(fid, 'EX'); fclose(fid); Batch 指令如下:@echo EX > output\syl2phone.scp 所產生的 syl2phone.scp 檔案內容如下:其中的「EX」是代表 Expand,其意義是「由音節字串展開成phone字串」,將被用於 HTK 的 HLEd 指令,詳見下述。
接著,我們可以使用下列 HTK 的 HLEd 指令來產生 digitSyl.mnl 及 digitSylPhone.mlf:
HLEd -n output\digitSyl.mnl -d digitSyl.pam -l * -i output\digitSylPhone.mlf output\syl2phone.scp digitSyl.mlf在上述指令中,我們使用顏色來表示檔案的用途,藍色代表是輸入檔案,紅色代表是輸出檔案。輸出檔案 digitSyl.mnl 列出所有用到的聲學模型,如下:
而 digitSylPhone.mlf 則是將 digitSyl.mlf 的音節資訊轉換成為 phone 資訊的結果,以便用於聲學的訓練,檔案如下:
- 產生 wav2fea.scp
接著我們要進行語音特徵擷取,也就是要將每一個 wav 檔案轉換成 MFCC,首先我們先產生 wav2fea.scp,MATLAB 指令如下:wavDir='..\waveFile'; waveFiles=recursiveFileList(wavDir, 'wav'); outFile='output\wav2fea.scp'; fid=fopen(outFile, 'w'); for i=1:length(waveFiles) wavePath=strrep(waveFiles(i).path, '/', '\'); [a,b,c,d]=fileparts(wavePath); fprintf(fid, '%s\t%s\r\n', wavePath, ['output\feature\', b, '.fea']); end fclose(fid);Batch 指令如下:(for /f "delims=" %%i in ('dir/s/b wave\*.wav') do @echo %%i output\feature\%%~ni.fea)> output\wav2fea.scp所產生的 wav2fea.scp 用來規範 wav 檔案和所產生的音訊特徵檔案的對應關係,其內容如下:由上述檔案可以看出,所有產生的語音特徵檔案,將以 fea 為附檔名,並放置在 output\feature 目錄下。
- 使用 HCopy.exe 進行語音特徵抽取
接著,我們就可以使用 HTK 的 hcopy.exe 指令來產生 MFCC 檔案:HCopy -C mfcc.cfg -S output\wav2fea.scp在上述指令中,mfcc.cfg 是一個參數檔,用來規範產生 MFCC 的參數,其內容如下: Error: D:\users\jang\books\audiosignalprocessing/example/htk/chineseDigitRecog/training/mfcc.cfg does not exist!