Juliusで四則演算を音声認識させる

 Juliusの四則演算を音声認識させる独自辞書の作成方法について紹介します。試したところ実用的な桁数では実用的な認識率にはならず、このまま使用出来るものではありませんが、独自辞書の定義方法の参考として紹介します。

1桁の四則演算

 1桁の四則演算、つまり例えば”1たす2はいくつ?”とか”7わる3はいくつ?”といったフレーズを音声認識させたい場合、全パターンを全て羅列するとしたら10×10×4=400行の文法を書かねばならないことになりますが、Juliusではこれをもっと短く定義できます。「0~9」を「数字の単語」と定義し、”「数字の単語」たす「数字の単語」はいくつ?”を文法として定義するのです。具体的には、以下の定義ファイルで独自辞書を生成できます。
keisan1.voca

% NUM_ALL
0   z e r o
0   r e i
1   i ch i
2   n i i
2   n i:
3   s a N
4   y o N
4   sh i i
4   sh i:
5   g o o
5   g o:
6   r o k u
7   n a n a
7   sh i ch i
8   h a ch i
9   ky u u
% CALC
たす  t a s u
ひく  h i k u
かける k a k e r u
わる  w a r u
% KOTAE
はいくつ?   w a i k u ts u
% NS_B
[s] silB
% NS_E
[/s]    silE

keisan1.grammar

S : NS_B KEISAN NS_E
KEISAN : NUM CALC NUM KOTAE
NUM : NUM_ALL

この辞書で音声認識させると、PaPeRo i本体で動かす場合、6秒程度かかり、ゆっくりはっきりしゃべれば認識率80%程度かと思われました。

2桁の四則演算 簡易版

 2桁の四則演算に対応するため、まず簡易的に例えば12+34を”いちにいたすさんよんはいくつ?”の様に数字を二つ発話することにして試してみました。この場合grammarを、

keisan2.grammar

S : NS_B KEISAN NS_E
KEISAN : NUM CALC NUM KOTAE
NUM : NUM_ALL NUM_ALL

とするだけです。これで試したところ、PaPeRo i本体で動かす場合、10秒以上かかり、ラズパイで動かす場合には認識時間1秒未満で問題ありませんが、いずれも認識率は50%程度かと思われ、このままでは実用には厳しいと思われました。

2桁の四則演算 自然な発話版

 2桁の数値は自然には”NじゅうM”と発話します。但しNが0なら”M”、Nが1なら”じゅうM”、Mが0なら”Nじゅう”(N>1)または”じゅう”(N==1)と発話するので、数値の単語を0、1、2以上の3つに分割し、文法を定義すれば良いことになりますが、これは以下の様になります。

keisan2n.voca

% NUM_ZERO
0   z e r o
0   r e i
% NUM_ONE
1   i ch i
% NUM_MULTI
2   n i i
2   n i:
3   s a N
4   y o N
4   sh i i
4   sh i:
5   g o o
5   g o:
6   r o k u
7   n a n a
7   sh i ch i
8   h a ch i
9   ky u u
% NUM_JUU
十   j u u
% CALC
たす  t a s u
ひく  h i k u
かける k a k e r u
わる  w a r u
% KOTAE
はいくつ?   w a i k u ts u
% NS_B
[s] silB
% NS_E
[/s]    silE

keisan2n.grammar

S : NS_B KEISAN NS_E
KEISAN : NUM CALC NUM KOTAE
NUM : NUM_ZERO
NUM : NUM_ONE
NUM : NUM_MULTI
NUM : NUM_JUU
NUM : NUM_JUU NUM_ONE
NUM : NUM_JUU NUM_MULTI
NUM : NUM_MULTI NUM_JUU
NUM : NUM_MULTI NUM_JUU NUM_ONE
NUM : NUM_MULTI NUM_JUU NUM_MULTI

試したところ残念ながらこれも認識率は実用には難しい様に思われました。3桁以上も同様に定義は可能ですが実用は難しいと思われます。

 2桁以上の四則演算の音声認識自体はうまく行きませんでしたが、一つの単語カテゴリに複数の単語を定義して文法を定義することで文法の定義を簡単化する方法については有用ではないかと思われ、数字ほど数が多くない場合であれば実用的な認識率を達成できる場合もあるのではないかと思います。