2008-11-29 33 views
4

考慮下面的代碼已加載的語法,如何將單詞添加到使用System.Speech和SAPI 5.3

Choices choices = new Choices(); 
choices.Add(new GrammarBuilder(new SemanticResultValue("product", "<product/>"))); 

GrammarBuilder builder = new GrammarBuilder(); 
builder.Append(new SemanticResultKey("options", choices.ToGrammarBuilder())); 

Grammar grammar = new Grammar(builder) { Name = Constants.GrammarNameLanguage}; 
grammar.Priority = priority; 

_recognition.LoadGrammar(grammar); 

我如何添加額外的字來加載的語法?我知道這可以通過本地代碼和使用SpeechLib interop來實現,但我更喜歡使用託管庫。

更新:我想實現的是,由於個人的變化,不必重複加載整個語法。對於小的語法我通過調用

_recognition.RequestRecognizerUpdate() 

,然後做在事件重建的語法的老語法和裝載卸載了良好的效果:

void Recognition_RecognizerUpdateReached(object sender, RecognizerUpdateReachedEventArgs e) 

對於大型文法這變得過於昂貴。

回答

1

這聽起來像你需要使用一些間接,通過一個語法規則引用。這可以使用GrammarBuilder.AppendRuleReference方法完成。首先用一些SRGS語法文件測試你的語法可能會更容易。

的原則是你加載它有它一定的參考,以較小的用戶特定的單詞列表語法,你會動態加載一個主要大文法。

http://www.w3.org/TR/speech-grammar/#S2.2爲SRGS格式,http://msdn.microsoft.com/en-us/library/system.speech.recognition.grammarbuilder.appendrulereference.aspx對於程序的版本。

+0

我不確定我關注。假設我如AppendRuleReference中所述添加對外部語法的引用。在引用這個引用語法之後,它的內容就會改變。我現在如何更新語音引擎以使用修正的語法? (當然沒有重新加載) – 2009-03-16 17:31:37

+0

您需要重新加載_referenced_語法,但不是主要語法。這應該是一個更小的加載/卸載操作。 如果每個用戶的差異很大,那麼另一個選項是讓它們全部加載,然後在運行中啓用/禁用它們。 – 2009-03-16 18:28:07

+0

我會試着舉個例子。打開單詞並開始輸入。添加/刪除/更改的每個短語都應添加/刪除/更改(=刪除然後添加)到語法中。我需要支持大文件。 (在這裏我定義大的重新加載) – 2009-03-16 21:09:21

1

在本地SAPI,我會使用ISpGrammarBuilder2 :: AddTextSubset()。