17-2 HTK Example: Digit Recognition (HTK 禰遢d狺@Gあr)

有關於 CHMM 的實作,我們大部分是採用 HTK (Hidden Markov Model Toolket) 來進行語料的整理和訓練。以下將使用一個簡單的範例,來說明 HTK 的使用。在這個範例中,我們將進行中文數字辨識(從 0 到 9)的工作,包含使用 HTK 進行聲學模型的訓練,並計算相關的辨識率。

本頁使用了幾個特定的附檔名(mlf、scp、template、cfg、pam、init、hmm、net、grammar 等),若要正確顯示這些檔案於瀏覽器,請取消這些附檔名所對應的應用程式,以便直接將檔案內容呈現於瀏覽器。(若不取消這些相關的應用程式,瀏覽器將跳出對話視窗,詢問是否進行下載。)你可以使用下例的 batch 檔案來取消這些附檔名和應用程式的關連:

原始檔(htk/delAssociation.bat):(灰色區域按兩下即可拷貝)
assoc .mlf=
assoc .scp=
assoc .template=
assoc .cfg=
assoc .pam=
assoc .init=
assoc .hmm=
assoc .net=
assoc .grammar=

Hint
若要指定一個副檔名的關連應用程式,可用 assoc 命令。例如,若要取消副檔名為 scp 的相關應用程式,可以在 DOS 命令視窗下輸入「assoc .scp=」。

接著,你必須下載下列檔案:

請開啟 DOS 視窗,進入 chineseDigitRecog/training 目錄後,直接在 DOS 視窗下執行 goSyl13.bat,即可進行訓練,並計算辨識率。你也可以在 MATLAB 下,進入此目錄,並執行 goSyl13.m,可以得到相同的結果。

在進行所有的工作之前,我們要手動準備兩個檔案,第一個檔案是 digitSyl.pam,指明如何將每一個數字的拼音(Phonetic Alphabets)拆解成聲學模型(Acoustic Models),我們目前的作法,是將每一個音節看成一個聲學模型,如下:

原始檔(htk/chineseDigitRecog/training/digitSyl.pam):(灰色區域按兩下即可拷貝)
ba	ba
er	er
jiou	jiou
ling	ling
liou	liou
qi	qi
san	san
si	si
sil	sil
wu	wu
i	i

以上的拆解方法,是屬於比較簡略的方法,所得到的辨識效果也會比較差。後續會再說明比較精細的方法,例如以 Monophone 或是 Biphone 來做為聲學模型。

Hint
pam 代表 phonetic alphabets to model。

第二個檔案則是 digitSyl.mlf,紀錄每一個音訊檔案所對應的文句內容(以音節為單位),如下:

Example(htk/chineseDigitRecog/training/digitSyl.mlf):

在上述檔案中,sil 代表靜音,因此當我們在 ling 前後都會加上 sil,就代表 "0" 的發音前後都有靜音。

Hint
  • mlf 代表 master label file,用來記錄每個語音檔案的對應內容,可以使用音節(Syllables)或是音素(Phoneme)為單位。
  • 由於 HTK 是以檔案名稱來對應至文句內容,所以每一個音訊特徵的檔案名稱,必須是獨一無二的。(音訊檔案之名稱,則不需唯一。)

以下將將針對 MATLAB 指令檔 goSyl13.m 及 Batch 指令檔 goSyl13.bat 來進行說明,這邊共包含了三大項工作:

  1. 語音特徵的擷取:計算 MFCC
  2. 聲學模型的訓練:使用 EM 來求取最佳參數
  3. 聲學模型的效能評估:辨識率的計算
分別說明如下。

  1. 語音特徵的擷取:計算 MFCC

    1. 產生輸出目錄
      我們先產生三個放置輸出檔案的目錄:
      • output:放置各種輸出檔案。
      • output\feature:放置語音特徵檔案。
      • output\hmm:放置訓練過程所產生的 HMM 參數檔案。
      MATLAB 指令如下:
      mkdir('output');
      mkdir('output/feature');
      mkdir('output/hmm');
      
      Batch 指令如下:
      for %%i in (output output\feature output\hmm) do mkdir %%i > nul 2>&1
      
      若目錄已經存在,則 Batch 指令不會印出任何警告訊息。

      Hint
      上述的 Batch 指令,是位於 goSyl13.bat 的內容。讀者若要將上述指令拷貝至 DOS 視窗執行,請務必將 %%i 改成 %i,以下類推。

    2. 產生 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 檔案內容如下:

      原始檔(htk/chineseDigitRecog/training/output/syl2phone.scp):(灰色區域按兩下即可拷貝)
      EX 
      

      其中的「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 列出所有用到的聲學模型,如下:

      原始檔(htk/chineseDigitRecog/training/output/digitSyl.mnl):(灰色區域按兩下即可拷貝)
      sil
      ling
      i
      er
      san
      si
      wu
      liou
      qi
      ba
      jiou
      

      Hint
      mnl 代表 model name list。

      而 digitSylPhone.mlf 則是將 digitSyl.mlf 的音節資訊轉換成為 phone 資訊的結果,以便用於聲學的訓練,檔案如下:

      Example(htk/chineseDigitRecog/training/output/digitSylPhone.mlf):

      Hint
      由於我們是使用一個音節來作為一個聲學模型,因此 digitSylPhone.mlf 和 原先的 digitSyl.mlf 的內容恰巧一樣。

    3. 產生 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 檔案和所產生的音訊特徵檔案的對應關係,其內容如下:

      Example(htk/chineseDigitRecog/training/output/wav2fea.scp):

      由上述檔案可以看出,所有產生的語音特徵檔案,將以 fea 為附檔名,並放置在 output\feature 目錄下。

    4. 使用 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!