2014-11-09 6 views
3

저는 Microsoft.Speech 라이브러리를 연구 중입니다. 이는 System.Speech 라이브러리와 유사합니다. 나는 문제가 붙어있어 이것이 버그라고 생각한다.음성 인식 : Result.Semantic.Contains XML 파일에서 문법을 읽을 때 항상 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"과 "GrammarBuilder에서 부하 문법"이 있다고

<?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> 

여기 내 코드입니다. 둘 중 하나를 주석으로 만들어 차이점을 볼 수 있습니다.

+1

xml 파일을 공유하는 방법은 무엇입니까? ;) –

+0

내 xml 파일을 공유했습니다. – Ian

+0

규칙을 공용 범위로 설정하지 않았기 때문에 태그를 할당하지 않았을 수 있습니까? 여기에있는 예와 같습니다. http://msdn.microsoft.com/en-us/library/hh362824(v=office.14).aspx. 그들은 모두 rule.Scope = SrgsRuleScope.Public을 사용합니다. –

답변

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

모든 범위가 XML에서 비공개입니다. 공개로 설정하십시오.