Julius辞書生成ツール

 開発TipsJuliusで独自辞書を使った音声認識を行うJuliusで四則演算を音声認識させるでJuliusの独自辞書を公式の手順で作成しましたが、ひらがなの読みから音素列(‘i ch i’など)をツールで変換した出力ファイルを編集して、単語と音素列の組に改めて名前(単語カテゴリ名、”% ICHI”など)を付けた上で構文を定義する必要があり、かなり面倒でしたので、独自フォーマットの入力ファイルからJuliusの辞書をPaPeRo i上で生成するツールを作成しました。

独自入力ファイルフォーマット

(1) 基本フォーマット
 入力ファイルの基本は、

文(TAB)ひらがな表記の読み

です。音素列への変換と単語カテゴリ名は自動で処理します。

(2) 単語の分割
 例えば”お知らせ教えて”、”予定教えて”を認識させたい場合、”お知らせ”、”予定”、”教えて”の3語に単語カテゴリを分けた上で構文定義でもう一度くっつける必要があり面倒でしたが、そのために、上記単語およびひらがな表記の読みを、’-‘で分割できる仕様としました。つまり、

お知らせ-教えて(TAB)おしらせ-おしえて
予定-教えて(TAB)よてい-おしえて

と定義すれば、単語カテゴリ分けと構文で再構築する処理を自動で行います。ただし、例えば

お知らせ-教えて(TAB)おしらせ-おしえて
予定-オシえて(TAB)よてい-おしえて

の様に、読み「おしえて」に対する単語が一致しない(「教えて」、「オシえて」)場合、エラーになるため注意が必要です。

(3) 単語カテゴリ指定と構文定義
 四則演算を音声認識させたい場合などには、どうしても単語カテゴリと構文を直接定義する必要が生じます。そこで、

% 単語カテゴリ名

と記述すればそれ以後はそのカテゴリ名の単語として扱う様にしました。また、

##grammar

と記述するとそれ以降の行をgrammarファイルにそのまま転記します。例として、佐藤さん、鈴木さん、高橋さんに名前を尋ねて返答を認識するとして、利用者が名前だけを言う場合と、”です”、”だよ”、”だ”を付ける場合全てに対応するための定義は、

% EX_NAME
佐藤(TAB)さとう
鈴木(TAB)すずき
高橋(TAB)たかはし
% EX_DESU
です(TAB)です
だよ(TAB)だよ
だ(TAB)だ

##grammar
S : NS_B EX_SENT NS_E
EX_SENT : EX_NAME EX_DESU
EX_SENT : EX_NAME

となります。なお文法定義において、開始、終了はそれぞれ”NS_B”、”NS_E”の固定となっています。

ツールの使用方法

(1) 準備
 開発TipsJuliusで独自辞書を使った音声認識を行うの手順に従いPaPeRo i上で独自辞書を生成できる様にしてください。このツールはJulius/Perlのパスがこの開発Tipsの記述通りであると想定しています。

(2) 実行
 このツールを実行する位置はどこでも構いませんが、Juliusの独自辞書用ディレクトリとしている/Extension/local/julius/mydictにするのが良いと思われます。
デフォルトの入力ファイル名はmydict.dicsrcとなっていますので、この名前で入力ファイルを用意た上で、

# python3 juliusdic.py

とするか、異なる名前の入力ファイルを指定する場合は

# python3 juliusdic.py -f xxxx.dicsrc

としてください。例として入力ファイルを、

mydict.dicsrc (TABは空白表記としています)

おはよう    おはよう
おはよう-ございます  おはよう-ございます
こんにちは   こんにちわ
さようなら   さようなら
さようなら   さよーなら
さようなら   さよなら
今日の-天気は きょうの-てんきわ
今日の-天気は きょーの-てんきわ
明日の-天気は あしたの-てんきわ

% EX_NAME
佐藤  さとう
鈴木  すずき
高橋  たかはし
% EX_DESU
です  です
だよ  だよ
だ   だ

##grammar
S : NS_B EX_SENT NS_E
EX_SENT : EX_NAME EX_DESU
EX_SENT : EX_NAME

とした場合、エラー無く終了するとmydict.dfa、mydict.term、mydict.dictが生成されますが、中間ファイルとして以下の様なファイルが生成されますので、エラー時の参考にしてください。

mydict.yomi

おはよう おはよう
ございます ございます
こんにちは こんにちわ
さようなら さようなら
さようなら さよーなら
さようなら さよなら
今日の きょうの
天気は てんきわ
今日の きょーの
明日の あしたの
佐藤 さとう
鈴木 すずき
高橋 たかはし
です です
だよ だよ
だ だ

mydict.prevoca

おはよう        o h a y o u
ございます      g o z a i m a s u
こんにちは      k o N n i ch i w a
さようなら      s a y o u n a r a
さようなら      s a y o: n a r a
さようなら      s a y o n a r a
今日の  ky o u n o
天気は  t e N k i w a
今日の  ky o: n o
明日の  a sh i t a n o
佐藤    s a t o u
鈴木    s u z u k i
高橋    t a k a h a sh i
です    d e s u
だよ    d a y o
だ      d a

mydict.voca

% SAYOUNARA
さようなら      s a y o u n a r a
さようなら      s a y o: n a r a
さようなら      s a y o n a r a
% GOZAIMASU
ございます      g o z a i m a s u
% KYOUNO
今日の  ky o u n o
今日の  ky o: n o
% KONNICHIWA
こんにちは      k o N n i ch i w a
% TENKIWA
天気は  t e N k i w a
% ASHITANO
明日の  a sh i t a n o
% OHAYOU
おはよう        o h a y o u
% EX_NAME
佐藤    s a t o u
鈴木    s u z u k i
高橋    t a k a h a sh i
% EX_DESU
です    d e s u
だよ    d a y o
だ      d a
% NS_B
[s]     silB
% NS_E
[/s]    silE

mydict.grammar

S : NS_B SENTENCE NS_E
SENTENCE : OHAYOU
SENTENCE : OHAYOU GOZAIMASU
SENTENCE : KONNICHIWA
SENTENCE : SAYOUNARA
SENTENCE : KYOUNO TENKIWA
SENTENCE : ASHITANO TENKIWA
S : NS_B EX_SENT NS_E
EX_SENT : EX_NAME EX_DESU
EX_SENT : EX_NAME