語法檔案結構
語法檔案必須遵循 Speakeasy 的特定結構,才能正確解譯檔案的內容。
下例為基本語法檔案內容的範例:
#BNF+EM V2.1;
/*
GRAMMAR: usa_states.bnf
說明
這是識別美國部份州的語法檔案。
我能說什麼?
您可以說出美國的下列任何一州。
*/
!grammar usa_states;
!start <state>;
<state>:
阿拉巴馬
| 阿拉斯加
| 康乃迪克
| 佛羅里達
| 愛達荷
| 堪薩斯
|“紐澤西”
| "紐約";
#BNF+EM V2.1;
各個語法檔案都必須有陳述式為開頭,例如 #BNF+EM V1.1;,這會指出 Speakeasy 應該處理語法檔案的方式。 您不需要修改這一行。
/* */ 或 //
若要建立備註,也就是引擎忽略的資訊,您可以在一行前面加上 //,或用 /* 和 */ 標記括住文字。 您可以編輯說明和我能說什麼?區段說明您對於語法檔案所做的變更。
!grammar [filename]
如果您變更語法檔案的名稱,指令 !grammar
必須使用新的檔案名稱。 例如,如果檔案名稱變更為 VoicePick.bnf,指令將為 !grammar VoicePick;。
!start <state>;
!start 指令將指定使用語法時,語法中哪個群組的字詞可供使用。在上例中,引擎將監聽 <state> 規則中的所有字詞。 如果有多個規則,但是指令僅參照其中一個,則將忽略其他所有規則。
<state>: Alabama | Connecticut |...
<state>: 與最後一個 ; 之間的字詞是語法將接受的字詞。每個字詞都必須以 | (OR 符號) 分隔。 詞語可能全部列在同一行,也可能也可能垂直成排列出,以便於編輯。
為了加強辨識彼此類似的字詞,例如 New York 和 New Jersey,請用 "" (引號) 括住字詞。 這會強制 Speakeasy 引擎更確實按照使用者回應比較接受的字詞。
多個規則
在部份語法檔案中,主要規則區分為多個子區段,以便於管理字詞。 如果一個檔案有多個規則,務必包含 !start 行使用的全部規則。
!start <Speech>;
<Speech>: <YesNo> | <Maybe>;
<YesNo>: yes | no;
<Maybe>: maybe;
在此例中,<Speech> 規則包括 <YesNo> 和 <Maybe> 規則,因此引擎將聽取 <YesNo> 規則與 <Maybe> 規則中的所有字詞。
類似字詞
如果有聽起來類似的字詞,可能會得到不理想的辨識結果。 若要改善辨識,請使用較長較明確的字詞。 例如,不使用「faster」和「fastest」,改用「go faster」和「warp speed」之類的字詞。