ラズパイ4日目①:Juliusで独自辞書を作成する
Raspberry Pi+Juliusで音声を認識の続きです。サンプルのままでは精度が悪くて使えないので、アレコレ取り組んでみます。今回は独自辞書を作りました。
Juliusの独自辞書を作成…できない話の解決方法も載せました!誰かの役に立つと嬉しい。
- ラズパイ:Raspberry Pi 3 Model B+
- Julius:Julius-4.5、dictation-kit-4.5、grammar-kit-4.3.1
- マイク:FIFINE USBコンデンサーマイク K669B
独自辞書に必要な4ファイルを作成する
独自辞書を作成するためには、「読み」「音素」「構文」「語彙」という4つの要素に対応するファイルが必要となります。それぞれ
「読み」ファイル —(presentation.yomi) 「音素」ファイル —(presentation.phone) 「構文」ファイル —(presentation.grammar) 「語彙」ファイル —(presentation.voca)
となります。(「presentation」は任意のファイル名を指定してください。)
「読み」ファイル作成
まずはテキストエディタでpresentation.yomiファイルを作成します。
文字コードはUTF-8、[word] + [TAB]キー + [ひらがな]という記法で単語とその読み方を指定します。(なぜUTF-8かというと、Raspbian(Linux)の標準文字コードがUTF-8だから。)
ご清聴 ごせいちょう ありがとう ありがとう ございました ございました
「音素」ファイル作成
「読み」ファイルができたらTerminalからyomi2voca.plを実行して「音素」ファイルに変換するのですが、ここで躓きました。
$ sudo iconv -f utf8 -t eucjp presentation.yomi | /home/pi/julius-4.5/gramtools/yomi2voca/yomi2voca.pl > presentation.phone Error: (they were also printed to stdout) line 1: ����İ ���������礦 line 2: ���꤬�Ȥ� ���꤬�Ȥ� line 3: �������ޤ��� �������ޤ���
なんかエラーになる。しかも文字化けしとる。
yomi2voca.pl の中身を見てみると、
- presentation.yomiファイルを読み込んで、[word] + [TAB]キー + [ひらがな]を[TAB]で区切る
- [ひらがな]をルールに従ってアルファベットに変換する
- 失敗した場合、エラーメッセージ「they were also printed to stdout」と失敗した単語をTerminalに表示する
という非常にシンプルな内容。JuliusはEUC-JP標準だからiconvを噛ましているわけですが、エラーメッセージで単語が文字化けしてる…ってことはきっと文字コードが悪さしてるんだろう、とiconvのオプションを変えてみるもうまくいかず。ネットで解決方法探そうにも、こんなとこで躓いている人は誰もいない。
そしたらね、ありました。Julius公式サイトにこんな一文が。
変換いらないじゃん!
てことでiconv噛まさずに実行したらあっさり成功… (なお成功した場合はTerminal出力なし。)
$ sudo presentation.yomi | /home/pi/julius-4.5/gramtools/yomi2voca/yomi2voca.pl > presentation.phone
「構文」「語彙」ファイル作成
テキストエディタでpresentation.grammar、presentation.vocaファイルを作成します。
私の場合はこんな感じです。詳しい表記法は公式サイトを参照してください。
- presentation.grammar
S : NS_B PRESEN NS_E PRESEN : GOSEICHOU PRESEN : ARIGATOU PRESEN : GOZAIMASHITA
- presentation.voca
% GOSEICHOU ご清聴 g o s e i ch o u % ARIGATOU ありがとう a r i g a t o u % GOZAIMASHITA ございました g o z a i m a sh i t a % NS_B [s] silB % NS_E [/s] silE
独自辞書を生成する(オートマトンに変換)
4つのファイルを作成したら、Terminalからmkdfa.plを実行して独自辞書を生成します。
$ sudo mkdfa.pl ~/dict/presentation /home/pi/dict/presentation.grammar has 3 rules /home/pi/dict/presentation.voca has 5 categories and 5 words --- Now parsing grammar file Now modifying grammar to minimize states[-1] Now parsing vocabulary file Now making nondeterministic finite automaton[4/4] Now making deterministic finite automaton[4/4] Now making triplet list[4/4] 5 categories, 4 nodes, 5 arcs -> minimized: 4 nodes, 5 arcs --- generated: /home/pi/dict/presentation.dfa /home/pi/dict/presentation.term /home/pi/dict/presentation.dict
mkdfa.plの第一引数「~/dict/presentation」には、[4ファイルがあるディレクトリパス]/[4ファイル名]を指定します。
成功すると、4ファイルと同じ配下に「dfa」「dict」「term」の3つのファイルが生成されます。
独自辞書でJuliusを実行する
今回はgrammar-kitで実行してみます。
$ julius -C ~/grammar-kit-4.3.1/hmm_mono.jconf -lv 5000 -input mic -gram ~/presen_system/dict/presentation -nostrip -rejectshort 600
まだ誤認識はありますが、score値で絞ればなんとかなりそうな手ごたえでした!
次回は、pythonを使って特定単語で音を鳴らす、というのに挑戦します。