Posted at

Julius 独自辞書作成方法

More than 1 year has passed since last update.

Julius は数万語彙が登録されている汎用辞書がありますが、かんたんな挨拶や音声によるコマンド操作を行いたい場合、専用の辞書を作成したほうが認識率およびパフォーマンスが上がります。

Julius の辞書はコンパイルする必要があります。コンパイル環境は 32bit の Linux か Windows です。ここでは Ubuntu 16.04 Server 32bit LTS を使用します。


  • 以下より ubuntu-16.04.1-server-i386.iso をダウンロードして使用しています。



  • インストール時に OpenSSH server を有効にしています

  • インストール後、特に apt-get update 等は行っていません


環境設定

Julius の grammar-kit は以下よりダウンロード可能です。

Git と ZIP があります。今回は ZIP を使用します。

$ sudo apt-get install unzip

$ sudo apt-get install libasound2
$ wget -c https://github.com/julius-speech/grammar-kit/archive/v4.3.1.zip
$ unzip v4.3.1.zip
$ chmod a+x grammar-kit-4.3.1/bin/linux/*
$ echo "export PATH=$PATH:~/grammar-kit-4.3.1/bin/linux" >> .bash_profile
$ source .bash_profile
$ mkdir ~/dict


辞書コンパイルの事前知識

Julius が返してくる結果の文字コードは、辞書ファイルの文字コードが適用されます。

つまり、プログラムが UTF-8 を期待しているなら辞書は UTF-8 で、EUC-JP を期待しているなら辞書は EUC-JP で保存しておく必要があります(Julius の起動オプション -charconv でコンバートすることも可能)。ただし、Linux 版の grammar-kit は入力に EUC-JP を期待しているため EUC-JP 以外を扱いたい場合は iconv で変換する必要があります。

改行コードは ¥n 固定です。


辞書コンパイル

ここでは辞書関連ファイルは ~/dict というディレクトリに保存するものとします。

以下の語彙を辞書として採用したいとします。


greeting.txt

おはよう

おはようございます
こんにちは
こんばんは


音素列へのコンパイル

この辞書に読みをつけて以下のように保存します。


greeting.yomi

おはよう    おはよう

ございます ございます
こんにちは こんにちわ
こんばんは こんばんわ

語彙と読みをタブ文字で区切ります。語彙は漢字や英数字混じりで良いですが、読みはすべてひらがなです。また、「こんにちは」は読みとして「こんにちわ」となることに注意が必要です。「おはよう」と「おはようございます」は構文定義で同一視するので、ここでは分解しています。

このファイルを以下のコマンドで音素列にコンパイルします。

$ BASENAME=greeting

$ iconv -f utf8 -t eucjp ~/dict/$BASENAME.yomi | yomi2voca.pl | iconv -f eucjp -t utf8 > ~/dict/$BASENAME.phone

以下のようなファイルができあがります。


greeting.phone

おはよう    o h a y o u

ございます g o z a i m a s u
こんにちは k o N n i ch i w a
こんばんは k o N b a N w a


構文の定義

構文を定義します。今回は以下のようになります。


greeting.grammar

S : NS_B GREET NS_E

GREET : OHAYOU
GREET : OHAYOU GOZAIMASU
GREET : KONNICHIWA
GREET : KONBANWA

S は文章を表します。NS_B が開始、NS_E が終了でその間に GREET があり、GREETOHAYOU だったり KONBANWA だったりする、という具合です。S は複数定義することができ、例えば S : NS_B NAME GREET NS_E などと追加定義し、NAME に「キット1」や「ジャービス2」などと定義すれば、ロボットに対する呼びかけの後の挨拶も認識するようになります。


語彙の定義

語彙を定義します。今回は以下のようになります。


greeting.voca

% OHAYOU

おはよう o h a y o u
% GOZAIMASU
ございます g o z a i m a s u
% KONNICHIWA
こんにちは k o N n i ch i w a
% KONBANWA
こんばんは k o N b a N w a
% NS_B
[s] silB
% NS_E
[/s] silE

% の後に構文で指定した定義を書き、定義の語彙と音素列を並べていきます。この語彙と音素列は yomi2voca.pl の出力を使用しますが、このファイルの区切り文字はスペースなので、タブをスペースに変換する必要があります。今回はひとつの定義にひとつの語彙しかありませんが、例えば OHAYOUおはよー o h a y o: を追加したり、GOZAIMASUございまーす g o z a i m a: s u を追加することで認識率が上がるかもしれません。また、英語対応したい場合には OHAYOUグッドモーニング g u q m o: n i N を追加してもよいです。

NS_BNS_E は Julius の標準では <s></s> が用いられています。一方で Julius のモジュールモードでは XML で結果を返してくるのですが、語彙はエスケープされません。つまり、XML パーサによっては語彙が <s></s> だとパースエラーになる3ため、他の語彙を採用することをおすすめします。ここでは [s][/s] としました。


オートマトンと単語辞書へのコンパイル

以下のコマンドでコンパイルします。

$ mkdfa.pl dict/greeting

dict/greeting.grammar has 5 rules
dict/greeting.voca has 6 categories and 6 words
---
Now parsing grammar file
Now modifying grammar to minimize states[-1]
Now parsing vocabulary file
Now making nondeterministic finite automaton[5/5]
Now making deterministic finite automaton[5/5]
Now making triplet list[5/5]
6 categories, 5 nodes, 7 arcs
-> minimized: 5 nodes, 7 arcs
---
generated: dict/greeting.dfa dict/greeting.term dict/greeting.dict

.grammar と .voca のベースファイル名を指定します。うまくいくと上記出力のように .dfa、.term、.dict が同一ディレクトリに生成されます。

できあがった辞書を使用する場合には、例えば以下のように指定します。

$ ALSADEV="plughw:1,0" julius -C ~/dictation-kit-v4.4/am-gmm.jconf -nostrip -gram ~/dict/greeting -module

-gram で辞書のベースファイル名を指定します。環境変数やパスは実行環境によって変わるので注意してください。





  1. ナイトライダーの AI。音声認識やユーモアを含む会話、自動運転などの技術は時代を先取りしていました 



  2. アイアンマンの AI。まだまだ先になりそうです 



  3. Java 標準の XML ライブラリだとパースエラー、C++ の TinyXML-2 だとパース成功します