この間、1000行あまりのemilyスクリプトを処理しているが、色々な問題を解決してそれはできるようになった。
ただ、juliusは、すべてスクリプトのどれかの言葉に一致させてしまうので、全然関係ない言葉でも、それに反応してしまうという問題が前から気づいていた。それでは実際のネタでは使えない。(今は、サリーからtelepathyでもらった言葉で反応するようにしているので問題はないが)
そこで、通常のjuliusのディクテーションセットを同時に読み込ませて、そちらにも一致させれば問題ないだろうと思った。実際、juliusは、複数のモデルを組み込んで認識する能力を持っているということなので、それを実際に組み込もうというものだ。
まず、Juliusのサイトにあるディクテーションキットから必要なファイルを取ってくる。言語モデルを、main2.jconfとしよう。main.jconf 余計なものを切り取ってついのようなものにする。
# main2.jconf
-input mic
-LM emily-l1
# mkbingramで作成したバイナリ形式
-d bccwj.60k.bingram
## 単語辞書ファイル
-v bccwj.60k.htkdic
ここに記載してあるbingramファイルとhtkdicファイルを、この場合は同じフォルダに置いておかなければならない。パスを指定すれば良いのだが。注意点として、-input micはグローバルオプションなので、何よりも早い位置に置いておかなければならない。最初の設定ファイルのその頭という意味のようである。
-LM emily-l1
言語モデルのセクション開始の宣言である。名前をemily-l1はセクション名で、後で効いていくる
ディクテーションキットの言語モデルは巨大なのでバイナリファイル化している。
続いて、ディクテーションキットの音響モデルである。ファイル名を、am-gmm2.jconf としよう。
# ディクテーションキット GMM-HMM版音響モデル・入力設定
##
-AM emily-a1
# 音響モデル: GMM-HMM
-h jnas-tri-3k16-gid.binhmm
-hlist logicalTri-3k16-gid.bin
-AMは音響モデルのセクション開始を表しそのあとに、名前が続いている。二つのファイルも同じフォルダに用意しておかなければならない。
続いて、emily.jconfである。
##############
-LM emily-l2
-gram SALLYHAL2180809
-AM emily-a2
-h hmmdefs_ptm_gid.binhmm
-hlist logicalTri
-SR SR1 emily-a1 emily-l1
#### 探索パラメータ
-b 1500 # 第1パスのビーム幅(ノード数) triphone,PTM,engine=v2.1
-b2 100 # 第2パスの仮説数ビームの幅(仮説数)
-s 500 # 第2パスの最大スタック数 (仮説数)
-m 10000 # 第2パスの仮説オーバフローのしきい値
-n 1 # 第2パスで見つける文の数(文数)
-output 1 # 第2パスで見つかった文のうち出力する数 (文数)
-SR SR2 emily-a2 emily-l2
#### 探索パラメータ
-b 1500 # 第1パスのビーム幅(ノード数) triphone,PTM,engine=v2.1
-b2 100 # 第2パスの仮説数ビームの幅(仮説数)
-s 500 # 第2パスの最大スタック数 (仮説数)
-m 10000 # 第2パスの仮説オーバフローのしきい値
-n 1 # 第2パスで見つける文の数(文数)
-output 1 # 第2パスで見つかった文のうち出力する数 (文数)
モデルは、SALLYHAL2180809という名前になっていて、この名前と、.dfaというサフィックスのファイルおよび.dictという辞書ファイルを用意しなければならない。言語モデルと音響モデルを指定する。
さらに -SRは、これまでのモデルをまとめて指定するものである。名前と、どの言語モデルと音響モデルのセットなのかを指定する。この-SRのセクションの中で、それぞれのモデルの副次的パラメータを指定する。
emilyの作成するファイルをeucファイルとなっているのだが、ディクテーションキットはUTF-8になっている。だから、emily作成ファイルは、nkf -u などでUTF-8に返還しなければならない。違う文字コードではだめなのである。
これで、
julius -C main2.jconf -C am-gmm2.jconf -C emily.jconf
とすれば、起動できる。
ただ、これでは、当初の思い通りの結果にはならない。確かに、それぞれで認識結果を同時に出してくるので、いいのだが、どちらのものが、どれだけ一致しているかが、スコアから判定できないような感じなのだ。
だから、やはり、emilyのスクリプトで、他の言葉の可能性を受け止めるようにしなければならないようだ。