Rule Grammar
使用 grammar 文件 进行语音识别
在 AmiVoice API Private 中可用的"音声入力_ルール"引擎(-a-rule-input-private)中,可以使用用户创建的 grammar 文件 进行语音识别。例如,在 IVR 系统中进行客户信息的语音识别时,对于确认会员号码等基于特定 rule 且仅使用有限词汇的预期发话场景,这种方法非常有效。
Grammar 文件 格式
"音声入力_ルール"引擎可以使用 JSpeech Grammar Format(JSGF)描述的 grammar 文件 (JSGF grammar 文件 ),或者 Speech Recognition Grammar Specification(SRGS)描述的 grammar 文件 (SRGF grammar 文件 )。使用这些格式,可以有限地描述希望语音识别引擎识别的短语(单词集)和标签(当短语被识别时作为附加信息返回给应用程序的字符串)。如果要新建 grammar 文件,推荐使用 JSGF grammar 文件。 这里简要说明两种 grammar 文件 的规范,有关各 grammar 文件 规范的详细信息,请参阅以下网页:
- JSpeech Grammar Format: https://www.w3.org/TR/jsgf/
- Speech Recognition Grammar Specification Version 1.0: https://www.w3.org/TR/speech-grammar/
JSGF Grammar 文件 简易规范
JSGF grammar 文件 由以下元素组成:
Header 信息
描述字符编码信息和国家/语言信息。"header 信息"的格式如下:
#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 【grammar 名称】;
Grammar 名称应指定去除路径部分和扩展名部分后的 grammar 文件 名。
例:
grammar Sample;
Rule 定义语句
描述实际希望语音识别引擎识别的短语和标签的定义。一个 grammar 文件 中可以描述多个 rule 定义语句。 Rule 分为 public rule 和 private rule 两种。Public rule 单独规定希望语音识别引擎识别的短语或标签。Private rule 被其他 rule 引用。 Public rule 的"rule 定义语句"格式如下:
public <【rule 名】> = 【rule 定义】;
Private rule 的" rule 定义语句"格式如下:
<【rule 名】> = 【rule 定义】;
关于 rule 定义,请参阅rule 定义。
例:
public <sample1> = 早上好 <sample2>;
<sample2> = AmiVoice\あみぼいす;
Rule 定义
Rule 定义由以下元素组成:
单词
描述希望语音识别引擎识别的单词。单词可以串行或并行描述。单词的"显示"和"读音"用\(反斜杠)分隔。对于一个"显示"有多个"读音"时,各读音用/(斜杠)分隔。格式如下:
| 符号 | 说明 |
|---|---|
( ) | 表示"集合化" |
| | 表示"并行" |
\ | 表示显示和读音的分隔符 |
/ | 表示读音的分隔符 |
串行示例:
・・・ AmiVoice\あみぼいす/あみ 语音识别\おんせいにんしき 引擎 ・・・
并行示例:
・・・ ( AmiVoice\あみぼいす/あみ | 语音识别\おんせいにんしき | 引擎 ) ・・・
关于单词的描述方式,还请确认以下内容:
- "读音"中只能指定平假名、"ー"(长音符号)和"."(句点)。
- 在描述"读音"时,无论使用"ー"(长音符号)还是不使用,在语音识别引擎内部都会作为相同的"读音"处理。基于这个同一视 rule,请避免注册重复的单词。
例:
「かー」=「かあ」 「きゃー」=「きゃあ」
「きー」=「きい」
「くー」=「くう」 「きゅー」=「きゅう」
「けー」=「けい」=「けえ」
「こー」=「こう」=「こお」 「きょー」=「きょう」=「きょお」等
- 在"读音"中使用"は"或"へ"时,这些总是被视为"h a"或"h e"。它们不会被视为"w a"或"e"。
- 在描述"读音"时,使用"."(句点)可以强制不应用上述同一视 rule。 例:
「やまのうち」 → "やまのーち"
「やまの.うち」 → "やまのうち"
「りくうんきょく」 → "りくーんきょく"
「りく.うんきょく」→ "りくうんきょく" 等
Rule 名
当想要引用同一 grammar 文件 内的不同 rule 时使用。rule 名也可以串行或并行描述。格式如下:
<【rule 名】>
例:
・・・ こんにちは <name> さん・・・
特殊 rule 名
也可以描述对特殊 rule 的引用。表示特殊 rule 的 rule 名如下:
| Rule 名 | 说明 |
|---|---|
<NULL> | 表示什么都没有的特殊 rule |
<VOID> | 表示绝对不匹配任何发话的特殊 rule |
<GARBAGE> | 表示匹配任何发话的特殊 rule |
例:
・・・ こんにちは ( <NULL> {no-name} | アミ {AMI} ) ・・・
・・・ こんばんは <VOID> ・・・
<GARBAGE>+ ( おはよう | おやすみ ) <GARBAGE>+
特殊 rule <GARBAGE> 是 AmiVoice 对 JSGF 的独有扩展,不包含在标准 JSGF 规范中。
重复
可以描述"1 次"、"0 或 1 次"、"0 次或以上重复"、"1 次或以上重复"四种重复次数。格式如下:
| 符号 | 说明 |
|---|---|
[ ] | 表示"0 或 1 次"的符号 |
* | 表示"0 次或以上重复"的后置符号 |
+ | 表示"1 次或以上重复"的后置符号 |
"1 次"示例:
・・・ AmiVoice\あみぼいす 语音识别\おんせいにんしき 引擎 ・・・
"0 或 1 次"示例:
・・・ [ AmiVoice\あみぼいす ] ・・・
・・・ [ AmiVoice\あみぼいす 语音识别\おんせいにんしき 引擎 ] ・・・
"0 次或以上重复"示例:
・・・ AmiVoice\あみぼいす * ・・・
・・・ ( AmiVoice\あみぼいす 语音识别\おんせいにんしき 引擎 )* ・・・
"1 次或以上重复"示例:
・・・ AmiVoice\あみぼいす + ・・・
・・・ ( AmiVoice\あみぼいす 语音识别\おんせいにんしき 引擎 )+ ・・・
标签
可以在 rule 定义中描述标签(当短语被识别时作为附加信息返回给应用程序的字符串)。使用标签可以从识别的短语中提取与构成识别短语的单词集不同的信息。通过为具有相同含义的不同短语设置相同的标签,可以使接收标签字符串的应用程序端更容易实现不依赖于措辞或语言的处理。格式如下:
{【标签】}
例:
・・・ AmiVoice\あみぼいす 语音识别\おんせいにんしき 引擎 {AmiVoice} ・・・
・・・ ( 一个\ひとつ | 一个\いっこ | 一根\いっぽん ) {1} ・・・
SRGS grammar 文件 简易规范
SRGS grammar 文件 有两种格式: ABNF 格式的 SRGS grammar 文件 和 XML 格式的 SRGS grammar 文件 ,两者仅在表现形式上有所不同,在可表达的内容上并无差异。SRGS grammar 文件 的规范基本包含了 JSGF grammar 文件 的规范,因此 JSGF grammar 文件 和 SRGS grammar 文件 之间的转换相对容易进行。 JSGF grammar 文件 和 SRGS grammar 文件 之间的主要转换 rule 如下:
| 项目 | JSGF grammar 文件 | ABNF 格式的 SRGS grammar 文件 | XML 格式的 SRGS grammar 文件 |
|---|---|---|---|
| Header 信息 | #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 声明语句 | grammar a; | (无) ※ 通过文件名表示 grammar 名 | (无) ※ 通过文件名表示 grammar 名 |
| Public rule 定义语句 | public <a> = A; | public $a = A; | <rule id="a" scope="public"> A </rule> |
| Private rule 定义语句 | <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> |
| Rule 名 | < b > | $ b | <ruleref uri="#b"> |
| 特殊 rule 名 | <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};
"+"符号表示一次或多次重复,因此可以识别以下类型的句子:
"ハン バーガー"
"ひとつ"
"ハンバーガー一個"
"ハンバーガー一個とアイスクリームを二つお願いします"
"ハンバーガー一個とアイスクリームを二つドリンク三つ"
应用程序端可以利用标签字符串,轻松处理识别为"一つ"或"一個"的情况。例如,当识别"ハンバーガー一個とアイスクリームを二つドリンク三つ"时,标签字符串为"bur|1|ice|2|dri|3"。