トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索   ヘルプ   最終更新のRSS

HTKによる音響モデル構築 の変更点

Top / HTKによる音響モデル構築

#freeze
#access
#analog

*日本語話し言葉コーパス(CSJ)を使ったHTK音響モデル構築(('''[[昔の検討:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki/index.php?JUNK#v5d38d17]]''')) [#pf192410]

#contents

**0.はじめに [#ad7e6b11]
***用語 [#m830ee9f]
-CSJ … Corpus of Spontaneous Japanese の略。
-HTK … Hidden Markov Model Tool Kit の略。
--音声認識アプリ Julius/Julian の音響モデルとして利用できる ([[参考:http://julius.sourceforge.jp/doc/adin.html]])
-Hidden Markov Model(HMM) … 隠れマルコフモデル ('''[[参照:http://shower.human.waseda.ac.jp/~m-kouki/pass/2008_syuuron/miyazawa_syuron_20080110.pdf#page=39]]''')((HMMの特徴の分かりやすい説明:[[ディジタル蝸牛モデルとHMMを用いた音声認識:http://www.sato-publications.com/study9710.html]](東京理科大 佐藤先生)))

***教科書・参考文献 [#ae4bbb62]
-「'''[[HTKによる大語彙連続音声認識, 菊池英明, 2000:http://shower.human.waseda.ac.jp/~m-kouki/pass/20000517_HTKmakingmanual.zip]]'''」
--[[HTK(Hidden Markov Model Toolkit):http://www.f.waseda.jp/kikuchi/tips/htk.html]](早稲田大 菊池先生)
-[[HTK Book:http://shower.human.waseda.ac.jp/~m-kouki/pass/htkbook.pdf]]
-[[音声メディア研究室 HMM 作成メモ:http://izanami.tl.fukuoka-u.ac.jp/SLPL/HMM/HMM-memo.html]]
-[[JNAS CDROMからIPA音響モデルの作成法:http://www.cyb.mei.titech.ac.jp/nakadai/nakadai/acoustic/index.html]]
-[[HTK の使い方:http://vision.kuee.kyoto-u.ac.jp/~hiroaki/hmm/htk.html]]
-[[連続音声認識システムに使用するアルゴリズム(Viterbiアルゴリズム):http://unicorn.ike.tottori-u.ac.jp/murakami/doctor/node6.html]]

-[[UNDERSTANDING HTK ERROR MESSAGES (USING HTK):http://www.ling.ohio-state.edu/~bromberg/htk_problems.html]] - エラーの種類と対処法

***インストール(Linux) [#qc0725d1]
-まずは、[[HTKをダウンロード:http://htk.eng.cam.ac.uk/download.shtml]]します(ユーザ名登録が必要((リンク先のレジストレーションのページで、IDとパスワードを登録してください。なお、宮澤のIDは[[こちら:http://shower.human.waseda.ac.jp/~m-kouki/pass/HTK-3.4.1/htk_id.txt]]。)))。
--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/ 以下におきました。
-解凍してコンパイルします(([[試行錯誤の後:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki/index.php?JUNK#h90f2c5d]] 田中君に感謝!!))
#geshi(bash){{
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 が作られます。
--起動時に自動的にパスが通るようにしておきます(("m-kouki"のところを自分の環境に置き換えてください。))。
#geshi(bash){{
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/ に対応付けられます。
--パスを追記したら、SSHクライアントソフト((TeraTermProやターミナル))を再起動しておきます。

***ディレクトリ作成 [#ze87ff6e]
-作業用ディレクトリを作成しておきます。
--今回は、HTK-CSJ ディレクトリの中に各種ファイルを作っていくことにします。
#geshi(bash){{
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
}}

**1.音声ファイルの準備 [#xe80609f]
-CSJがインストールされているディレクトリを探索して、XMLファイルとWAVファイルのパスを調べます。
--[[SearchXMLPassCSJ.java:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/corpus/SearchXMLPassCSJ.java.txt]] を実行してください((詳細:[[コーパス加工用プログラム/日本語話し言葉コーパス(CSJ)/ディレクトリをサーチしてXMLファイルのパスを取得する:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/index.php?%E3%82%B3%E3%83%BC%E3%83%91%E3%82%B9%E5%8A%A0%E5%B7%A5%E7%94%A8%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0#m7152994]]))。
#geshi(bash){{
java SearchXMLPassCSJ /home/CSJ F $HTK_HOME/HTK-CSJ/transcription/xmlfilelist.txt
}}
---ここでは、女性のみ対象としています。((もしも disc03 に収録された音声のみを対象にしたい場合は、第一引数に /home/CSJ/disc03 を指定します。また、もしも単独話者のみを対象にしたい場合は、第二引数に話者名(「S08F1465」など)を指定します。))
--出力されたファイル($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
 ...

**2.テキストファイルの準備 [#u1935c79]
-コーパス付属のXMLファイルを加工して、HTK フォーマットのテキストファイル群を作ります。
-作る必要のあるファイル一覧と、HTKフォーマットのサンプルを以下に示します。

|BGCOLOR(white):種類|BGCOLOR(white):サンプル|BGCOLOR(white):備考|
|読み上げテキスト|[[CSJ_F_transcription.PROMPT:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_transcription.PROMPT.txt]]|ヘッダは */(ファイル名)_(発話名) |
|単語辞書|[[CSJ_F_train.word.dict:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_train.word.dict.txt]]||
|単語ラベル|[[CSJ_F_train.word.lbl:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_train.word.lbl.txt]]||
|発音辞書|[[CSJ_F_monophones0.dict:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_monophones0.dict.txt]]|ショートポーズ記号なし|
||[[CSJ_F_monophones1.dict:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_monophones1.dict.txt]]|ショートポーズ記号あり|
|使用音素リスト(モノフォン)|[[CSJ_F_monophones0.lst:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_monophones0.lst.txt]]|ショートポーズ記号なし|
||[[CSJ_F_monophones1.lst:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_monophones1.lst.txt]]|ショートポーズ記号あり|
|音素ラベル(モノフォン)|[[CSJ_F_train.phone0.lbl:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_train.phone0.lbl.txt]]|ショートポーズ記号なし|
||[[CSJ_F_train.phone1.lbl:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_train.phone1.lbl.txt]]|ショートポーズ記号あり|
|使用音素リスト(トライフォン)|[[CSJ_F_triphones.lst:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_triphones.lst.txt]]||
|音素ラベル(トライフォン)|[[CSJ_F_triphone.mlf:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_triphone.mlf.txt]]|モノフォンの学習結果より作成|

***2.1.読み上げテキストを作成する [#w519439b]
-[[makePROMPT.xsl:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/xslt/makePROMPT.xsl]] [[MoraPhonemeList.txt:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/xslt/MoraPhonemeList.txt]] [[HtkMakePromptCSJ.java:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/xslt/HtkMakePromptCSJ.java.txt]] を全て $HTK_HOME/HTK-CSJ/ において、以下を実行((詳細:[[コーパスのXML解析/日本語話し言葉コーパス(CSJ)/HTK学習用の転記テキストファイル(.PROMPTファイル)を作成する:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/100.html#v2cda914]]))
#geshi(bash){{
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:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_transcription.PROMPT.txt]] ができます。
---&color(red){''注意'' : 長音記号「ー」は、ここでは独立した音素「H」として記述します};
---CSJでは、固有名詞等は雑音に置換され、音素ラベル「☓」が付加されています。そのため「警告 : モーラ ×に対応する音素表記が見つかりませ でした」とメッセージが出ますが、無視してかまいません。

-以降、.PROMPTファイルから全ての辞書ファイルを生成します。((PROMPTファイル作成までは、コーパスの転記ファイルの表記法によってプログラムが変わってきますが、以下は共通の処理になります))

***2.2.単語辞書、単語ラベル、音素ラベルを作成する [#v76f8288]
-単語辞書
--[[HtkMakeWordDict.java:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/HtkMakeWordDict.java.txt]] を実行
#geshi(bash){{
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:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_train.word.dict.txt]] ができます。

-単語ラベル
--[[HtkMakeWordLbl.java:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/HtkMakeWordLbl.java.txt]] を実行
#geshi(bash){{
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:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_train.word.lbl.txt]] ができます。

***2.3.発音辞書と、使用音素リストを作成する(モノフォン) [#f1f01b36]
-モノフォン学習の初期段階では、無音部記号(sil, silence)は音素として扱いますが、ショートポーズ記号(sp, short pause)は音素扱いしません((参考:[[音声メディア研究室 HMM 作成メモ:http://izanami.tl.fukuoka-u.ac.jp/SLPL/HMM/HMM-memo.html]]))。そのため sp のあるファイルと、ないファイルを別々に作ります。

-発音辞書(モノフォン)
--[[HtkMakeMonophonesDict.java:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/HtkMakeMonophonesDict.java.txt]] を実行

--ショートポーズ記号なし
#geshi(bash){{
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:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_monophones0.dict.txt]] ができます。

--ショートポーズ記号あり
#geshi(bash){{
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:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_monophones1.dict.txt]] ができます。

--&color(red){''注意'' : 同じ単語に対して、複数の音素表記がなされる場合があります(同じ単語が複数行出現する場合があります)。とりあえずこのまま先に進みます。};

-使用音素リスト(モノフォン)
--[[HtkMakeMonophonesLst.java:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/HtkMakeMonophonesLst.java.txt]] を実行

--ショートポーズ記号なし
#geshi(bash){{
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:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_monophones0.lst.txt]] ができます。

--ショートポーズ記号あり
#geshi(bash){{
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:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_monophones1.lst.txt]] ができます。

***2.3.音素ラベルを作成する [#g8070498]
-音素ラベルも、ショートポーズあり、なしの二種類を作る必要があります。
--[[HtkMakePhoneLbl.java:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/HtkMakePhoneLbl.java.txt]] を実行

--ショートポーズなし
#geshi(bash){{
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ファイルの文字コード] [音素ラベルファイルのパス] [音素ラベルファイルの文字コード] [長音記号]((PROMPT ファイル中に長音記号がない場合や直前の音素と結合したくない場合(独立した音素として扱いたい場合)は、関係ない文字列を入れればOK)) [無音部記号]
---[[CSJ_F_train.phone0.lbl:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_train.phone0.lbl.txt]] ができます。(([[mkphones0.led(音声メディア研究室 HMM 作成メモ より):http://izanami.tl.fukuoka-u.ac.jp/SLPL/HMM/files/mkphones0.led]] を作成して、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 に、同じ単語で複数の読みをする語があるため、結果は同じにはなりません。))
---&color(red){長音記号は、ここで母音と結合されて長母音となります。};

--ショートポーズあり
#geshi(bash){{
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ファイルの文字コード] [音素ラベルファイルのパス] [音素ラベルファイルの文字コード] [長音記号]((PROMPT ファイル中に長音記号がない場合や直前の音素と結合したくない場合(独立した音素として扱いたい場合)は、関係ない文字列を入れればOK)) [無音部記号] [ショートポーズ記号]
---[[CSJ_F_train.phone1.lbl:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_train.phone1.lbl.txt]] ができます。(([[mkphones0.led から DE sp を除いた mkphones1.led:http://izanami.tl.fukuoka-u.ac.jp/SLPL/HMM/files/mkphones0.led]] を作成して、HTK付属の $HLEd -l '*' -d ./transcription/CSJ_F_monophones1.dict -i CSJ_F_train.phone1.lbl mkphones1.led ./transcription/CSJ_F_train.word.lbl を実行して作成することもできます。ただし、結果は同じにはなりません。))

***2.5.使用音素リストと、音素ラベルを作成する(トライフォン) [#k6378b56]
-&color(red){注:[[モノフォンの学習を完了して:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/92.html#g00fc1fc]]、[[自動ラベリングにより aligned.mlf を作っておく:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/index.php?HTK%E3%81%AB%E3%82%88%E3%82%8B%E9%9F%B3%E9%9F%BF%E3%83%A2%E3%83%87%E3%83%AB%E6%A7%8B%E7%AF%89#wf331b9e]]必要があります。};

-はじめに、音素ラベルの仕様ファイルを作ります。
#geshi(bash){{
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の後は改行しておきます((改行しないと、以下の処理で「ERROR [+1230]  ReadLabId: string arg expected ...」エラーが出ます。))

-使用音素リストと音素ラベルを作成
#geshi(bash){{
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:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_triphones.lst.txt]] と、
トライフォン音素ラベル [[CSJ_F_triphone.mlf:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_triphone.mlf.txt]] ができます。
---トライフォン音素ラベルは、モノフォン学習の自動ラベリング結果[[aligned.mlf:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_aligned.mlf.txt]] から作られます。

**3.HTKによるHMMの学習 [#zaff7ec3]
***3.1.音声データのコーディング [#i0457c7f]
-MFCC解析のコーディング仕様ファイル config.hcopy を作成
#geshi(bash){{
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
---数字の詳細は [[MFCC解析のツール/HTK(Hidden Markov Model Toolkit) 付属の HCopy を使う:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/index.php?MFCC%E8%A7%A3%E6%9E%90%E3%81%AE%E3%83%84%E3%83%BC%E3%83%AB#ke8f3149]] を参照

-MFCC解析
--[[HtkRunHCopy.java:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/HtkRunHCopy.java.txt]] を実行
#geshi(bash){{
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ファイルが出力されます。((mfcファイルはバイナリなので読めません。テキストファイルに変換するには、次のコードを実行します。 HList -o -h .mfcファイル名 > .txtファイル名))
--また、$HTK_HOME/HTK-CSJ/config 以下に、mfcリストファイル [[CSJ_F_train.hmm.script:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_train.hmm.script.txt]] ができます。

***3.2.HMM初期モデルの作成 [#kc961487]
-まずは、学習に使用する音響特徴量を記述した学習仕様ファイルを作ります。
#geshi(bash){{
emacs $HTK_HOME/HTK-CSJ/config/config.train
}}
--config.train
 TARGETKIND = MFCC_E_D_A
-続いて、[[HTK Book p.31以降:http://shower.human.waseda.ac.jp/~m-kouki/pass/htkbook.pdf#page=40]] を参考に、HMM初期仕様ファイル proto を作ります。
#geshi(bash){{
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>

-HMM 初期モデルファイル hmm0/proto を生成します。
#geshi(bash){{
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:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_hmm0_proto.txt]] ができます。
---もしも hmm0/proto ができなかった場合は、xmlfilelist.txt の作成に失敗している可能性があります。

-HMM 初期モデルファイル hmm0/proto 中のマクロ定義部分を取り出し、hmm0/macro を作ります。((proto 中の「~o」という文字列が含まれる行を hmm0/macro に書き出しています([[参考:http://x68000.q-e-d.net/~68user/unix/pickup?grep]])。))
#geshi(bash){{
grep '~o' $HTK_HOME/HTK-CSJ/config/proto > $HTK_HOME/HTK-CSJ/hmm0/macro
}}
--[[hmm0/macro:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_hmm0_macro.txt]] ができます。

-HMM 定義ファイル hmm0/hmmdefs を作成します。
--[[HtkMakeHmmdefs.java:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/HtkMakeHmmdefs.java.txt]] を実行
#geshi(bash){{
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:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_hmm0_hmmdefs.txt]] ができます。
---hmmdefs は、 hmm0/proto の中身を学習する音素の数だけコピーしたものです。

***3.3.monophoneHMMの作成 [#g00fc1fc]
-モノフォンの学習(初期モデルのパラメータ推定)を行ないます。
--1回目
#geshi(bash){{
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 と対処((音素ラベル train.phone0.lbl の中に空白行が混ざってHERestが失敗する場合もあるようです。))
>ERROR [+6550]  LoadHTKLabels: Junk at end of HTK transcription
>>→「-T 1」オプションをつけて再実行し、原因の .mfc ファイルを特定して、CSJ_F_train.hmm.script から削除

---以下の警告が出るけれど、無視して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回目
#geshi(bash){{
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回目
#geshi(bash){{
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 を作成します。
#geshi(bash){{
 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]}

--初期学習が完了したHMM定義ファイル(hmm3/hmmdefs)の無音部記号に相当する音素をコピーしてショートポーズに相当する音素を追記し、新規のファイル(hmm3_sp/hmmdefs0)を出力します。((なお、教科書(p.13)ではこの処理は行わず、はじめから sp と sil を定義した hmmdefs で学習を行い、HHEd のみ実行しています。[[音声メディア研究室 HMM 作成メモ:http://izanami.tl.fukuoka-u.ac.jp/SLPL/HMM/HMM-memo.html]] では、sil の状態3 のみコピーして sp を追記しています。ここでは sil を丸ごとコピーして sp を作っていますが、より適当な方法があるかもしれません。))。
---[[HtkMakeHmmdefsShortPause.java:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/HtkMakeHmmdefsShortPause.java.txt]] を実行
#geshi(bash){{
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:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_hmm3_sp1_hmmdefs.txt]] ができます。

--モデルの修正を行ないます。
#geshi(bash){{
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回目
#geshi(bash){{
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回目
#geshi(bash){{
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.自動ラベリング [#wf331b9e]
-ここまでの学習結果を確認するために、HTK付属のHViteコマンド((HViteコマンドは、類似した音素を統合するある種の教師なし学習を行っています。詳細は [[HTK Book のp.178以降:http://nesl.ee.ucla.edu/projects/ibadge/docs/ASR/htk/htkbook.pdf#page=178]] および [[p.244以降:http://nesl.ee.ucla.edu/projects/ibadge/docs/ASR/htk/htkbook.pdf#page=244]] を参照))を使用して自動ラベリングを行ないます。
#geshi(bash){{
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((指定すると、ERROR [+6251]  Input file is not in RIFF format のエラーが出ます(config.hcopyのSOURCEFORMAT と SOURCEKIND の値を「HTK」に書き換えると、エラーは消えました)。))

-自動ラベリングの結果は、$HTK_HOME/HTK-CSJ/aligned.mlf に出力されます。
--[[aligned.mlf:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_aligned.mlf.txt]]
---音素ラベル [[CSJ_F_train.phone1.lbl:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_train.phone1.lbl.txt]] と比べてみても、なかなかの正解率であるといえます。((&color(red){ただし、aligned.mlf の結果、分析されていないlabファイルがあります。これらは後のトライフォン学習の際に mfc ファイル読み込みエラーになるので、そこで対処する必要があります。};))

--自動ラベリングの結果(Hviteコマンドに -a, -m オプションを設定して出力した .lab フォーマット((早大鍔木様にお教えいただきました。ありがとうございました。)))を [[Praat:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/41.html]] 標準の形式に変換するスクリプト
---seg層を出力 &ref(transalignHTK2textgrid.pl);
---Word層、Auto align層、Segment層、Memo層を出力 &ref(transalignHTK2textgrid2.pl);

-ここまでうまくいっていたら、もう2回分 monophone 学習をしておきます。((&color(red){モノフォンの段階では統計情報 stats を出力していませんが、この時点で話者適応を行なうなら、「-s stats」オプションを追加しておく必要があります。};))

--6回目
#geshi(bash){{
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回目
#geshi(bash){{
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音響モデルの認識率を求める:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/index.php?HTK%E3%81%AB%E3%82%88%E3%82%8B%E9%9F%B3%E9%9F%BF%E3%83%A2%E3%83%87%E3%83%AB%E6%A7%8B%E7%AF%89#h8506570]] を参照してください。

-&color(red){''※'' 音素の解析や比較が目的であれば、ここまでで十分です(トライフォンの学習は不要です)。};

***3.5.triphoneHMMの作成 [#r4ab25b9]
-【注】先に [[2.5.使用音素リストと、音素ラベルを作成する(トライフォン):http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/index.php?HTK%E3%81%AB%E3%82%88%E3%82%8B%E9%9F%B3%E9%9F%BF%E3%83%A2%E3%83%87%E3%83%AB%E6%A7%8B%E7%AF%89#k6378b56]] を実行しておきます。
-はじめに、トライフォン初期モデルの仕様ファイル mktri.hed を作成します。
--[[HTK Tutorial(HTK-samples-3.4.tar.gz):http://htk.eng.cam.ac.uk/ftp/software/HTK-samples-3.4.tar.gz]] 付属のPerlスクリプト maketrihed を使用します。(('''[[maketrihed:http://shower.human.waseda.ac.jp/~m-kouki/pass/HTK-3.4.1/maketrihed]]'''、[[Perlスクリプト冒頭のおまじない:http://www.tohoho-web.com/wwwperl1.htm#ExecPerl3]] を自分の環境にあわせて、 $ chmod a+x maketrihed で実行可能にして、maketrihed にパスを通しておきます(本文書では /home/m-kouki/HTK/bin/ の中に入れました)。))
#geshi(bash){{
 maketrihed $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones1.lst $HTK_HOME/HTK-CSJ/transcription/CSJ_F_triphones.lst
}}
---[[mktri.hed:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_mktri.hed.txt]] ができました。
---例えば「(*-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} に変更

-トライフォン初期モデルを作成します。
#geshi(bash){{
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 にない発話を取り除きます((これをしないと、以下の学習で ERROR [+6510]  LOpen: Unable to open label file が出ます。))。
--[[HtkDeleteTriphoneScript.java:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/HtkDeleteTriphoneScript.java.txt]] を実行して、CSJ_F_triphone.mlf に存在しない mfc ファイルを全て削除した CSJ_F_train_tri.hmm.script を作成します。
#geshi(bash){{
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リストファイルの文字コード]

-トライフォンの学習(初期モデルのパラメータ推定)を行ないます。
--8回目
#geshi(bash){{
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
}}

--9回目
#geshi(bash){{
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回目
#geshi(bash){{
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:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_triphones.lst.txt]] からモデル類別木を作成し、 トライフォン音素リスト CSJ_F_triphones.lst と照合することで((&color(red){テキストでは、「認識に必要な全てのモデルのリスト triphone_all.lst を作成する」とありますが、トライフォン音素リスト triphones.lst との違いが不明だったので、とりあえず triphones.lst をそのまま使っています。};))、類似する音素同士を対応付けた新しい CSJ_F_triphones_tied.lst を作成します(テキスト p.19 より引用)。'''(([[HTK Book の p.39:http://shower.human.waseda.ac.jp/~m-kouki/pass/htkbook.pdf#page=48]] も参照してください。))
--[[HTK Tutorial(HTK-samples-3.4.tar.gz):http://htk.eng.cam.ac.uk/ftp/software/HTK-samples-3.4.tar.gz]]付属(RMHTK/perl_scripts)の、mkclscript を使用します。(('''[[mkclscript:http://shower.human.waseda.ac.jp/~m-kouki/pass/HTK-3.4.1/mkclscript]]'''、先頭のおまじないを「#!/usr/bin/perl」に書き換えて、 $ chmod a+x mkclscript を実行しておくこと))
#geshi(bash){{
mkclscript TB 350.0 $HTK_HOME/HTK-CSJ/transcription/CSJ_F_monophones1.lst > $HTK_HOME/HTK-CSJ/config/tree.hed
}}
---configディレクトリ内に、モデル類別木ファイル [[tree.hed:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_tree.hed.txt]] ができます。((mkclscript の引数は、[[HTK辞書作成手順 - 岡田特研:http://okdlab2.kyoto-su.ac.jp/index.php?HTK%BC%AD%BD%F1%BA%EE%C0%AE%BC%EA%BD%E7]] を参考にしました。テキストの引数とは異なっています。また、ここでは&color(red){トライフォンのリストでなく、モノフォンのリストを指定していますが、問題はないようです。};))
--ここで、tree.hed には TB の情報しかないので、[[日本語話し言葉コーパス 音声認識のための音響モデルと言語モデルの仕様 の設定:http://www.kokken.go.jp/katsudo/seika/corpus/public/manuals/asr.pdf#page=8]] を参考にして、設定を追記します。
#geshi(bash){{
emacs $HTK_HOME/HTK-CSJ/config/tree.hed
}}
---TB ラベルの前後に情報を追加して、最終的に [[このような tree.hed:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_tree_add.hed.txt]] を作りました。
---&color(red){ファイル中でトライフォン音素リスト "/home/m-kouki/HTK/HTK-CSJ/transcription/CSJ_F_triphones.lst" と、修正後トライフォン音素リスト "/home/m-kouki/HTK/HTK-CSJ/transcription/CSJ_F_triphones_tied.lst" の名前を直接指定していることに注意してください(適宜書き換えて下さい)。((ファイルパスは絶対パスのみ、うまくいきました。$HTK_HOME は使えません。))};
---上記で設定しているのは、音声学の知見に基づいたクラスタリングのルールになります。((例えば「L_Nasal」は「鼻音が前に来る」ことを示します。ここをより日本語に適した設定に変えることは、研究の意義があります(テキスト p.20 より)。))

--tree.hed の設定を使って、モデル類別を行ないます。
#geshi(bash){{
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:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_triphones_tied.lst.txt]] ができました。例えば「sh-o+f sh-o+b」は、「sh_o」の後に「f」がきた場合と「b」がきた場合を、同じものとして扱うという設定です。((&color(red){モノフォンが混ざっているようですが…とりあえず先に進みます。};))

-さらに学習を続けます。

--11回目
#geshi(bash){{
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回目
#geshi(bash){{
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:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_hmmdefs_hmm12.txt]]


**4.音声認識を試す [#s8c3b46a]
***monophone音響モデルの認識率を求める [#h8506570]
-monophone学習までが完了しているとします。

-音声認識実験用のファイルを作ります。

--単語辞書ファイルにSTARTラベルとENDラベルを追記する
#geshi(bash){{
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ラベルを追記する
#geshi(bash){{
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
 (略)

--&color(red){なお、上の「単語辞書ファイルにSTARTラベルとENDラベルを追記する」「発音辞書ファイルにSTARTラベルとENDラベルを追記する」の処理を一括して、以下のスクリプトで実施できます。};
---[[HtkAddStartEnd.java:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/HtkAddStartEnd.java.txt]]
#geshi(bash){{
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
}}

--認識実験に使うファイルのリストを作る
---今回は、mfcリストファイル [[CSJ_F_train.hmm.script:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_CSJ_F_train.hmm.script.txt]] をそのまま使い、クローズドテストを行います((mfcファイルの数が多いと、計算にかなり時間がかかります))。
#geshi(bash){{
cp $HTK_HOME/HTK-CSJ/config/CSJ_F_train.hmm.script $HTK_HOME/HTK-CSJ/recog/recog_CSJ_F_train.hmm.script
}}

--ネットワーク文法の生成
---recog/bigram の作成((単語ラベル CSJ_F_train.word.lbl には、発話のない区間(「.」しかないラベル)がありますが、「WARNING [-1330]  HLStats: Empty file ~」の警告が出るだけで問題なく実行されます。))
#geshi(bash){{
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の作成
#geshi(bash){{
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
}}

-音声認識
--学習7回目の設定ファイル($HTK_HOME/HTK-CSJ/hmm7)の評価をします((参考:[[HTK Book p.39:http://nesl.ee.ucla.edu/projects/ibadge/docs/ASR/htk/htkbook.pdf#page=45]]))。
#geshi(bash){{
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:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/sample_recout_mono.mlf.txt]]
---4列目のデータが認識尤度。設定を変えれば音素ごとの尤度も出せるはず。((参考:[[HTKによるHMMの学習:http://www.makino.ecei.tohoku.ac.jp/~ryo77373/pukiwiki-1.4.7_notb/index.php?HTK%A4%CB%A4%E8%A4%EBHMM%A4%CE%B3%D8%BD%AC]]))

-認識率を求めます。
--[[HtkDeleteSpaceWordLbl.java:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/HtkDeleteSpaceWordLbl.java.txt]] を実行
#geshi(bash){{
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:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/HtkDeleteSpaceMonoMlf.java.txt]] を実行
#geshi(bash){{
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
}}
---引数は [学習結果(.mlf)ファイルのパス] [修正後の学習結果ファイルのパス(出力先)] [修正後の単語ラベル(_train.word.lbl)ファイルのパス] [学習結果ファイルの文字コード] [修正後の学習結果ファイルの文字コード] [修正後の単語ラベルファイルの文字コード]
---発話のない区間を除去した学習結果ファイル recout_mono_delspace.mlf が出力されました。((これをしないと、以下で「ERROR [+6570]  GetLabelList: n[1] > numLists[0]」エラーが出ます([[エラー対処の参考:http://www.ling.ohio-state.edu/~bromberg/htk_problems.html]])。))
---同時に、学習結果ファイルには存在するが、単語ラベルには存在しない発話ラベル番号も除去されます。((これをしないと、以下で「ERROR [+6510]  LOpen: Unable to open label file」エラーが出ます([[エラー対処の参考:http://www.ling.ohio-state.edu/~bromberg/htk_problems.html]])。))

--認識率の計算((HResults に -f オプションをつけると、ひとつひとつの発話番号に対する認識結果が出力されます(デバッグに役立ちます)。))
#geshi(bash){{
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 です。(([[エラーの詳細 参考:http://unicorn.ike.tottori-u.ac.jp/2002/sokada/paper/graduation-thesis/paper.pdf#page=19]]))


***triphone音響モデルの認識率を求める [#td25d0d2]
-triphone学習までが完了しているとします。

-「評価用のラベルファイルを作る」 ~ 「ネットワーク文法の生成」 までは、[[monophoneの場合:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/index.php?HTK%E3%81%AB%E3%82%88%E3%82%8B%E9%9F%B3%E9%9F%BF%E3%83%A2%E3%83%87%E3%83%AB%E6%A7%8B%E7%AF%89#h8506570]] と同じなので、そちらを参考にして下さい。

-トライフォン 音声認識仕様ファイルの作成
#geshi(bash){{
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 を使っていました。

-音声認識
--学習12回目の設定ファイル($HTK_HOME/HTK-CSJ/hmm12)の評価をします。((&color(red){発音辞書 recog_CSJ_F_monophones1.dict(CSJ_F_monophones1.dict に START と END を付け加えたもの)は、テキストでは "triphones.dict" になっていますが、出自が不明なため、ここではこれを使っています。};))
#geshi(bash){{
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 と対処((このエラーは、十分な量の音声データを使ってトライフォン学習を行っていれば、回避できると思われます。))
>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
>>&ref(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 を作り、再度ネットワーク文法の作成を行います。

---対処法2を実施、[[HtkMakeRecogDicts.java:http://shower.human.waseda.ac.jp/~m-kouki/pg_public/htk/HtkMakeRecogDicts.java.txt]] を実行
#ref(todo_HTK.txt);
まだエラーが出る。

***monophone音響モデルをJuliusに組み込む [#rc28943d]

***triphone音響モデルをJuliusに組み込む [#oc96ff69]

**5.話者適応 [#e2b4a6f8]
-'''[[音響モデルの適応と評価:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki/index.php?%E9%9F%B3%E9%9F%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E9%81%A9%E5%BF%9C%E3%81%A8%E8%A9%95%E4%BE%A1]]''' で音響モデルの話者適応に関する検討を行なっています。
-'''[[SOMによる音響モデルの話者適応:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki/index.php?SOM%E3%81%AB%E3%82%88%E3%82%8B%E9%9F%B3%E9%9F%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E8%A9%B1%E8%80%85%E9%81%A9%E5%BF%9C]]''' で SOM と既存の HMM 音響モデルの比較・検討を行なっています。
-'''[[kmeans法による音響モデルの話者適応:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki/index.php?kmeans%E6%B3%95%E3%81%AB%E3%82%88%E3%82%8B%E9%9F%B3%E9%9F%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E8%A9%B1%E8%80%85%E9%81%A9%E5%BF%9C]]''' で SOM と別手法の比較をしています。

**6.その他の検討 [#k3a6df78]
-'''[[JNASによる音響モデルの構築:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki/index.php?JUNK#v9fb4db5]]'''(途中で中断)
--JNAS … Japanese Newspaper Article Sentences の略。
-'''[[SOMによる母音カテゴリの推定:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki/index.php?SOM%E3%81%AB%E3%82%88%E3%82%8B%E6%AF%8D%E9%9F%B3%E3%82%AB%E3%83%86%E3%82%B4%E3%83%AA%E3%81%AE%E6%8E%A8%E5%AE%9A]]''' で SOM の学習精度の向上に関して検討しています。
-'''[[複数混合数のモノフォン音響モデル:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki/index.php?%E7%90%86%E5%8C%96%E5%AD%A6%E7%A0%94%E7%A9%B6%E6%89%80%E5%85%B1%E5%90%8C%E7%A0%94%E7%A9%B6/IDS%E3%81%AE%E5%AD%90%E9%9F%B3%E7%A9%BA%E9%96%93%E3%81%AE%E8%A7%A3%E6%9E%90#h25cd8a0]]'''
-&pgid(,HTSによるHMM音声合成);