ダウンロード
登録が必要
http://htk.eng.cam.ac.uk/次の3つのファイルをダウンロードする.
- HTK(http://htk.eng.cam.ac.uk/download.shtml)
- HTKsample(http://htk.eng.cam.ac.uk/download.shtml)
- HTKBooks(http://htk.eng.cam.ac.uk/docs/docs.shtml)
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
- 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.pcfprotoconfs/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で落ちることがある)