ルールグラマ
グラマファイルを用いた音声認識
AmiVoice API Private で利用可能な「音声入力_ルール」エンジン(-a-rule-input-private
)では、ユーザが作成したグラマファイルを用いて音声認識を行うことができます。たとえば、IVR システムで顧客情報の音声認識を行う場合に、会員番号の確認など、一定のルールに基づいて限られた単語のみが用いられる発話が期待される場面などに有効です。
グラマファイルフォーマット
「音声入力_ルール」エンジンでは、JSpeech Grammar Format(JSGF) で記述されたグラマファイル(JSGF グラマファイル)、または、Speech Recognition Grammar Specification(SRGS)で記述されたグラマファイル(SRGF グラマファイル)を使用することができます。これらのフォーマットを使用することで音声認識エンジンに認識して欲しいフレーズ(単語のセット)とタグ(フレーズが認識された時に付随情報としてアプリケーションに返される文字列)を限定的に記述することができます。新しくグラマファイルを作成する場合は JSGF グラマファイルを推奨します。 ここでは、2つのグラマファイルの仕様について簡単な説明をしますが、それぞれのグラマファイルの仕様の詳細については、以下の Web ページを参照してください。
- JSpeech Grammar Format: https://www.w3.org/TR/jsgf/
- Speech Recognition Grammar Specification Version 1.0: https://www.w3.org/TR/speech-grammar/
JSGF グラマファイル簡易仕様
JSGF グラマファイルは、以下の要素で構成されます。
ヘッダ情報
文字エンコーディング情報、および、国・言語情報を記述します。「ヘッダ情報」の形式は、以下の通りです。
#JSGF V1.0;
#JSGF V1.0 <文字エンコーディング情報>;
#JSGF V1.0 <文字エンコーディング情報> <国・言語情報>;
文字エンコーディング情報、および、国・言語情報は、記述を省略することができます。
例:
#JSGF V1.0;
#JSGF V1.0 MS932;
#JSGF V1.0 MS932 ja-JP;
#JSGF V1.0 UTF-8;
grammar 文
グラマ名を記述します。「grammar 文」の形式は、以下の通りです。
grammar 【グラマ名】;
グラマ名には、グラマファイル名からパス部分や拡張子部分を除いた文字列を指定するようにしてください。
例:
grammar Sample;
ルール定義文
実際に音声認識エンジンに認識して欲しいフレーズとタグの定義を記述します。一つのグラマファイルの中に複数のルール定義文を記述することができます。 ルールには、public ルールと private ルールの二種類があります。public ルールは、それ単独で音声認識エンジンに認識して欲しいフレーズやタグを規定するものです。private ルールは、他のルールから参照されるものです。 public ルールの「ルール定義文」の形式は、以下の通りです。
public <【ルール名】> = 【ルール定義】;
private ルールの「ルール定義文」の形式は、以下の通りです。
<【ルール名】> = 【ルール定義】;
ルール定義については、ルール定義を参照してください。
例:
public <sample1> = おはよう <sample2>;
<sample2> = AmiVoice\あみぼいす;
ルール定義
ルール定義は、以下の要素で構成されます。
単語
音声認識エンジンにより認識して欲しい単語を記述します。単語は、直列ないし並列に記述することができます。単語の「表記」と「読み」は\
(バックスラッシュ)で区切ります。一つの「表記」に対して複数の「読み」を記述する場合は、それぞれの読みを/
(スラッシュ)で区切ります。形式は、以下の通りです。
記号 | 説明 |
---|---|
( ) | 「集合化」を示す |
| | 「並列」を示す |
\ | 表記と読みの区切りを示す |
/ | 読みの区切りを示す |
直列の例:
・・・ AmiVoice\あみぼいす/あみ 音声認識\おんせいにんしき エンジン ・・・
並列の例:
・・・ ( AmiVoice\あみぼいす/あみ | 音声認識\おんせいにんしき | エンジン ) ・・・
単語の記述の仕方については、以下も確認してください。
- 「読み」 に指定できる文字列は、ひらがなと「ー」(長音記号)と「.」(ピリオド)のみです。
- 「読み」 を記述する際に、「ー」(長音記号)を使用して記述しても、「ー」(長音記号)を使用せずに記述しても、音声認識エンジン内部では、共に同じ「読み」 として扱います。この同一視ルールに基づき、重複するような単語の登録はしないようにしてください。
例:
「かー」=「かあ」 「きゃー」=「きゃあ」
「きー」=「きい」
「くー」=「くう」 「きゅー」=「きゅう」
「けー」=「けい」=「けえ」
「こー」=「こう」=「こお」 「きょー」=「きょう」=「きょお」など
- 「読み」 の中に「は」や「へ」を使用する場合、これらは常に「h a」や「h e」として扱います。「w a」や「e」として扱われることはありません。
- 「読み」 を記述する際に、「.」(ピリオド)を使用することで、上記の同一視ルールを強制的に行わないような記述が可能になります。 例:
「や まのうち」 → “やまのーち”
「やまの.うち」 → “やまのうち”
「りくうんきょく」 → “りくーんきょく”
「りく.うんきょく」→ “りくうんきょく” など
ルール名
同じグラマファイル内の異なるルールを参照したい場合に記述します。ルール名も直列ないし並列に記述することができます。形式は、以下のとおりです。
<【ルール名】>
例:
・・・ こんにちは <name> さん・・・
特殊ルール名
特殊ルールへの参照を記述することもできます。特殊ルールを表すルール名は、以下のとおりです。
ルール名 | 説明 |
---|---|
<NULL> | 何もないことを意味する特殊ルール |
<VOID> | どんな発話にも絶対に合致しないことを意味する特殊ルール |
<GARBAGE> | どんな発話にも合致することを意味する特殊ルール |
例:
・・・ こんにちは ( <NULL> {no-name} | アミ {AMI} ) ・・・
・・・ こんばんは <VOID> ・・・
<GARBAGE>+ ( おはよう | おやすみ ) <GARBAGE>+
特殊ルール <GARBAGE>
は、AmiVoice が JSGF に対して独自に拡張した仕様であり、標準の JSGF の仕様には含まれません。
繰り返し
繰り返し回数として「1回」、「0または1回」、「0回以上の繰り返し」、「1回以上の繰り返し」の4種類の記述ができます。形式は、以下の通りです。
記号 | 説明 |
---|---|
[ ] | 「0または1回」を示す記号 |
* | 「0回以上の繰り返し」を示す後置記号 |
+ | 「1回以上の繰り返し」を示す後置記号 |
「1回」の例:
・・・ AmiVoice\あみぼいす 音声認識\おんせいにんしき エンジン ・・・
「0または1回」の例:
・・・ [ AmiVoice\あみぼいす ] ・・・
・・・ [ AmiVoice\あみぼいす 音声認識\おんせいにんしき エンジン ] ・・・
「0回以上の繰り返し」の例:
・・・ AmiVoice\あみぼいす * ・・・
・・・ ( AmiVoice\あみぼいす 音声認識\おんせいにんしき エンジン )* ・・・
「1回以上の繰り返し」の例:
・・・ AmiVoice\あみぼいす + ・・・
・・・ ( AmiVoice\あみぼいす 音声認識\おんせいにんしき エンジン )+ ・・・
タグ
ルール定義の中にタグ(フレーズが認識された時に付随情報としてアプリケーションに返される文字列)を記述することができます。タグを用いることで、認識されたフレーズから、認識されたフレーズを構成する単語のセットとは別の情報を取り出すことが可能になります。同じ意味を持つ異なるフレーズに同じタグを設定することで、タグ文字列を受け取るアプリケーション側で言い回しや言語に依存しない処理の実現を容易にします。形式は、以下の通りです。
{【タグ】}
例:
・・・ AmiVoice\あみぼいす 音声認識\おんせいにんしき エンジン {AmiVoice} ・・・
・・・ ( 一つ\ひとつ | 一個\いっこ | 一本\いっぽん ) {1} ・・・
SRGSグラマファイル簡易仕様
SRGS グラマファイルは、ABNF 形式の SRGS グラマファイルと XML 形式の SRGS グラマファイルの2種類の形式を持ちますが、両者は表現形式だけの違いだけであり、表現可能な内容に違いはありません。SRGS グラマファイルの仕 様は、ほぼ JSGF グラマファイルの仕様を包含したものになっていますので、JSGF グラマファイルと SRGS グラマファイルの間の変換は、比較的容易に行うことができます。 JSGF グラマファイルと SRGS グラマファイルの間の主要な変換規則は、以下の通りです。
項目 | JSGF グラマファイル | ABNF 形式の SRGS グラマファイル | XML 形式の SRGS グラマファイル |
---|---|---|---|
ヘッダ情報 | #JSGF V1.0 MS932 ja-JP; | #ABNF 1.0 MS932; language ja-JP; | <?xml version="1.0" encoding="MS932"> <grammar xmlns="..." version="1.0" xml:lang="ja-JP"> ... </grammar> |
グラマ宣言文 | grammar a; | (なし) ※ ファイル名によりグラマ名を表現するため | (なし) ※ ファイル名によりグラマ名を表現するため |
Public ルール定義文 | public <a> = A; | public $a = A; | <rule id="a" scope="public"> A </rule> |
Private ルール定義文 | <b> = B; | $b = B; | <rule id="b"> B </rule> |
集合 | ( A B C ) | ( A B C ) | <item>A B C</item> |
並列 | ( A | B | C ) | ( A | B | C ) | <one-of> <item>A<item> <item>B</item> <item>C</item> </one-of> |
ルール名 | < b > | $ b | <ruleref uri="#b"> |
特殊ルール名 | <NULL> <VOID> <GARBAGE> | $NULL $VOID $GARBAGE | <ruleref special="NULL"> <ruleref special="VOID"> <ruleref special="GARBAGE"> |
0 回または 1 回 | [ A ] | [ A ] または A <0-1> | <item repeat="0-1"> A </item> |
0 回以上 | A * | A <0-> | <item repeat="0-"> A </item> |
1 回以上 | A + | A <1-> | <item repeat="1-"> A </item> |
タグ | { T } | { T } | <tag>T</tag> |
サンプル
サンプル1 挨拶
Greeting.gram
#JSGF V1.0 UTF-8;
grammar Greeting;
public <greeting> = おはよう [ございます] | こんにちは | こんばんは | さようなら;
「おはよう」、「おはようございます」、「こんにちは」、「こんばんは」、「さようなら」が認識できます。
サンプル2 名前
Name.gram
#JSGF V1.0 UTF-8;
grammar Name;
public <name> = [私\わたし わ] <last> <first> [です];
<last> = 鈴木\すずき {suzuki} | 中村\なかむら {nakamura};
<first> = 太郎\たろー {taro} | 花子\はなこ {hanako};
「私は鈴木太郎です」や 「私は中村花子です」などが認識できます。 「私は」と「です」は省略することができます。 「鈴木花子は私です」など語順の違うものや「私は中村です」などは認識できません。
サンプル3 郵便番号
ZipCode.gram
#JSGF V1.0 UTF-8;
grammar ZipCode;
public <zipcode> = <num> <num> <num> [の] <num> <num> <num> <num>;
<num> = 1\いち {1}
| 2\に/にー {2}
| 3\さん {3}
| 4\よん/し/しー {4}
| 5\ご {5}
| 6\ろく {6}
| 7\なな/しち {7}
| 8\はち {8}
| 9\きゅー/く/くー {9}
| 0\ぜろ/れー/まる {0};
「123 の4567」などが認識できます。 「123 の4567」と認識した場合のタグ文字列は「1|2|3|4|5|6|7」となりますので、アプリケーション側でタグ文字列から「|」を取り除くと郵便番号を取得することができます。
サンプル4 連続数字入力
Number.gram
#JSGF V1.0 UTF-8;
grammar Number;
public <number> = <num>+;
<num> = 1\いち {1}
| 2\に/にー {2}
| 3\さん {3}
| 4\よん/し/しー {4}
| 5\ご {5}
| 6\ろく {6}
| 7\なな/しち {7}
| 8\はち {8}
| 9\きゅー/く/くー {9}
| 0\ぜろ/れー/まる {0};
「いちにさん」、「ごろくなな」などが認識できます。
サンプル5 ドライブスルー
Burger.gram
#JSGF V1.0 UTF-8;
grammar Burger;
public <order> = (<item> [を] <count> [と])+ [[を] お願い\おねがい [します]];
public <item> = ( ハンバーガー {bur}
| ドリンク {dri}
| フライドポテト {fri}
| コカコーラ {col}
| アイスクリーム {ice}
);
<count> = ( 一つ\ひとつ {1} | 二つ\ふたつ {2} | 三つ\みっつ {3} | 四つ\よっつ {4} | 五つ\いつつ {5}
| 六つ\むっつ {6} | 七つ\ななつ {7} | 八つ\やっつ {8} | 九つ\ここのつ {9}
| 一個\いっこ {1} | 二個\にこ {2} | 三個\さんこ {3} | 四個\よんこ {4} | 五個\ごこ {5}
| 六個\ろっこ {6} | 七個\ななこ {7} | 八個\はっこ {8} | 九個\きゅーこ {9}
);
public <end> = (以上\いじょー | OK\おっけー) [です] {end};
「+
」記号は1回以上の繰り返しなので、以下のような文が認識できます。
「ハンバーガー」
「ひとつ」
「ハンバーガー一個」
「ハンバーガー一個とアイスクリームを二つお願いします」
「ハンバーガー一個とアイスクリームを二つドリンク三つ」
アプリケーション側でタグ文字列を利用することで、「一つ」と認識した場合でも、「一個」と認識した場合でも同じ処理を行わせることが容易にできます。例えば、「ハンバーガー一個とアイスクリームを二つドリンク三つ」を認識した場合のタグ文字列は「bur|1|ice|2|dri|3」となります。