HTKによる音響モデル構築
日本語話し言葉コーパス(CSJ)を使ったHTK音響モデル構築*1 †
0.はじめに †
用語 †
- CSJ … Corpus of Spontaneous Japanese の略。
- HTK … Hidden Markov Model Tool Kit の略。
- 音声認識アプリ Julius/Julian の音響モデルとして利用できる (参考)
- Hidden Markov Model(HMM) … 隠れマルコフモデル (参照)*2
教科書・参考文献 †
- 「HTKによる大語彙連続音声認識, 菊池英明, 2000」
- HTK(Hidden Markov Model Toolkit)(早稲田大 菊池先生)
- HTK Book
- 音声メディア研究室 HMM 作成メモ
- JNAS CDROMからIPA音響モデルの作成法
- HTK の使い方
- 連続音声認識システムに使用するアルゴリズム(Viterbiアルゴリズム)
- UNDERSTANDING HTK ERROR MESSAGES (USING HTK) - エラーの種類と対処法
インストール(Linux) †
- まずは、HTKをダウンロードします(ユーザ名登録が必要*3)。
- Linux/Unix downloads > HTK source code (tar+gzip archive) を選択、HTK-3.4.1.tar.gz と HTK-samples-3.4.1.tar.gz をダウンロードしました(2009年10月23日現在)。
- ここでは、ファイルを /home/m-kouki/HTK/ 以下におきました。
- 解凍してコンパイルします*4
cd /home/m-kouki/HTK/ tar xzvf HTK-3.4.1.tar.gz tar xzvf HTK-samples-3.4.1.tar.gz cd ./htk ./configure --prefix=/home/m-kouki/HTK/ make all make install
- コンパイルに成功したら、/home/m-kouki/HTK/ 内に実行ファイルの入ったディレクトリ bin が作られます。
- 起動時に自動的にパスが通るようにしておきます*5。
emacs /home/m-kouki/.bash_profile
- .bash_profile
"export PATH=$PATH:/home/m-kouki/HTK/bin/" を追加 "HTK_HOME=/home/m-kouki/HTK; export HTK_HOME" を追加
- 以降は「$HTK_HOME」と指定すれば、自動的に /home/m-kouki/HTK/ に対応付けられます。
- .bash_profile
- パスを追記したら、SSHクライアントソフト*6を再起動しておきます。
ディレクトリ作成 †
- 作業用ディレクトリを作成しておきます。
- 今回は、HTK-CSJ ディレクトリの中に各種ファイルを作っていくことにします。
mkdir $HTK_HOME/HTK-CSJ/ mkdir $HTK_HOME/HTK-CSJ/mfcc mkdir $HTK_HOME/HTK-CSJ/config mkdir $HTK_HOME/HTK-CSJ/transcription mkdir $HTK_HOME/HTK-CSJ/recog mkdir $HTK_HOME/HTK-CSJ/hmm0 mkdir $HTK_HOME/HTK-CSJ/hmm1 mkdir $HTK_HOME/HTK-CSJ/hmm2 mkdir $HTK_HOME/HTK-CSJ/hmm3 mkdir $HTK_HOME/HTK-CSJ/hmm3_sp1 mkdir $HTK_HOME/HTK-CSJ/hmm3_sp2 mkdir $HTK_HOME/HTK-CSJ/hmm4 mkdir $HTK_HOME/HTK-CSJ/hmm5 mkdir $HTK_HOME/HTK-CSJ/hmm6 mkdir $HTK_HOME/HTK-CSJ/hmm7 mkdir $HTK_HOME/HTK-CSJ/hmm7_sp mkdir $HTK_HOME/HTK-CSJ/hmm8 mkdir $HTK_HOME/HTK-CSJ/hmm9 mkdir $HTK_HOME/HTK-CSJ/hmm10 mkdir $HTK_HOME/HTK-CSJ/hmm10_sp mkdir $HTK_HOME/HTK-CSJ/hmm11 mkdir $HTK_HOME/HTK-CSJ/hmm12
- 今回は、HTK-CSJ ディレクトリの中に各種ファイルを作っていくことにします。
1.音声ファイルの準備 †
- CSJがインストールされているディレクトリを探索して、XMLファイルとWAVファイルのパスを調べます。
- SearchXMLPassCSJ.java を実行してください*7。
java SearchXMLPassCSJ /home/CSJ F $HTK_HOME/HTK-CSJ/transcription/xmlfilelist.txt
- ここでは、女性のみ対象としています。*8
- 出力されたファイル($HTK_HOME/HTK-CSJ/transcription/xmlfilelist.txt)の例
S08F1465,/home/CSJ/disc13/S08F1465/S08F1465.xml,/home/CSJ/disc13/S08F1465/S08F1465.wav S11F1268,/home/CSJ/disc13/S11F1268/S11F1268.xml,/home/CSJ/disc13/S11F1268/S11F1268.wav ...
- SearchXMLPassCSJ.java を実行してください*7。
2.テキストファイルの準備 †
- コーパス付属のXMLファイルを加工して、HTK フォーマットのテキストファイル群を作ります。
- 作る必要のあるファイル一覧と、HTKフォーマットのサンプルを以下に示します。
種類 | サンプル | 備考 |
読み上げテキスト | CSJ_F_transcription.PROMPT | ヘッダは */(ファイル名)_(発話名) |
単語辞書 | CSJ_F_train.word.dict | |
単語ラベル | CSJ_F_train.word.lbl | |
発音辞書 | CSJ_F_monophones0.dict | ショートポーズ記号なし |
CSJ_F_monophones1.dict | ショートポーズ記号あり | |
使用音素リスト(モノフォン) | CSJ_F_monophones0.lst | ショートポーズ記号なし |
CSJ_F_monophones1.lst | ショートポーズ記号あり | |
音素ラベル(モノフォン) | CSJ_F_train.phone0.lbl | ショートポーズ記号なし |
CSJ_F_train.phone1.lbl | ショートポーズ記号あり | |
使用音素リスト(トライフォン) | CSJ_F_triphones.lst | |
音素ラベル(トライフォン) | CSJ_F_triphone.mlf | モノフォンの学習結果より作成 |
2.1.読み上げテキストを作成する †
- makePROMPT.xsl MoraPhonemeList.txt HtkMakePromptCSJ.java を全て $HTK_HOME/HTK-CSJ/ において、以下を実行*9
java HtkMakePromptCSJ $HTK_HOME/HTK-CSJ/transcription/xmlfilelist.txt $HTK_HOME/HTK-CSJ/transcription/CSJ_F_transcription.PROMPT MoraPhonemeList.txt sjis
- CSJ_F_transcription.PROMPT ができます。
- 注意 : 長音記号「ー」は、ここでは独立した音素「H」として記述します
- CSJでは、固有名詞等は雑音に置換され、音素ラベル「☓」が付加されています。そのため「警告 : モーラ ×に対応する音素表記が見つかりませ でした」とメッセージが出ますが、無視してかまいません。
- CSJ_F_transcription.PROMPT ができます。
- 以降、.PROMPTファイルから全ての辞書ファイルを生成します。*10
2.2.単語辞書、単語ラベル、音素ラベルを作成する †
- 単語辞書
- HtkMakeWordDict.java を実行
java HtkMakeWordDict $HTK_HOME/HTK-CSJ/transcription/CSJ_F_transcription.PROMPT utf-8 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_train.word.dict utf-8
- 引数は [.PROMPTファイルのパス] [.PROMPTファイルの文字コード] [単語辞書ファイルのパス] [単語辞書ファイルの文字コード]
- CSJ_F_train.word.dict ができます。
- HtkMakeWordDict.java を実行
- 単語ラベル
- HtkMakeWordLbl.java を実行
java HtkMakeWordLbl $HTK_HOME/HTK-CSJ/transcription/CSJ_F_transcription.PROMPT utf-8 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_train.word.lbl utf-8
- 引数は [.PROMPTファイルのパス] [.PROMPTファイルの文字コード] [単語ラベルファイルのパス] [単語ラベルファイルの文字コード]
- CSJ_F_train.word.lbl ができます。
- HtkMakeWordLbl.java を実行
2.3.発音辞書と、使用音素リストを作成する(モノフォン) †
- モノフォン学習の初期段階では、無音部記号(sil, silence)は音素として扱いますが、ショートポーズ記号(sp, short pause)は音素扱いしません*11。そのため sp のあるファイルと、ないファイルを別々に作ります。
- 発音辞書(モノフォン)
- ショートポーズ記号なし
java HtkMakeMonophonesDict $HTK_HOME/HTK-CSJ/transcription/CSJ_F_transcription.PROMPT utf-8 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones0.dict utf-8 H sil
- 引数は [.PROMPTファイルのパス] [.PROMPTファイルの文字コード] [音素ラベルファイルのパス] [音素ラベルファイルの文字コード] [長音記号] [無音部記号]
- CSJ_F_monophones0.dict ができます。
- ショートポーズ記号あり
java HtkMakeMonophonesDict $HTK_HOME/HTK-CSJ/transcription/CSJ_F_transcription.PROMPT utf-8 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones1.dict utf-8 H sil sp
- 引数は [.PROMPTファイルのパス] [.PROMPTファイルの文字コード] [音素ラベルファイルのパス] [音素ラベルファイルの文字コード] [長音記号] [無音部記号] [ショートポーズ記号]
- CSJ_F_monophones1.dict ができます。
- 注意 : 同じ単語に対して、複数の音素表記がなされる場合があります(同じ単語が複数行出現する場合があります)。とりあえずこのまま先に進みます。
- 使用音素リスト(モノフォン)
- ショートポーズ記号なし
java HtkMakeMonophonesLst $HTK_HOME/HTK-CSJ/transcription/CSJ_F_transcription.PROMPT utf-8 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones0.lst utf-8 H sil
- 引数は [.PROMPTファイルのパス] [.PROMPTファイルの文字コード] [音素ラベルファイルのパス] [音素ラベルファイルの文字コード] [長音記号] [無音部記号]
- CSJ_F_monophones0.lst ができます。
- ショートポーズ記号あり
java HtkMakeMonophonesLst $HTK_HOME/HTK-CSJ/transcription/CSJ_F_transcription.PROMPT utf-8 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones1.lst utf-8 H sil sp
- 引数は [.PROMPTファイルのパス] [.PROMPTファイルの文字コード] [音素ラベルファイルのパス] [音素ラベルファイルの文字コード] [長音記号] [無音部記号] [ショートポーズ記号]
- CSJ_F_monophones1.lst ができます。
2.3.音素ラベルを作成する †
- 音素ラベルも、ショートポーズあり、なしの二種類を作る必要があります。
- ショートポーズなし
java HtkMakePhoneLbl $HTK_HOME/HTK-CSJ/transcription/CSJ_F_transcription.PROMPT utf-8 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_train.phone0.lbl utf-8 H sil
- 引数は [.PROMPTファイルのパス] [.PROMPTファイルの文字コード] [音素ラベルファイルのパス] [音素ラベルファイルの文字コード] [長音記号]*12 [無音部記号]
- CSJ_F_train.phone0.lbl ができます。*13
- 長音記号は、ここで母音と結合されて長母音となります。
- ショートポーズあり
java HtkMakePhoneLbl $HTK_HOME/HTK-CSJ/transcription/CSJ_F_transcription.PROMPT utf-8 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_train.phone1.lbl utf-8 H sil sp
- 引数は [.PROMPTファイルのパス] [.PROMPTファイルの文字コード] [音素ラベルファイルのパス] [音素ラベルファイルの文字コード] [長音記号]*14 [無音部記号] [ショートポーズ記号]
- CSJ_F_train.phone1.lbl ができます。*15
2.5.使用音素リストと、音素ラベルを作成する(トライフォン) †
- 注:モノフォンの学習を完了して、自動ラベリングにより aligned.mlf を作っておく必要があります。
- はじめに、音素ラベルの仕様ファイルを作ります。
emacs $HTK_HOME/HTK-CSJ/config/mktri.led
- mktri.led
WB sp #sp is word boundary WB sil #sil is sentence boundary TC
- 1行目と2行目:sp と sil は音素ではないので除外する、という意味。
- 3行目:トライフォンへの変換命令、TCの後は改行しておきます*16
- mktri.led
- 使用音素リストと音素ラベルを作成
HLEd -n $HTK_HOME/HTK-CSJ/transcription/CSJ_F_triphones.lst -l '*' -i $HTK_HOME/HTK-CSJ/transcription/CSJ_F_triphone.mlf $HTK_HOME/HTK-CSJ/config/mktri.led $HTK_HOME/HTK-CSJ/aligned.mlf
- トライフォン音素リスト CSJ_F_triphones.lst と、
トライフォン音素ラベル CSJ_F_triphone.mlf ができます。
- トライフォン音素ラベルは、モノフォン学習の自動ラベリング結果aligned.mlf から作られます。
- トライフォン音素リスト CSJ_F_triphones.lst と、
トライフォン音素ラベル CSJ_F_triphone.mlf ができます。
3.HTKによるHMMの学習 †
3.1.音声データのコーディング †
- MFCC解析のコーディング仕様ファイル config.hcopy を作成
emacs $HTK_HOME/HTK-CSJ/config/config.hcopy
- config.hcopy
#Cording Parameters SOURCEFORMAT = WAVE SOURCEKIND = WAVEFORM SOURCERATE = 625.0 TARGETKIND = MFCC_E_D_A TARGETRATE = 100000.0 SAVECOMPRESSED = T SAVEWITHCRC = F WINDOWSIZE = 250000.0 USEHAMMING = T PREEMCOEF = 0.97 NUMCHANS = 24 NUMCEPS = 12
- config.hcopy
- MFCC解析
- HtkRunHCopy.java を実行
java HtkRunHCopy $HTK_HOME/HTK-CSJ/transcription/CSJ_F_transcription.PROMPT utf-8 $HTK_HOME/HTK-CSJ/config/CSJ_F_train.hmm.script utf-8 $HTK_HOME/HTK-CSJ/config/config.hcopy $HTK_HOME/HTK-CSJ/mfcc
- 引数は [.PROMPTファイルのパス] [.PROMPTファイルの文字コード] [mfcリストファイルのパス] [mfcリストファイルの文字コード] [config.hcopyファイルのパス] [mfcファイルの出力場所]
- $HTK_HOME/HTK-CSJ/mfcc 以下に、発話ごとの mfcファイルが出力されます。*17
- また、$HTK_HOME/HTK-CSJ/config 以下に、mfcリストファイル CSJ_F_train.hmm.script ができます。
- HtkRunHCopy.java を実行
3.2.HMM初期モデルの作成 †
- まずは、学習に使用する音響特徴量を記述した学習仕様ファイルを作ります。
emacs $HTK_HOME/HTK-CSJ/config/config.train
- config.train
TARGETKIND = MFCC_E_D_A
- config.train
- 続いて、HTK Book p.31以降 を参考に、HMM初期仕様ファイル proto を作ります。
emacs $HTK_HOME/HTK-CSJ/config/proto
- proto
~o <VecSize> 39 <MFCC_E_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>
- proto
- HMM 初期モデルファイル hmm0/proto を生成します。
HCompV -C $HTK_HOME/HTK-CSJ/config/config.train -f 0.01 -m -S $HTK_HOME/HTK-CSJ/config/CSJ_F_train.hmm.script -M hmm0 $HTK_HOME/HTK-CSJ/config/proto
- hmm0/proto ができます。
- もしも hmm0/proto ができなかった場合は、xmlfilelist.txt の作成に失敗している可能性があります。
- hmm0/proto ができます。
- HMM 初期モデルファイル hmm0/proto 中のマクロ定義部分を取り出し、hmm0/macro を作ります。*18
grep '~o' $HTK_HOME/HTK-CSJ/config/proto > $HTK_HOME/HTK-CSJ/hmm0/macro
- hmm0/macro ができます。
- HMM 定義ファイル hmm0/hmmdefs を作成します。
- HtkMakeHmmdefs.java を実行
java HtkMakeHmmdefs $HTK_HOME/HTK-CSJ/hmm0/proto sjis ./transcription/CSJ_F_monophones0.lst utf-8 $HTK_HOME/HTK-CSJ/hmm0/hmmdefs sjis 39 MFCC_E_D_A
- 引数は [protoファイルのパス] [protoファイルの文字コード] [使用音素リスト(モノフォン)ファイルのパス] [使用音素リスト(モノフォン)ファイルの文字コード] [出力ファイルのパス] [出力ファイルの文字コード] [mfcc次元数] [mfccタイプ]
- hmm0/hmmdefs ができます。
- hmmdefs は、 hmm0/proto の中身を学習する音素の数だけコピーしたものです。
- HtkMakeHmmdefs.java を実行
3.3.monophoneHMMの作成 †
- モノフォンの学習(初期モデルのパラメータ推定)を行ないます。
- 1回目
HERest -C $HTK_HOME/HTK-CSJ/config/config.train -I $HTK_HOME/HTK-CSJ/transcription/CSJ_F_train.phone0.lbl -t 250.0 150.0 1000.0 -S $HTK_HOME/HTK-CSJ/config/CSJ_F_train.hmm.script -H $HTK_HOME/HTK-CSJ/hmm0/macro -H $HTK_HOME/HTK-CSJ/hmm0/hmmdefs -M $HTK_HOME/HTK-CSJ/hmm1 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones0.lst
- 出た FATAL ERROR と対処*19
ERROR [+6550] LoadHTKLabels: Junk at end of HTK transcription
→「-T 1」オプションをつけて再実行し、原因の .mfc ファイルを特定して、CSJ_F_train.hmm.script から削除
- 出た FATAL ERROR と対処*19
- 1回目
- 以下の警告が出るけれど、無視してOK(以下同様)
Pruning-On[250.0 150.0 1000.0] WARNING [-7324] StepBack: File ./mfcc/0001_0099.mfc - bad data or over pruning in HERest WARNING [-7324] StepBack: File ./mfcc/0001_0102.mfc - bad data or over pruning in HERest (略) WARNING [-2331] UpdateModels: H[2] copied: only 0 egs in HERest WARNING [-2331] UpdateModels: v[22] copied: only 0 egs in HERest (略)
- 2回目
HERest -C $HTK_HOME/HTK-CSJ/config/config.train -I $HTK_HOME/HTK-CSJ/transcription/CSJ_F_train.phone0.lbl -t 250.0 150.0 1000.0 -S $HTK_HOME/HTK-CSJ/config/CSJ_F_train.hmm.script -H $HTK_HOME/HTK-CSJ/hmm1/macro -H $HTK_HOME/HTK-CSJ/hmm1/hmmdefs -M $HTK_HOME/HTK-CSJ/hmm2 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones0.lst
- 3回目
HERest -C $HTK_HOME/HTK-CSJ/config/config.train -I $HTK_HOME/HTK-CSJ/transcription/CSJ_F_train.phone0.lbl -t 250.0 150.0 1000.0 -S $HTK_HOME/HTK-CSJ/config/CSJ_F_train.hmm.script -H $HTK_HOME/HTK-CSJ/hmm2/macro -H $HTK_HOME/HTK-CSJ/hmm2/hmmdefs -M $HTK_HOME/HTK-CSJ/hmm3 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones0.lst
- ここまで学習が終わったら、無音部 sil を細分化して、単語境界に出現するショートポーズを表現する音素 sp と、文末に出現する無音部を表現する音素 sil に分けます。
- モデル修正仕様ファイル sil.hed を作成します。
emacs $HTK_HOME/HTK-CSJ/config/sil.hed
- sil.hed
AT 2 4 0.2 {sil.transP} AT 4 2 0.2 {sil.transP} AT 1 3 0.3 {sp.transP} TI silst {sil.state[3],sp.state[2]}
- sil.hed
- モデル修正仕様ファイル sil.hed を作成します。
- 初期学習が完了したHMM定義ファイル(hmm3/hmmdefs)の無音部記号に相当する音素をコピーしてショートポーズに相当する音素を追記し、新規のファイル(hmm3_sp/hmmdefs0)を出力します。*20。
- HtkMakeHmmdefsShortPause.java を実行
java HtkMakeHmmdefsShortPause $HTK_HOME/HTK-CSJ/hmm3/hmmdefs utf-8 $HTK_HOME/HTK-CSJ/hmm3_sp1/hmmdefs utf-8 sil sp
- 引数は [hmm3/hmmdefsファイルのパス] [hmm3/hmmdefsファイルの文字コード] [出力ファイルのパス] [出力ファイルの文字コード] [無音部記号] [ショートポーズ記号]
- hmm3_sp1/hmmdefs ができます。
- HtkMakeHmmdefsShortPause.java を実行
- モデルの修正を行ないます。
cp $HTK_HOME/HTK-CSJ/hmm3/macro $HTK_HOME/HTK-CSJ/hmm3_sp1 HHEd -H $HTK_HOME/HTK-CSJ/hmm3_sp1/macro -H $HTK_HOME/HTK-CSJ/hmm3_sp1/hmmdefs -M $HTK_HOME/HTK-CSJ/hmm3_sp2 $HTK_HOME/HTK-CSJ/config/sil.hed $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones1.lst
- hmm3_sp2/hmmdefs と hmm3_sp2/macro ができます。
- 修正したモデルについて、さらに2回の学習を行ないます。
- ここからはショートポーズありのモノフォンラベルファイルを使います。
- 4回目
HERest -C $HTK_HOME/HTK-CSJ/config/config.train -I $HTK_HOME/HTK-CSJ/transcription/CSJ_F_train.phone1.lbl -t 250.0 150.0 1000.0 -S $HTK_HOME/HTK-CSJ/config/CSJ_F_train.hmm.script -H $HTK_HOME/HTK-CSJ/hmm3_sp2/macro -H $HTK_HOME/HTK-CSJ/hmm3_sp2/hmmdefs -M $HTK_HOME/HTK-CSJ/hmm4 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones1.lst
- 5回目
HERest -C $HTK_HOME/HTK-CSJ/config/config.train -I $HTK_HOME/HTK-CSJ/transcription/CSJ_F_train.phone1.lbl -t 250.0 150.0 1000.0 -S $HTK_HOME/HTK-CSJ/config/CSJ_F_train.hmm.script -H $HTK_HOME/HTK-CSJ/hmm4/macro -H $HTK_HOME/HTK-CSJ/hmm4/hmmdefs -M $HTK_HOME/HTK-CSJ/hmm5 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones1.lst
3.4.自動ラベリング †
- ここまでの学習結果を確認するために、HTK付属のHViteコマンド*21を使用して自動ラベリングを行ないます。
HVite -l '*' -o SWC -b SILENCE -a -H $HTK_HOME/HTK-CSJ/hmm5/macro -H $HTK_HOME/HTK-CSJ/hmm5/hmmdefs -i $HTK_HOME/HTK-CSJ/aligned.mlf -m -t 5000.0 -I $HTK_HOME/HTK-CSJ/transcription/CSJ_F_train.word.lbl -S $HTK_HOME/HTK-CSJ/config/CSJ_F_train.hmm.script $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones1.dict $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones1.lst
- コーディング仕様ファイル config.hcopy のパスは指定しなくてOK*22
- 自動ラベリングの結果は、$HTK_HOME/HTK-CSJ/aligned.mlf に出力されます。
- aligned.mlf
- 音素ラベル CSJ_F_train.phone1.lbl と比べてみても、なかなかの正解率であるといえます。*23
- aligned.mlf
- 自動ラベリングの結果(Hviteコマンドに -a, -m オプションを設定して出力した .lab フォーマット*24)を Praat 標準の形式に変換するスクリプト
- seg層を出力 transalignHTK2textgrid.pl
- Word層、Auto align層、Segment層、Memo層を出力 transalignHTK2textgrid2.pl
- ここまでうまくいっていたら、もう2回分 monophone 学習をしておきます。*25
- 6回目
HERest -C $HTK_HOME/HTK-CSJ/config/config.train -I $HTK_HOME/HTK-CSJ/transcription/CSJ_F_train.phone1.lbl -t 250.0 150.0 1000.0 -S $HTK_HOME/HTK-CSJ/config/CSJ_F_train.hmm.script -H $HTK_HOME/HTK-CSJ/hmm5/macro -H $HTK_HOME/HTK-CSJ/hmm5/hmmdefs -M $HTK_HOME/HTK-CSJ/hmm6 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones1.lst
- 7回目
HERest -C $HTK_HOME/HTK-CSJ/config/config.train -I $HTK_HOME/HTK-CSJ/transcription/CSJ_F_train.phone1.lbl -t 250.0 150.0 1000.0 -S $HTK_HOME/HTK-CSJ/config/CSJ_F_train.hmm.script -H $HTK_HOME/HTK-CSJ/hmm6/macro -H $HTK_HOME/HTK-CSJ/hmm6/hmmdefs -M $HTK_HOME/HTK-CSJ/hmm7 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones1.lst
- 音響モデルの認識率を評価したい場合は、monophone音響モデルの認識率を求める を参照してください。
- ※ 音素の解析や比較が目的であれば、ここまでで十分です(トライフォンの学習は不要です)。
3.5.triphoneHMMの作成 †
- 【注】先に 2.5.使用音素リストと、音素ラベルを作成する(トライフォン) を実行しておきます。
- はじめに、トライフォン初期モデルの仕様ファイル mktri.hed を作成します。
- HTK Tutorial(HTK-samples-3.4.tar.gz) 付属のPerlスクリプト maketrihed を使用します。*26
maketrihed $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones1.lst $HTK_HOME/HTK-CSJ/transcription/CSJ_F_triphones.lst
- mktri.hed ができました。
- 例えば「(*-a+*,a+*,*-a)」は、a という音素の前後の音素に関係なく、この3つは遷移確率を共有する、という意味です。トライフォン学習の初期段階では3つを一緒にして扱い、後で(できるだけ)別々に分けます。
- ファイルを config ディレクトリに移して、ファイルの整形を行ないます。
mv mktri.hed $HTK_HOME/HTK-CSJ/config emacs $HTK_HOME/HTK-CSJ/config/mktri.hed
- 音素でない sp の行を削除します。
TI T_sp {(*-sp+*,sp+*,*-sp).transP} を削除
- sil はモノフォンとして扱うように、設定を変えます。
TI T_sil {(*-sil+*,sil+*,*-sil).transP}
↓TI T_sil {(sil,*-sil+*,sil+*,*-sil).transP} に変更
- 音素でない sp の行を削除します。
- HTK Tutorial(HTK-samples-3.4.tar.gz) 付属のPerlスクリプト maketrihed を使用します。*26
- トライフォン初期モデルを作成します。
HHEd -H $HTK_HOME/HTK-CSJ/hmm7/macro -H $HTK_HOME/HTK-CSJ/hmm7/hmmdefs -M $HTK_HOME/HTK-CSJ/hmm7_sp $HTK_HOME/HTK-CSJ/config/mktri.hed $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones1.lst
- ここで作られたのは、1つの音素内の状態のモデルになります。以下の学習では音素間共有モデルを作ります。
- CSJ_F_train.hmm.script にあるのに CSJ_F_triphone.mlf にない発話を取り除きます*27。
- HtkDeleteTriphoneScript.java を実行して、CSJ_F_triphone.mlf に存在しない mfc ファイルを全て削除した CSJ_F_train_tri.hmm.script を作成します。
java HtkDeleteTriphoneScript $HTK_HOME/HTK-CSJ/transcription/CSJ_F_triphone.mlf $HTK_HOME/HTK-CSJ/config/CSJ_F_train.hmm.script $HTK_HOME/HTK-CSJ/config/CSJ_F_train_tri.hmm.script utf8 utf8 utf8
- 引数は [トライフォン音素ラベル(triphone.mlf)ファイルのパス] [mfcリストファイル(.hmm.script)のパス] [修正後mfcリストファイルのパス(出力先)] [トライフォン音素ラベルファイルの文字コード] [mfcリストファイルの文字コード] [修正後mfcリストファイルの文字コード]
- HtkDeleteTriphoneScript.java を実行して、CSJ_F_triphone.mlf に存在しない mfc ファイルを全て削除した CSJ_F_train_tri.hmm.script を作成します。
- トライフォンの学習(初期モデルのパラメータ推定)を行ないます。
- 8回目
HERest -B -C $HTK_HOME/HTK-CSJ/config/config.train -I $HTK_HOME/HTK-CSJ/transcription/CSJ_F_triphone.mlf -t 250.0 150.0 1000.0 -s stats -S $HTK_HOME/HTK-CSJ/config/CSJ_F_train_tri.hmm.script -H $HTK_HOME/HTK-CSJ/hmm7_sp/macro -H $HTK_HOME/HTK-CSJ/hmm7_sp/hmmdefs -M $HTK_HOME/HTK-CSJ/hmm8 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_triphones.lst
- 8回目
- 9回目
HERest -B -C $HTK_HOME/HTK-CSJ/config/config.train -I $HTK_HOME/HTK-CSJ/transcription/CSJ_F_triphone.mlf -t 250.0 150.0 1000.0 -s stats -S $HTK_HOME/HTK-CSJ/config/CSJ_F_train_tri.hmm.script -H $HTK_HOME/HTK-CSJ/hmm8/macro -H $HTK_HOME/HTK-CSJ/hmm8/hmmdefs -M $HTK_HOME/HTK-CSJ/hmm9 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_triphones.lst
- 10回目
HERest -B -C $HTK_HOME/HTK-CSJ/config/config.train -I $HTK_HOME/HTK-CSJ/transcription/CSJ_F_triphone.mlf -t 250.0 150.0 1000.0 -s stats -S $HTK_HOME/HTK-CSJ/config/CSJ_F_train_tri.hmm.script -H $HTK_HOME/HTK-CSJ/hmm9/macro -H $HTK_HOME/HTK-CSJ/hmm9/hmmdefs -M $HTK_HOME/HTK-CSJ/hmm10 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_triphones.lst
- トライフォン学習では大量の音素数が必要なので、類似した音素同士を共有させます。
- トライフォン音素リスト CSJ_F_triphones.lst からモデル類別木を作成し、 トライフォン音素リスト CSJ_F_triphones.lst と照合することで*28、類似する音素同士を対応付けた新しい CSJ_F_triphones_tied.lst を作成します(テキスト p.19 より引用)。*29
- HTK Tutorial(HTK-samples-3.4.tar.gz)付属(RMHTK/perl_scripts)の、mkclscript を使用します。*30
mkclscript TB 350.0 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones1.lst > $HTK_HOME/HTK-CSJ/config/tree.hed
- ここで、tree.hed には TB の情報しかないので、日本語話し言葉コーパス 音声認識のための音響モデルと言語モデルの仕様 の設定 を参考にして、設定を追記します。
emacs $HTK_HOME/HTK-CSJ/config/tree.hed
- TB ラベルの前後に情報を追加して、最終的に このような tree.hed を作りました。
- ファイル中でトライフォン音素リスト "/home/m-kouki/HTK/HTK-CSJ/transcription/CSJ_F_triphones.lst" と、修正後トライフォン音素リスト "/home/m-kouki/HTK/HTK-CSJ/transcription/CSJ_F_triphones_tied.lst" の名前を直接指定していることに注意してください(適宜書き換えて下さい)。*32
- 上記で設定しているのは、音声学の知見に基づいたクラスタリングのルールになります。*33
- tree.hed の設定を使って、モデル類別を行ないます。
HHEd -B -H $HTK_HOME/HTK-CSJ/hmm10/macro -H $HTK_HOME/HTK-CSJ/hmm10/hmmdefs -M $HTK_HOME/HTK-CSJ/hmm10_sp $HTK_HOME/HTK-CSJ/config/tree.hed $HTK_HOME/HTK-CSJ/transcription/CSJ_F_triphones.lst
- transcription ディレクトリに認識用モデルリスト CSJ_F_triphones_tied.lst ができました。例えば「sh-o+f sh-o+b」は、「sh_o」の後に「f」がきた場合と「b」がきた場合を、同じものとして扱うという設定です。*34
- さらに学習を続けます。
- 11回目
HERest -B -C $HTK_HOME/HTK-CSJ/config/config.train -I $HTK_HOME/HTK-CSJ/transcription/CSJ_F_triphone.mlf -t 250.0 150.0 1000.0 -s stats -S $HTK_HOME/HTK-CSJ/config/CSJ_F_train_tri.hmm.script -H $HTK_HOME/HTK-CSJ/hmm10/macro -H $HTK_HOME/HTK-CSJ/hmm10/hmmdefs -M $HTK_HOME/HTK-CSJ/hmm11 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_triphones_tied.lst
- 12回目
HERest -C $HTK_HOME/HTK-CSJ/config/config.train -I $HTK_HOME/HTK-CSJ/transcription/CSJ_F_triphone.mlf -t 250.0 150.0 1000.0 -s stats -S $HTK_HOME/HTK-CSJ/config/CSJ_F_train_tri.hmm.script -H $HTK_HOME/HTK-CSJ/hmm11/macro -H $HTK_HOME/HTK-CSJ/hmm11/hmmdefs -M $HTK_HOME/HTK-CSJ/hmm12 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_triphones_tied.lst
- 「-B」オプション(バイナリ指定)を除いて、結果をテキストで読めるようにしました。
- 学習12回目のhmmdefs
4.音声認識を試す †
monophone音響モデルの認識率を求める †
- monophone学習までが完了しているとします。
- 音声認識実験用のファイルを作ります。
- 単語辞書ファイルにSTARTラベルとENDラベルを追記する
cp $HTK_HOME/HTK-CSJ/transcription/CSJ_F_train.word.dict $HTK_HOME/HTK-CSJ/recog/recog_CSJ_F_train.word.dict emacs $HTK_HOME/HTK-CSJ/recog/recog_CSJ_F_train.word.dict
- 以下のように書き換える
× ×× (略)
↓START END × ×× (略)
- 以下のように書き換える
- 発音辞書ファイルにSTARTラベルとENDラベルを追記する
cp $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones1.dict $HTK_HOME/HTK-CSJ/recog/recog_CSJ_F_monophones1.dict emacs $HTK_HOME/HTK-CSJ/recog/recog_CSJ_F_monophones1.dict
- 以下のように書き換える
SILENCE sil × sp (略)
↓START sp END sp SILENCE sil × sp (略)
- 以下のように書き換える
- なお、上の「単語辞書ファイルにSTARTラベルとENDラベルを追記する」「発音辞書ファイルにSTARTラベルとENDラベルを追記する」の処理を一括して、以下のスクリプトで実施できます。
- HtkAddStartEnd.java
java HtkAddStartEnd $HTK_HOME/HTK-CSJ/transcription/CSJ_F_train.word.dict $HTK_HOME/HTK-CSJ/recog/recog_CSJ_F_train.word.dict $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones1.dict $HTK_HOME/HTK-CSJ/recog/recog_CSJ_F_monophones1.dict utf8
- HtkAddStartEnd.java
- 認識実験に使うファイルのリストを作る
- 今回は、mfcリストファイル CSJ_F_train.hmm.script をそのまま使い、クローズドテストを行います*35。
cp $HTK_HOME/HTK-CSJ/config/CSJ_F_train.hmm.script $HTK_HOME/HTK-CSJ/recog/recog_CSJ_F_train.hmm.script
- 今回は、mfcリストファイル CSJ_F_train.hmm.script をそのまま使い、クローズドテストを行います*35。
- ネットワーク文法の生成
- recog/bigram の作成*36
HLStats -s START END -b $HTK_HOME/HTK-CSJ/recog/bigram -o $HTK_HOME/HTK-CSJ/recog/recog_CSJ_F_train.word.dict $HTK_HOME/HTK-CSJ/transcription/CSJ_F_train.word.lbl
- recog/bg.networkの作成
HBuild -s START END -n $HTK_HOME/HTK-CSJ/recog/bigram $HTK_HOME/HTK-CSJ/recog/recog_CSJ_F_train.word.dict $HTK_HOME/HTK-CSJ/recog/bg.network
- recog/bigram の作成*36
- 音声認識
- 学習7回目の設定ファイル($HTK_HOME/HTK-CSJ/hmm7)の評価をします*37。
HVite -C $HTK_HOME/HTK-CSJ/config/config.train -H $HTK_HOME/HTK-CSJ/hmm7/macro -H $HTK_HOME/HTK-CSJ/hmm7/hmmdefs -S $HTK_HOME/HTK-CSJ/recog/recog_CSJ_F_train.hmm.script -l '*' -i $HTK_HOME/HTK-CSJ/recog/recout_mono.mlf -w $HTK_HOME/HTK-CSJ/recog/bg.network -p 0.0 -s 5.0 $HTK_HOME/HTK-CSJ/recog/recog_CSJ_F_monophones1.dict $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones1.lst
- 認識結果は recog/recout_mono.mlf に出力されます。
- recout_mono.mlf
- 4列目のデータが認識尤度。設定を変えれば音素ごとの尤度も出せるはず。*38
- 学習7回目の設定ファイル($HTK_HOME/HTK-CSJ/hmm7)の評価をします*37。
- 認識率を求めます。
- HtkDeleteSpaceWordLbl.java を実行
java HtkDeleteSpaceWordLbl $HTK_HOME/HTK-CSJ/transcription/CSJ_F_train.word.lbl $HTK_HOME/HTK-CSJ/recog/recog_CSJ_F_train.word.lbl utf8 utf8
- 引数は [単語ラベル(_train.word.lbl)ファイルのパス] [修正後の単語ラベルファイルのパス(出力先)] [単語ラベルファイルの文字コード] [修正後の単語ラベルファイルの文字コード]
- 発話のない区間を除去した単語ラベルファイル recog_CSJ_F_train.word.lbl が出力されました。
- HtkDeleteSpaceMonoMlf.java を実行
java HtkDeleteSpaceMonoMlf $HTK_HOME/HTK-CSJ/recog/recout_mono.mlf $HTK_HOME/HTK-CSJ/recog/recout_mono_delspace.mlf $HTK_HOME/HTK-CSJ/recog/recog_CSJ_F_train.word.lbl utf8 utf8 utf8
- HtkDeleteSpaceWordLbl.java を実行
- 認識率の計算*41
HResults -I $HTK_HOME/HTK-CSJ/recog/recog_CSJ_F_train.word.lbl $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones1.lst $HTK_HOME/HTK-CSJ/recog/recout_mono_delspace.mlf
- 以下のように表示されます。
====================== HTK Results Analysis ======================= Date: Wed May 19 21:52:19 2010 Ref : /home/m-kouki/HTK/HTK-CSJ/out/rec_CSJ_F_train.word.lbl Rec : /home/m-kouki/HTK/HTK-CSJ/out/recout_mono_delspace.mlf ------------------------ Overall Results -------------------------- SENT: %Correct=0.00 [H=0, S=737, N=737] WORD: %Corr=51.98, Acc=20.39 [H=3001, D=602, S=2170, I=1824, N=5773] ===================================================================
- SENT は、「N個の発話文のうち、H個の文が正しく認識された(Correct[%] = H / N * 100)」ことを示しています。
- WORD は、「N個の単語のうち、 H個の単語が正しく認識された(Corr[%] = H / N * 100)」ことを示しています。また、D個の削除エラー(deletion error)、S個の代用エラー(substitution error)、I個の挿入エラー(insertion error)があったことを示しています。挿入エラーを考慮した認識率が Acc、 考慮しない認識率が Corr です。*42
triphone音響モデルの認識率を求める †
- triphone学習までが完了しているとします。
- 「評価用のラベルファイルを作る」 ~ 「ネットワーク文法の生成」 までは、monophoneの場合 と同じなので、そちらを参考にして下さい。
- トライフォン 音声認識仕様ファイルの作成
emacs $HTK_HOME/HTK-CSJ/config/config.hvite.tri
- config.hvite.tri
TARGETKIND = MFCC_E_D_A # MFCC_E + Delta + Delta Delta FORCECXTEXP = T ALLOWXWRDEXP = F
- テキスト p.22 より引用。なおモノフォンの認識実験のときは config.train を使っていました。
- config.hvite.tri
- 音声認識
- 学習12回目の設定ファイル($HTK_HOME/HTK-CSJ/hmm12)の評価をします。*43
HVite -C $HTK_HOME/HTK-CSJ/config/config.hvite.tri -H $HTK_HOME/HTK-CSJ/hmm12/macro -H $HTK_HOME/HTK-CSJ/hmm12/hmmdefs -S $HTK_HOME/HTK-CSJ/recog/recog_CSJ_F_train.hmm.script -l '*' -i $HTK_HOME/HTK-CSJ/recog/recout_tri.mlf -w $HTK_HOME/HTK-CSJ/recog/bg.network -p 0.0 -s 5.0 $HTK_HOME/HTK-CSJ/recog/recog_CSJ_F_monophones1.dict transcription/CSJ_F_triphones_tied.lst
- 出た FATAL ERROR と対処*44
ERROR [+8231] GetHCIModel: Cannot find hmm [e-]y[+a]
→ 音素リスト CSJ_F_triphones_tied.lst には「e y a」の音素がないにもかかわらず、発音辞書 recog_CSJ_F_monophones1.dict にはこの発音をする単語が入っていることによるエラーです。CSJ_F_train.word.lbl の段階では存在していた MFC ファイルが、 aligned.mlf の作成時に対象外とされてしまったことが原因のようです。
対処法1
delTriphone.txt のように、recog_CSJ_F_monophones1.dictの単語をかたっぱしから手動修正すればうまくいきますが、きりがないので別の方法を考えます。
対処法2
recog_CSJ_F_monophones1.dict から「e y a」を含む単語(あえや、目安)を削除します。すると「ERROR [+8251] ReadLattice: Word あえや not in dict」エラーが出ます。これは、この単語が含まれた recog_CSJ_F_train.word.dict を使ってネットワーク文法の生成を行ったためです。そこで、aligned.mlf で対象外とされてしまった発話に含まれる単語を除外した recog_CSJ_F_monophones1.dict と recog_CSJ_F_train.word.dict を作り、再度ネットワーク文法の作成を行います。
- 出た FATAL ERROR と対処*44
- 学習12回目の設定ファイル($HTK_HOME/HTK-CSJ/hmm12)の評価をします。*43
- 対処法2を実施、HtkMakeRecogDicts.java を実行 まだエラーが出る。
monophone音響モデルをJuliusに組み込む †
triphone音響モデルをJuliusに組み込む †
5.話者適応 †
- 音響モデルの適応と評価 で音響モデルの話者適応に関する検討を行なっています。
- SOMによる音響モデルの話者適応 で SOM と既存の HMM 音響モデルの比較・検討を行なっています。
- kmeans法による音響モデルの話者適応 で SOM と別手法の比較をしています。
6.その他の検討 †
- JNASによる音響モデルの構築(途中で中断)
- JNAS … Japanese Newspaper Article Sentences の略。
- SOMによる母音カテゴリの推定 で SOM の学習精度の向上に関して検討しています。
- 複数混合数のモノフォン音響モデル
- HTSによるHMM音声合成
*1 昔の検討
*2 HMMの特徴の分かりやすい説明:ディジタル蝸牛モデルとHMMを用いた音声認識(東京理科大 佐藤先生)
*3 リンク先のレジストレーションのページで、IDとパスワードを登録してください。なお、宮澤のIDはこちら。
*4 試行錯誤の後 田中君に感謝!!
*5 "m-kouki"のところを自分の環境に置き換えてください。
*6 TeraTermProやターミナル
*7 詳細:コーパス加工用プログラム/日本語話し言葉コーパス(CSJ)/ディレクトリをサーチしてXMLファイルのパスを取得する
*8 もしも disc03 に収録された音声のみを対象にしたい場合は、第一引数に /home/CSJ/disc03 を指定します。また、もしも単独話者のみを対象にしたい場合は、第二引数に話者名(「S08F1465」など)を指定します。
*9 詳細:コーパスのXML解析/日本語話し言葉コーパス(CSJ)/HTK学習用の転記テキストファイル(.PROMPTファイル)を作成する
*10 PROMPTファイル作成までは、コーパスの転記ファイルの表記法によってプログラムが変わってきますが、以下は共通の処理になります
*11 参考:音声メディア研究室 HMM 作成メモ
*12 PROMPT ファイル中に長音記号がない場合や直前の音素と結合したくない場合(独立した音素として扱いたい場合)は、関係ない文字列を入れればOK
*13 mkphones0.led(音声メディア研究室 HMM 作成メモ より) を作成して、HTK付属の $ HLEd -l '*' -d ./transcription/CSJ_F_monophones0.dict -i ./transcription/CSJ_F_train.phone0.lbl mkphones0.led ./transcription/CSJ_F_train.word.lbl を実行して作成することもできます。ただし、CSJ_F_train.word.lbl に、同じ単語で複数の読みをする語があるため、結果は同じにはなりません。
*14 PROMPT ファイル中に長音記号がない場合や直前の音素と結合したくない場合(独立した音素として扱いたい場合)は、関係ない文字列を入れればOK
*15 mkphones0.led から DE sp を除いた mkphones1.led を作成して、HTK付属の $HLEd -l '*' -d ./transcription/CSJ_F_monophones1.dict -i CSJ_F_train.phone1.lbl mkphones1.led ./transcription/CSJ_F_train.word.lbl を実行して作成することもできます。ただし、結果は同じにはなりません。
*16 改行しないと、以下の処理で「ERROR [+1230] ReadLabId: string arg expected ...」エラーが出ます。
*17 mfcファイルはバイナリなので読めません。テキストファイルに変換するには、次のコードを実行します。 HList -o -h .mfcファイル名 > .txtファイル名
*18 proto 中の「~o」という文字列が含まれる行を hmm0/macro に書き出しています(参考)。
*19 音素ラベル train.phone0.lbl の中に空白行が混ざってHERestが失敗する場合もあるようです。
*20 なお、教科書(p.13)ではこの処理は行わず、はじめから sp と sil を定義した hmmdefs で学習を行い、HHEd のみ実行しています。音声メディア研究室 HMM 作成メモ では、sil の状態3 のみコピーして sp を追記しています。ここでは sil を丸ごとコピーして sp を作っていますが、より適当な方法があるかもしれません。
*21 HViteコマンドは、類似した音素を統合するある種の教師なし学習を行っています。詳細は HTK Book のp.178以降 および p.244以降 を参照
*22 指定すると、ERROR [+6251] Input file is not in RIFF format のエラーが出ます(config.hcopyのSOURCEFORMAT と SOURCEKIND の値を「HTK」に書き換えると、エラーは消えました)。
*23 ただし、aligned.mlf の結果、分析されていないlabファイルがあります。これらは後のトライフォン学習の際に mfc ファイル読み込みエラーになるので、そこで対処する必要があります。
*24 早大鍔木様にお教えいただきました。ありがとうございました。
*25 モノフォンの段階では統計情報 stats を出力していませんが、この時点で話者適応を行なうなら、「-s stats」オプションを追加しておく必要があります。
*26 maketrihed、Perlスクリプト冒頭のおまじない を自分の環境にあわせて、 $ chmod a+x maketrihed で実行可能にして、maketrihed にパスを通しておきます(本文書では /home/m-kouki/HTK/bin/ の中に入れました)。
*27 これをしないと、以下の学習で ERROR [+6510] LOpen: Unable to open label file が出ます。
*28 テキストでは、「認識に必要な全てのモデルのリスト triphone_all.lst を作成する」とありますが、トライフォン音素リスト triphones.lst との違いが不明だったので、とりあえず triphones.lst をそのまま使っています。
*29 HTK Book の p.39 も参照してください。
*30 mkclscript、先頭のおまじないを「#!/usr/bin/perl」に書き換えて、 $ chmod a+x mkclscript を実行しておくこと
*31 mkclscript の引数は、HTK辞書作成手順 - 岡田特研 を参考にしました。テキストの引数とは異なっています。また、ここではトライフォンのリストでなく、モノフォンのリストを指定していますが、問題はないようです。
*32 ファイルパスは絶対パスのみ、うまくいきました。$HTK_HOME は使えません。
*33 例えば「L_Nasal」は「鼻音が前に来る」ことを示します。ここをより日本語に適した設定に変えることは、研究の意義があります(テキスト p.20 より)。
*34 モノフォンが混ざっているようですが…とりあえず先に進みます。
*35 mfcファイルの数が多いと、計算にかなり時間がかかります
*36 単語ラベル CSJ_F_train.word.lbl には、発話のない区間(「.」しかないラベル)がありますが、「WARNING [-1330] HLStats: Empty file ~」の警告が出るだけで問題なく実行されます。
*37 参考:HTK Book p.39
*38 参考:HTKによるHMMの学習
*39 これをしないと、以下で「ERROR [+6570] GetLabelList: n[1] > numLists[0]」エラーが出ます(エラー対処の参考)。
*40 これをしないと、以下で「ERROR [+6510] LOpen: Unable to open label file」エラーが出ます(エラー対処の参考)。
*41 HResults に -f オプションをつけると、ひとつひとつの発話番号に対する認識結果が出力されます(デバッグに役立ちます)。
*42 エラーの詳細 参考
*43 発音辞書 recog_CSJ_F_monophones1.dict(CSJ_F_monophones1.dict に START と END を付け加えたもの)は、テキストでは "triphones.dict" になっていますが、出自が不明なため、ここではこれを使っています。
*44 このエラーは、十分な量の音声データを使ってトライフォン学習を行っていれば、回避できると思われます。
添付ファイル: transalignHTK2textgrid2.pl 1525件 [詳細] transalignHTK2textgrid.pl 1504件 [詳細] todo_HTK.txt 2440件 [詳細] delTriphone.txt 1799件 [詳細]