Problem
音声認識で用いる言語モデルの構築法について説明する.
Solution
言語モデルには,大きく統計言語モデル,ネットワーク文法モデルの二種類が あり,Julius も両方を用いることができる(以前は前者が Julius, 後者が Julian という 別の名前のバイナリであったが,ver 4 系から両者が Julius として統合されている). ネットワーク文法の作成については,Julius のホームページに詳しい説明が載っているので, そちらを参考にされたい.以降では,統計言語モデルの作成を中心に述べる.
Julis 用の辞書の作成
辞書は正解テキストを形態素解析したものをベースにHTK形式で作成する. 形態素解析には chasen(茶筅)を使用する.
chasen をインストール後,Home ディレクトリに .chasenrc を作成して, その中の,grammar.cha があるディレクトリを「文法ファイル」に指定し, 出力フォーマットを下記のように記述する.
(文法ファイル /usr/local/chasen-2.02/dic) (出力フォーマット "%m+%y+%h/%t/%f\n")
正解テキストファイルを用意し,このファイルを seikai.txt とする. 言語モデル作成時に使うので,文の最初と最後にそれぞれ $<$s$>$, $<$/s$>$ を挿入しておくこと.
seikai.txtの例(単語間は区切られていなくても構いません) <s> あらゆる 現実 を すべて 自分 の ほうへ ねじ 曲げ た の だ 。 </s> <s> 一週間 ばかり ニューヨーク を 取材 し た 。 </s> :
% chasen seikai.txt > seikai.keitaiso
text.keitaiso の内容を見て,形態素解析が間違っている部分があれば修正する. また,「へ」,「は」は表記と読みが異なるので,読みをそれぞれ「エ」,「ワ」に直す. 実際には,これ以外にも形態素の正規化,不要部分の除去などの作業をする必 要があるが,ここでは省略する.
seikai.keitaisoの例 <s>+<s>+17/0/0 あらゆる+アラユル+54/0/0 現実+ゲンジツ+2/0/0 を+ヲ+59/0/0 すべて+スベテ+16/0/0 自分+ジブン+2/0/0 の+ノ+68/0/0 ほう+ホウ+21/0/0 へ+エ+59/0/0 ねじ曲げ+ネジマゲ+45/6/4 た+タ+71/55/1 の+ノ+21/0/0 だ+ダ+71/56/1 。+。+75/0/0 </s>+</s>+17/0/0 EOS++ <s>+<s>+17/0/0
つぎに,
% w2s.pl seikai.keitaiso > seikai-k.txt
によって,各行の改行を半角スペースにすると共に,$<$s$>$+$<$s$>$+17/0/0 の部分 を,$<$s$>$ に $<$/s$>$+$<$/s$>$+17/0/0 は $<$/s$>$ に変換する.また EOS を改行 に変換する.これによって形態素解析済の正解テキストが作成できる. このテキストは以降の言語モデルの作成に使用する.
seikai-k.txtの例 <s> あらゆる+アラユル+54/0/0 現実+ゲンジツ+2/0/0 を+ヲ+59/0/0 すべて+スベテ+16/0/0 自分+ジブン+2/0/0 の+ノ+68/0/0 ほう+ホウ+21/0/0 へ+エ+59/0/0 ねじ曲げ+ネジマゲ+45/6/4 た+タ+71/55/1 の+ノ+21/0/0 だ+ダ+71/56/1 。+。+75/0/0 </s> <s> 一週間 ...
最後に seikai.keitaiso を利用して辞書を作成する.
% dic.pl seikai.keitaiso kana2phone_rule.ipa | sort | uniq > HTKDIC % gzip HTKDIC
HTKDIC.gz がJuliusで使用する辞書となる.Julius で使用する際には, これを -v オプションで指定すること.
HTKDICの例 </s> [] silE <s> [] silB 。+。+75/0/0 [。] sp あらゆる+アラユル+54/0/0 [あらゆる] a r a y u r u
用語: 形態素解析,chasen,HTK形式, w2s.pl,dic.pl,kana2phone_rule.ipa - vocab2htkdic に含まれているもの
Julis 用の言語モデルの作成
言語モデルの作成は,基本的には,「音声認識システム」(オーム社) を参照の こと.ただし,サンプルの jconf にあるような2-gram と逆向き3-gramを作成 するためには,CMU-Cambridge Toolkit だけでは不十分であ り,CMU-Cambridge Toolkit 互換の palmkit を使うとよい.また最近では, julius は逆向き3-gram は不要となったようであるので,palmkit を使う 必要は必ずしもないかもしれない.
palmkit の使い方は以下の通り. 正解テキストを用意し,seikai-k.txt とする.このファイルは形態素解析 済であることが必要である.(つまり,句読点も一単語とし単語間をスペースで 区切る.) 文の最初と最後にそれぞれ $<$s$>$, $<$/s$>$ を挿入してあるのは前 述の通り,$<$s$>$ や $<$/s$>$ をまたがるような遷移を取り除くためである.この場合, learn.cssファイルには,$<$s$>$, $<$/s$>$ の記述が必要である.
% text2wfreq < learn.txt > learn.wfreq % wfreq2vocab < learn.wfreq > learn.vocab % text2idngram -n 2 -vocab learn.vocab < learn.txt > learn.id2gram % text2idngram -vocab learn.vocab < learn.txt > learn.id3gram % reverseidngram learn.id3gram learn.revid3gram % idngram2lm -idngram learn.revid3gram -vocab learn.vocab -context learn.ccs -arpa learn.rev3gram.arpa % idngram2lm -n 2 -idngram learn.id2gram -vocab learn.vocab -context learn.ccs -arpa learn.2gram.arpa
これで,2-gramと逆向き3-gramができる. 最後にこれらを一つにまとめる. juliusのツール mkbingram を用いて, 以下のようにするとJulius用の言語モデルが作成できる.
% mkbingram learn.2gram.arpa learn.rev3gram.arpa julius.bingram
See Also