2014-11-09 33 views
3

我正在學習Microsoft.Speech庫。它類似於System.Speech庫。我遇到了一個問題,我認爲這可能是一個錯誤。語音識別:從xml文件中讀取語法時Result.Semantic.ContainsKey始終爲false

我試圖使用e.Result.Semantic.ContainsKey("DestinationCity")來確定它是否有密鑰。當我從GrammarBuilder載入語法時,我得到一個true表示「我想從紐約飛往芝加哥」。然後,我將語法寫入一個xml文件,並再次從該文件加載語法。這一次,當我說「我想從紐約飛往芝加哥」時,我得到一個false。我不知道爲什麼會發生這種情況。

這裏是我的代碼:

class Program 
{ 
    static void Main(string[] args) 
    { 
     //Create GrammarBuilder gb 
     Choices cities = new Choices(new string[] { 
     "Los Angeles", "New York", "Chicago", "San Francisco", "Miami", "Dallas" }); 
     GrammarBuilder gb = new GrammarBuilder(); 
     gb.Append("I would like to fly from"); 
     gb.Append(new SemanticResultKey("DepartureCity", cities)); 
     gb.Append("to"); 
     gb.Append(new SemanticResultKey("DestinationCity", cities)); 

     //Put GrammarBuilder gb into xml file 
     SrgsDocument doc = new SrgsDocument(gb); 
     System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(@"C:\Visual Studio Projects\SpeechSemanticsTest\SpeechSemanticsTest\passwordGrammar.xml"); 
     doc.WriteSrgs(writer); 
     writer.Close(); 

     //Create SpeechRecognitionEngine 
     SpeechRecognitionEngine sre = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("en-US")); 
     sre.SetInputToDefaultAudioDevice(); 
     sre.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(sre_SpeechRecognized); 

     //Load Grammar from xml 
     sre.LoadGrammar(new Grammar(@"C:\Visual Studio Projects\SpeechSemanticsTest\SpeechSemanticsTest\passwordGrammar.xml")); 

     //load Grammar from GrammarBuilder 
     //sre.LoadGrammar(new Grammar(gb)); 

     //Start Recognizing 
     sre.RecognizeAsync(RecognizeMode.Multiple); 

     Console.ReadKey();   
    } 

    static void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
    { 
     Console.WriteLine(e.Result.Text); 
     Console.WriteLine(e.Result.Semantics.ContainsKey("DestinationCity")); 
    } 
} 

創建的XML文件是在這裏:

<?xml version="1.0" encoding="utf-8"?> 
<grammar xml:lang="en-US" root="root" tag-format="properties-ms/1.0" version="1.0" xmlns="http://www.w3.org/2001/06/grammar" xmlns:sapi="http://schemas.microsoft.com/Speech/2002/06/SRGSExtensions"> 
<rule id="_1" scope="private"> 
    <one-of> 
     <item>Los Angeles</item> 
     <item>New York</item> 
     <item>Chicago</item> 
     <item>San Francisco</item> 
     <item>Miami</item> 
     <item>Dallas</item> 
    </one-of> 
</rule> 
<rule id="DepartureCity" scope="private"> 
    <ruleref uri="#_1" /> 
</rule> 
<rule id="DestinationCity" scope="private"> 
    <ruleref uri="#_1" /> 
</rule> 
<rule id="root" scope="private"> 
    I would like to fly from<ruleref uri="#DepartureCity" />to<ruleref uri="#DestinationCity" /> 
</rule> 
</grammar> 

需要注意的是,有 「負載語法形式的XML」 和 「從GrammarBuilder負荷語法」。您可以將其作爲評論來查看差異。

+1

如何共享一個XML文件? ;) – 2014-11-09 07:34:33

+0

我分享了我的xml文件。 – Ian 2014-11-09 14:00:29

+0

也許它不分配標籤,因爲你沒有使規則公開的範圍?就像這裏的一個例子。 http://msdn.microsoft.com/en-us/library/hh362824(v=office.14).aspx。他們都使用rule.Scope = SrgsRuleScope.Public; – 2014-11-09 16:32:30

回答

0
<rule id="_1" scope="private"> 

所有的作用域在XML中都是私有的。將它們設置爲公共。