今回はR2D2用のJulius辞書を作って音声認識させていきます。

以前セットアップしたJuliusを使って音声認識させていきます。
テストで「ぶどうです」ってなったのはサンプル辞書の仕様でした。
どうやら正常動作だったみたい。

Juliusを動かすには
*.dict
*. dfa
*.term
の3ファイルと
*mic.jconf
というファイルが必要です。
最初の3ファイルは、
*.voca
*.grammar
というファイルからコンパイルして作成します。
*.vocaは読み取る言葉を以下のフォーマットでローマ字で表記します。
日本語とローマ字の間はタブ、ローマ字は1文字ずつスペースを入力します。
最後の[s]、[/s]の後ろもタブを入力します。

% 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

*.grammarファイルは以下のように *vocaで設定したキーを使用して読み取る文章を組み立てる文法を記述します。
grammarファイルで設定されている順番に読み取らないと認識しません。
空白はすべて半角スペースです。

S : NS_B GREET NS_E
GREET : OHAYOU
GREET : OHAYOU GOZAIMASU
GREET : KONNICHIWA
GREET : KONBANWA

ローマ字は同じ音でも表記の仕方がいろいろあり、Juliusの表記に合っていないとコンパイルでエラーになってしまいます。
調べてみたらローマ字変換するツールがあったので使ってみた。
まず、以下のようなファイルを作成する。
各行の最初は表示文字(漢字OK)、2つ目は読み(ひらがな)をタブ区切りで記載します。
文字コードはUTF-8でr2d2用に 作成。

アールツー	あーるつー
おはよう	おはよう
元気	げんき
前進	ぜんしん
後退	こうたい
右	みぎ
左	ひだり
回って	まわって
向いて	むいて
今日の	きょうの
明日の	あしたの
天気は	てんきは
気温は	きおんは

それを以下のディレクトリに置きます。

~/julius-4.4.2/gramtools/mkdfa

ファイルを置いたディレクトリで以下のコマンドを実行する。

iconv -f utf8 -t eucjp r2d2.yomi | yomi2voca.pl | iconv -f eucjp -t utf8 > r2d2.phone

以下のようなphoneファイルが出力される。

アールツー    a: r u ts u:
おはよう    o h a y o u
元気    g e N k i
前進    z e N sh i N
後退    k o u t a i
右    m i g i
左    h i d a r i
回って    m a w a q t e
向いて    m u i t e
今日の    ky o u n o
明日の    a sh i t a n o
天気は    t e N k i h a
気温は    k i o N h a

phoneファイルのローマ字をもとにvocaファイルを作成します。
以下のような、r2d2.voca を作成。

% R2D2
アールツー	a: r u ts u:
% OHAYOU
おはよう	o h a y o u
% GENKI
元気	g e N k i
% ZENSHIN
前進	z e N sh i N
% KOUTAI
後退	k o u t a i
% MIGI
右	m i g i
% HIDARI
左	h i d a r i
% MAWATTE
回って	m a w a q t e
% MUITE
向いて	m u i t e
% KYOUNO
今日の	ky o u n o
% ASHITANO
明日の	a sh i t a n o
% TENKIHA
天気は	t e N k i h a
% KIONHA
気温は	k i o N h a
% NS_B
[s]	silB
% NS_E
[/s]	silE

r2d2.grammarも以下のように作成。

S : NS_B R2COMMAND NS_E
R2COMMAND : R2D2
R2COMMAND : OHAYOU
R2COMMAND : GENKI
R2COMMAND : ZENSHIN
R2COMMAND : KOUTAI
R2COMMAND : MIGI MAWATTE
R2COMMAND : HIDARI MAWATTE
R2COMMAND : MIGI MUITE
R2COMMAND : HIDARI MUITE
R2COMMAND : KYOUNO TENKIHA
R2COMMAND : ASHITANO TENKIHA
R2COMMAND : KYOUNO KIONHA
R2COMMAND : ASHITANO KIONHA

以下のコマンドでコンパイルして実行するディレクトリにコピーします。

sudo cp -b /home/pi/julius-4.4.2/gramtools/mkdfa/mkfa-1.44-flex/mkfa /home/pi/julius-4.4.2/gramtools/mkdfa/mkfa
sudo cp -b /home/pi/julius-4.4.2/gramtools/dfa_minimize/dfa_minimize /home/pi/julius-4.4.2/gramtools/mkdfa/dfa_minimize
sudo /home/pi/julius-4.4.2/gramtools/mkdfa/mkdfa.pl r2d2
cp r2d2.dfa r2d2.term r2d2.dict /home/pi/julius-4.4.2/julius-kit/grammar-kit-4.3.1
cd /home/pi/julius-4.4.2/julius-kit/grammar-kit-4.3.1

以下のコマンドで r2d2mic.jconf を作成。

echo "-gram r2d2" > r2d2mic.jconf
echo "-C hmm_ptm.jconf" >> r2d2mic.jconf
echo "-input mic -demo" >> r2d2mic.jconf

Juliusを実行して話しかけると以下のようにちゃんと認識してくれました。
ワーニングが出たが、おそらくWEBカメラのせい。

pi@raspberrypi:~/julius-4.4.2/julius-kit/grammar-kit-4.3.1 $ julius -C r2d2mic.jconf
STAT: include config: r2d2mic.jconf
STAT: include config: hmm_ptm.jconf
STAT: jconf successfully finalized
......
Notice for feature extraction (01),
        *************************************************************
        * Cepstral mean normalization for real-time decoding:       *
        * NOTICE: The first input may not be recognized, since      *
        *         no initial mean is available on startup.          *
        *************************************************************
Stat: adin_alsa: device name from ALSADEV: "plughw:1,0"
Stat: capture audio at 16000Hz
Stat: adin_alsa: latency set to 32 msec (chunk = 512 bytes)
Stat: "plughw:1,0": Camera [BUFFALO BSWHD06M USB Camera] device USB Audio [USB Audio] subdevice #0
STAT: AD-in thread created
<<< please speak >>>Warning: strip: sample 1-364 has zero value, stripped
pass1_best: [s]           
sentence1: [s] アールツー [/s]
pass1_best: [s]           
sentence1: [s] 元気 [/s]
pass1_best: [s]           
sentence1: [s] アールツー [/s]
<<< please speak >>>

次回はJuliusのイベントを処理する機能をGUIで作成します。