Распознавание речи: Result.Semantic.ContainsKey всегда имеет значение false при чтении грамматики из XML-файла.

Я изучаю библиотеку Microsoft.Speech. Он похож на библиотеку System.Speech. Я застрял с проблемой, и я думаю, что это может быть ошибка.

Я пытался использовать 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». Вы можете сделать любой из них в качестве комментария, чтобы увидеть разницу.


person Ian    schedule 09.11.2014    source источник
comment
Как насчет того, чтобы поделиться файлом xml? ;)   -  person Nikolay Shmyrev    schedule 09.11.2014
comment
Я поделился своим xml-файлом.   -  person Ian    schedule 09.11.2014
comment
Может быть, он не назначает теги, потому что вы не делаете правила общедоступными? Как пример здесь. msdn.microsoft.com/en-us/library /hh362824(v=office.14).aspx. Все они используют rule.Scope = SrgsRuleScope.Public;   -  person Nikolay Shmyrev    schedule 09.11.2014
comment
@NikolayShmyrev Спасибо за ответ. Я не понимаю, что xml был автоматически сгенерирован работающим компоновщиком грамматики. Итак, технически это должно работать, если я загружаю грамматику из этого xml, но это не так.   -  person Ian    schedule 09.11.2014
comment
Ну, это точно ошибка, о которой вы можете сообщить в Microsoft.   -  person Nikolay Shmyrev    schedule 09.11.2014


Ответы (1)


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

Все ваши области являются частными в вашем XML. Сделайте их общедоступными.

person Lesley Gushurst    schedule 03.07.2015