我相信你太過複雜了。我可能會過度簡化它,但是... :)
您可以將所有語法包含在單個文件中。當你聽你的初始命令時,在你的代碼中設置一個標誌,然後監聽跟蹤。
這裏是(簡化)語法集:
<grammar version="1.0" xml:lang="en-US" root="rootRule" tag-format="semantics/1.0" xmlns="http://www.w3.org/2001/06/grammar">
<rule id="rootRule">
<one-of>
<item>
<tag>out.SysCommand = "STATUS";</tag>
Computer what is the system status
</item>
<item>
<tag>out.SysCommand = "PASSWORD";</tag>
Gamma
<one-of>
<item>Four</item>
<item>Forty</item>
</one-of>
Seven Echo
</item>
</one-of>
</root>
</grammar>
你的回調可能類似於下面:
private void OnSpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
if (e.Result.Confidence >= ConfidenceThreshold)
{
if (IsListening)
{
if (e.Result.Semantics["SysCommand"] != null)
{
switch (e.Result.Semantics["SysCommand"].Value.ToString())
{
case "PASSWORD":
// The was waiting for this, now you can act on it
break;
default:
// something else was said, reset!
break;
}
}
}
else if (e.Result.Semantics["SysCommand"] != null)
{
if (e.Result.Semantics["SysCommand"].Value.ToString() == "STATUS")
{
// do stuff that prompts user for password
IsListening = true;
}
}
}
}
你的回調尋找一個 「IsListening」 標誌。如果沒有設置,它會檢查您是否詢問狀態。如果你這樣做,它設置標誌,現在等待密碼。
您可以簡化上述代碼。我複製了它,並用類似的方式做了一些快速編輯。就我而言,我做到以下幾點:
- 傾聽顯示系統的名稱(「弗洛伊德」)
- 集「IsListening」標誌
- 在屏幕上顯示一個提示(知名度勢必IsListening標誌)可能的後續命令
- 聽這些命令,並適當地對他們採取行動
你可以加載和卸載需要新的語法,但是,除非你的語法文件中獲取巨大的,這些加載/卸載的開銷將ST藝術可以快速趕上僅僅通過一套額外的語法規則。