Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Julius 独自辞書作成方法

More than 3 years have 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 だとパース成功します 

systemi
ランドマークタワーを拠点に活躍する独立系システム会社
http://www.systemi.co.jp/index.html
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away