KIHARA BLOG:社内ラズコンでめざせ優勝!

Raspberry Pi(ラズパイ)で機械学習とか音声認識とか姿勢推定とかしながら組み込みシステムを構築して、社内ラズコンで優勝をめざすブログです。勉強中:Raspberry Pi、Linux、Python、Coral EdgeTPU、PoseNet、Julius

ラズパイ4日目①:Juliusで独自辞書を作成する

Raspberry Pi+Juliusで音声を認識の続きです。サンプルのままでは精度が悪くて使えないので、アレコレ取り組んでみます。今回は独自辞書を作りました。
Juliusの独自辞書を作成…できない話の解決方法も載せました!誰かの役に立つと嬉しい。

独自辞書に必要な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 の中身を見てみると、

  1. presentation.yomiファイルを読み込んで、[word] + [TAB]キー + [ひらがな]を[TAB]で区切る
  2. [ひらがな]をルールに従ってアルファベットに変換する
  3. 失敗した場合、エラーメッセージ「they were also printed to stdout」と失敗した単語をTerminalに表示する

という非常にシンプルな内容。JuliusはEUC-JP標準だからiconvを噛ましているわけですが、エラーメッセージで単語が文字化けしてる…ってことはきっと文字コードが悪さしてるんだろう、とiconvのオプションを変えてみるもうまくいかず。ネットで解決方法探そうにも、こんなとこで躓いている人は誰もいない。
そしたらね、ありました。Julius公式サイトにこんな一文が。
f:id:KIHARA0223:20200105104925p:plain
変換いらないじゃん!
てことで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を使って特定単語で音を鳴らす、というのに挑戦します。