HTKの使い方

Main Page >> Memo/Link >> HMM >> HTK

ダウンロード

登録が必要

http://htk.eng.cam.ac.uk/

次の3つのファイルをダウンロードする.

Linux/Windowsでコンパイル

Linux
環境変数を指定する必要あり. build.sh
Windows
Visual C++ が入っている必要がある.README参照

ToolKit

基本的には The HTK Bookの パートI. Tutorial Overview (1,2,3章)を読めば, 大まかな使い方は理解できる.HTKは連続音声認識に特化しているため, 学習や認識には工夫がなされている.それを理解するためにも,特に1章は飛ばさず読むべし. また,特に観測ベクトルを複数のストリームに分割出来るようにしている. (例えば,エネルギーとデルタをそれぞれ別のストリームとして扱う.)

1.データ作成(特徴ベクトル系列,ラベル系列の準備)
HCopy:特徴抽出
HList:ファイル情報
HLEd:ラベル作成(Master Label File, MLFを出力)
HLStats:ラベルファイルの統計情報表示
HQuant:VQコードブック作成
2.学習
MakeProtoHMMSet:トポロジー決定
初期モデル学習
bootstrap data
HInit:音素の切り出しと対応するHMMの学習 (segmental k-means)
HRest:HInitに続くHMMの学習(Baum-Welch)
non bootstrap data
HCompV:flat start
HERest:連結学習(Baum-Welch, 混合数増加, monophone → triphone)
3.認識
HVite:Viterbiアルゴリズムによる認識
HBuild:(1)単語ネットワークの生成(sub-networksも生成可能?)
HLStats:(2)単語ネットワークの生成(back-off bigram 言語モデル)
HParse:文法記法の変換(EBNF(拡張バッカス記法)へ)
HSGen:単語列の生成
HDMan:辞書管理ツール
4.解析
HResult:認識率の算出

学習には特徴ベクトル系列とラベル系列が必要.HTKは学習に様々なモジュール を用いる.(HInit, HRest, HERest, etc.)これは,繰り返し学習することによっ て次第にモデルを洗練させるため.

HRestはBaum-WelchのRe-estimationだが,HInitはその簡易版のような感じ.具 体的には,出力ベクトル系列を状態に割り振り(始めは均等に),viterbiアル ゴリズムによって尤度を求める.次にこれが大きくなるように ,出力ベクトルを状態に割り振り直す.以上を反復する.詳しくは第1,8章.

Proto
 遷移確率以外のパラメタ(出力確率など)は意味を持たない
bootstrap data (音素の境界が既にマークされている学習データ) → HInit, HRest
no bootstrap data (境界にマークなし) → HCompV

認識(HVite)に必要な入力は, (1)可能な単語列のネットワーク, (2)各単語がど
のように発音されるかの辞書, (3)HMMs

コマンド基礎知識

Standard Options (4.4)

-Aコマンドラインの引数を表示
-Dコンフィグパラメータを表示
-Vバージョン
-T(引数)トレース値(各コマンドのリファレンス参照)
-C(引数)コンフィグファイル
-S(引数)スクリプトファイル

データ作成

HTKDemoの離散HMM(状態数:3, VQcodebook:64-64-16(Linear))を参考に使い方を一通り眺めてみる.

tidata/ TIMIDデータベースより10文(7文:training,3文:testing)

発音記号ファイル(tidata/*.phn) →[HLEd, (edfiles/*.led)] → ラベルファイ ル(label/bcplabs/mon/*.lab)
音声ファイル(tidata/*.adc) →[HCopy]→ 特徴量ファイル(data/*/*.mfc)

ネットワークファイル

monNetworkを編集

% HParse networks/monNetwork(gram) networks/monLattice(wdnet:Standard Lattice Format(SLF))

networks/monNetwork

$phn = V | C | L | N | S;
(<$phn>)   <>は一回以上の繰り返しを意味する

辞書ファイル

例文から辞書を構成するときは

% HDMan

を用いる.フォーマットは

WORD1 phn11 phn12...
...

であるが,今は音素認識を行うため,このWORDを音素とし,

phn1 phn1
phn2 phn2
...

とする.また,単語HMMを構成するなら

WORD1 WORD1
WORD2 WORD2
...

となる.

ラベルファイル

% HLEd [option] -l labels/bcplabs/mon (出力ディレクトリ)
edfiles/edlabs.led (Edit Script) tidata/tr1.phn tidata/tr2.phn...(Transcription File)

edfiles/edlabs.led

S
D q
R V iy ih eh ae ix ax ah ax-h uw uh ao aa ey ay oy aw ow ux
R L l el r y w er axr
R N m n en ng em nx eng
R C ch j jh dh b d dx g p t k z zh v f th s sh hh hv pcl tcl kcl qcl bcl dcl gcl epi 
R S sil h# #h pau

tidata/tr1.phn (単位は0.0625msec(16kHh))

0 2256 h#
2256 4146 sh
4146 4804 iy
4804 5807 hv
5807 7256 ae
7256 7979 dcl
7979 8689 jh
8689 9240 ax-h
・
・
・
以下省略

labels/bcplabs/mon (単位は0.0001msec(100nsec)なので*.phnの625倍)

0  1410000 S
1410000  2591250 C
2591250  3002500 V
3002500  3629375 C
3629375  4535000 V
4535000  4986875 C
4986875  5430625 C
5430625  5775000 V
5775000  6188125 C
6188125  6525000 C
6525000  7676250 V
7676250  8082500 L
・
・
・
以下省略

特徴量ファイル

% HCopy 音声ファイル mfcファイル

toolsconf/hcopyNOHEAD.conf

 BYTEORDER      = NONVAX    # sun auなどは big-endian
 SOURCEKIND     = WAVEFORM
 SOURCEFORMAT   = NOHEAD    # 他に TIMIT, WAVEなど
 SOURCERATE     = 625       # 16kHz = 625 x 100nsec
 ZMEANSOURCE    = FALSE

 TARGETKIND     = MFCC_E_D_Z # _E:has enagy, -D:has delta coefficients, -Z:has zero mean static coef
#TARGETFORMAT   = HTK
 TARGETRATE     = 100000    # 窓間隔 10msec = 100000 x 100nsec

 SAVECOMPRESSED = FALSE
 SAVEWITHCRC    = FALSE

 WINDOWSIZE     = 250000.0  # 窓サイズ 25msec = 250000 x 100nsec
# USEHAMMING     = TRUE
 PREEMCOEF      = 0.97

#USEPOWER       = FALSE
 NUMCHANS       = 24        # フィルタバンクのチャネル数
#LOFREQ         = -1.0
#HIFREQ         = -1.0

#LPCORDER       = 12

#CEPLIFTER      = 22
#NUMCEPS        = 12

#RAWENERGY      = TRUE
 ENORMALISE     = TRUE
#ESCALE         = 1.0
#SILFLOOR       = 50.0

#DELTAWINDOW    = 2
#ACCWINDOW      = 2

#USESILDET      = TRUE
#SPEECHTHRESH   = 0.0
#SILTHRESH      = 0.0
#MEASURESIL     = TRUE

#OUTSILWARN     = TRUE
#SILMEAN        = 0.0
#SILSTD         = 0.0
#AUDIOSIG       = 0
#VQTABLE        = ""

(離散/半連続HMMの場合)

% HQuant -A -C toolconfs/hquant.conf -D -T 1
-d (対角共分散を用いたMahalanobis距離を 距離尺度として用いる: Default ユークリッド距離)
-s 3 -n 1 64 -n 2 64 -n 3 16 (ストリーム数と各々の コードブック数)
codebooks/currentCodebook (VQFile)
data/train/tr1.mfc data/train/tr2.mfc data/train/tr3.mfc data/train/tr4.mfc data/train/tr5.mfc data/train/tr6.mfc data/train/tr7.mfc (Datafile)


学習

HMMプロトタイプ作成

% ./MakeProtoHMMSet protoconfs/proto_s3_m64_64_16_vq.pcf

protoconfs/proto_s3_m64_64_16_vq.pcf

<BEGINproto_config_file>

<COMMENT>
   This PCF produces a single stream DISCRETE prototype system

<BEGINsys_setup>

hsKind: D                # 離散HMM
covKind: D               # 対角共分散行列
nStates: 3               # 出力ベクトルを持つ状態数(+2 が全体の状態数)
nStreams: 1              # ストリーム数(観測ベクトルをいくつに分割するか)
sWidths: 26              # 各ストリームの次元数
mixes: 64                # 混合数
parmKind: MFCC_E_D       # 特徴パラメータ
vecSize: 26              # 特徴次元数
outDir: proto            # 出力ディレクトリ名
hmmList: lists/bcplist   # HMM名リスト

<ENDsys_setup>

<ENDproto_config_file>

lists/bcplist

S
C
V
N
L

proto 以下に,lists/bcplistに対応したHMM(prototype)が作成される.
(例) proto/S

  ~o <VecSize> 26 <MFCC_E_D_V> <StreamInfo> 3 12 12 2 
  ~h "S"
<BeginHMM>
  <NumStates> 5
  <State> 2 <NumMixes> 64 64 16 
  <Stream> 1
      <DProb> 9864*64
  <Stream> 2
      <DProb> 9864*64
  <Stream> 3
      <DProb> 6576*16

  <State> 3 <NumMixes> 64 64 16 
  <Stream> 1
      <DProb> 9864*64
  <Stream> 2
      <DProb> 9864*64
  <Stream> 3
      <DProb> 6576*16

  <State> 4 <NumMixes> 64 64 16 
  <Stream> 1
      <DProb> 9864*64
  <Stream> 2
      <DProb> 9864*64
  <Stream> 3
      <DProb> 6576*16

  <TransP> 5
   0.000e+0   1.000e+0   0.000e+0   0.000e+0   0.000e+0
   0.000e+0   6.000e-1   4.000e-1   0.000e+0   0.000e+0
   0.000e+0   0.000e+0   6.000e-1   4.000e-1   0.000e+0
   0.000e+0   0.000e+0   0.000e+0   6.000e-1   4.000e-1
   0.000e+0   0.000e+0   0.000e+0   0.000e+0   0.000e+0
<EndHMM>

初期学習

% HInit -A -C toolconfs/hinitVQ.conf -D -T 1
-L labels/bcplabs/mon (ラベルファイル)
-i 10 (最大の反復数: Default 20回)
-l S (セグメンテーションを行う場合はラベルファイル内のセグメントラベルを 指定: Default 各トレーニングファイルを単一のトークンと見なす)
-o S -M hmms/hmm.0 (出力ファイル名, 出力ディレクトリ名)
proto/S (hmm)
data/train/tr1.mfc data/train/tr2.mfc data/train/tr3.mfc data/train/tr4.mfc data/train/tr5.mfc data/train/tr6.mfc data/train/tr7.mfc(Data File)

toolconfs/hinitVQ.conf

BYTEORDER       = NONVAX
TARGETKIND = MFCC_E_D_V
SAVEGLOBOPTS = TRUE
KEEPDISTINCT=F
VQTABLE=codebooks/currentCodebook

各HMMの学習 (Baum-Welch Re-Estimation)

% HRest -A -C toolconfs/hrest.conf -D -T 1
-L labels/bcplabs/mon
-i 10
-l S
-M hmms/hmm.1
-u tmvw (更新するパラメータをフラグで指定,t(transition), m(mean), v(variance), w(mixture weight): Default 全て)
-w 3 (混合比の下限が f * MINMIXとなる: Defaultは0)
-v 0.05 (分散の最小値を指定)
hmms/hmm.0/S (hmm)
data/train/tr1.mfc data/train/tr2.mfc data/train/tr3.mfc data/train/tr4.mfc data/train/tr5.mfc data/train/tr6.mfc data/train/tr7.mfc (Data File)

toolconfs/hrestVQ.conf

BYTEORDER       = NONVAX
TARGETKIND = MFCC_E_D_V
SAVEGLOBOPTS = TRUE
KEEPDISTINCT=T
BINARYACCFORMAT=T
VQTABLE=codebooks/currentCodebook

複数のHMMの連結学習 (Embedded model Baum-Welch Re-Estimation)

% HERest -A -D -C toolconfs/herestVQ.conf -T 1
-L labels/bcplabs/mon
-w 3 -v 0.05 -u tmvw
-t 2000.0 (枝刈りの閾値)
-d hmms/hmm.1 (入力HMMディレクトリ)
-M hmms/hmm.2 (出力HMMディレクトリ)
lists/bcplist (hmmリスト)
data/train/tr1.mfc data/train/tr2.mfc data/train/tr3.mfc data/train/tr4.mfc data/train/tr5.mfc data/train/tr6.mfc data/train/tr7.mfc (Data Files)

toolsconfs/herestVQ.conf

BYTEORDER       = NONVAX
TARGETKIND = MFCC_E_D_V
SAVEGLOBOPTS = TRUE
KEEPDISTINCT=T
BINARYACCFORMAT=T
VQTABLE=codebooks/currentCodebook

認識

% HVite -A -C toolconfs/hviteVQ.conf -D -T 1
-L test (-w が指定された場合は入力ネットワークファイル ディレクトリ ,-a(alignment) が指定された場合は入力ラベルディレクトリ)
-l test (出力ラベルディレクトリ)
-t 300.0 (ビームサーチ)
-p -1.0 (word intersection log probability: Default 0)
-s 0.0 (grammar scale factor: Default 1)
-w networks/monLattice (ネットワークファイル)
-d hmms/hmm.2 (入力HMMディレクトリ)
lists/bcpvocab (辞書ファイル)
lists/bcplist (hmmリスト)
data/test/tr1.mfc data/test/tr2.mfc data/test/tr3.mfc (Data Files)

toolsconfs/hviteVQ.conf

BYTEORDER       = NONVAX
TARGETKIND = MFCC_E_D_V
SAVEGLOBOPTS = TRUE
KEEPDISTINCT=F
BINARYACCFORMAT=F
VQTABLE=codebooks/currentCodebook

networks/monLattice

VERSION=1.0
N=8    L=16   
I=0    W=S                   
I=1    W=!NULL               
I=2    W=N                   
I=3    W=L                   
I=4    W=C                   
I=5    W=V                   
I=6    W=!NULL               
I=7    W=!NULL               
J=0     S=1    E=0    
J=1     S=7    E=0    
J=2     S=0    E=1    
J=3     S=2    E=1    
J=4     S=3    E=1    
J=5     S=4    E=1    
J=6     S=5    E=1    
J=7     S=1    E=2    
J=8     S=7    E=2    
J=9     S=1    E=3    
J=10    S=7    E=3    
J=11    S=1    E=4    
J=12    S=7    E=4    
J=13    S=1    E=5    
J=14    S=7    E=5    
J=15    S=1    E=6    

lists/bcpvocab

S S
C C
V V
N N
L L

解析


% HResults -A
-L labels/bcplabs/mon
lists/bcplist
test/te1.rec test/te2.rec test/te3.rec

注意点

configファイル内のディレクトリ名は数字から 始まらないこと (Segmentation Faultで落ちることがある)

リンク