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

HTKによる音響モデル構築

Last-modified: 2015-03-06 (金) 03:24:00
Top / HTKによる音響モデル構築

日本語話し言葉コーパス(CSJ)を使ったHTK音響モデル構築*1

0.はじめに

用語

  • CSJ … Corpus of Spontaneous Japanese の略。
  • HTK … Hidden Markov Model Tool Kit の略。
    • 音声認識アプリ Julius/Julian の音響モデルとして利用できる (参考
  • Hidden Markov Model(HMM) … 隠れマルコフモデル (参照*2

教科書・参考文献

インストール(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/ に対応付けられます。
  • パスを追記したら、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

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
      ...

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では、固有名詞等は雑音に置換され、音素ラベル「☓」が付加されています。そのため「警告 : モーラ ×に対応する音素表記が見つかりませ でした」とメッセージが出ますが、無視してかまいません。
  • 以降、.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 ができます。
  • 単語ラベル
    • 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 ができます。

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.使用音素リストと、音素ラベルを作成する(トライフォン)

  • はじめに、音素ラベルの仕様ファイルを作ります。
    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
  • 使用音素リストと音素ラベルを作成
    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 から作られます。

3.HTKによるHMMの学習

3.1.音声データのコーディング

  • MFCC解析のコーディング仕様ファイル config.hcopy を作成
    emacs $HTK_HOME/HTK-CSJ/config/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 ができます。

3.2.HMM初期モデルの作成

  • まずは、学習に使用する音響特徴量を記述した学習仕様ファイルを作ります。
    emacs $HTK_HOME/HTK-CSJ/config/config.train
    • config.train
      TARGETKIND = MFCC_E_D_A
  • 続いて、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>
  • 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 の作成に失敗している可能性があります。
  • HMM 初期モデルファイル hmm0/proto 中のマクロ定義部分を取り出し、hmm0/macro を作ります。*18
    grep '~o' $HTK_HOME/HTK-CSJ/config/proto > $HTK_HOME/HTK-CSJ/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 の中身を学習する音素の数だけコピーしたものです。

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 から削除

  • 以下の警告が出るけれど、無視して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]}
  • 初期学習が完了した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 ができます。
  • モデルの修正を行ないます。
    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 に出力されます。
  • 自動ラベリングの結果(Hviteコマンドに -a, -m オプションを設定して出力した .lab フォーマット*24)を Praat 標準の形式に変換するスクリプト
  • ここまでうまくいっていたら、もう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
  • 音素の解析や比較が目的であれば、ここまでで十分です(トライフォンの学習は不要です)。

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} に変更
  • トライフォン初期モデルを作成します。
    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リストファイルの文字コード]
  • トライフォンの学習(初期モデルのパラメータ推定)を行ないます。
    • 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
  • 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
      • configディレクトリ内に、モデル類別木ファイル tree.hed ができます。*31
    • ここで、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
  • 認識実験に使うファイルのリストを作る
    • 今回は、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
  • ネットワーク文法の生成
    • 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
  • 音声認識
    • 学習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
  • 認識率を求めます。
    • 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
      • 引数は [学習結果(.mlf)ファイルのパス] [修正後の学習結果ファイルのパス(出力先)] [修正後の単語ラベル(_train.word.lbl)ファイルのパス] [学習結果ファイルの文字コード] [修正後の学習結果ファイルの文字コード] [修正後の単語ラベルファイルの文字コード]
      • 発話のない区間を除去した学習結果ファイル recout_mono_delspace.mlf が出力されました。*39
      • 同時に、学習結果ファイルには存在するが、単語ラベルには存在しない発話ラベル番号も除去されます。*40
  • 認識率の計算*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 を使っていました。
  • 音声認識
    • 学習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

        filedelTriphone.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 を作り、再度ネットワーク文法の作成を行います。

monophone音響モデルをJuliusに組み込む

triphone音響モデルをJuliusに組み込む

5.話者適応

6.その他の検討


*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 maketrihedPerlスクリプト冒頭のおまじない を自分の環境にあわせて、 $ 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 このエラーは、十分な量の音声データを使ってトライフォン学習を行っていれば、回避できると思われます。