Kinect Speech Recognition распознает только одно грамматическое правило

В настоящее время я разрабатываю приложение распознавания речи с использованием Microsoft Kinect SDK. Цель приложения — загрузить любой (допустимый) файл XML, содержащий грамматику, и использовать его для обработки речи. По какой-то причине, которую я еще не понял, приложение распознает только все слова, принадлежащие первому правилу в файле грамматики XML. Например, в следующей грамматике:

<grammar version="1.0" xml:lang="en-US" root="rootRule" tag-format="semantics/1.0-literals" xmlns="http://www.w3.org/2001/06/grammar">
<rule id="rootRule">
<one-of>
  <item>
    <tag>PEOPLE</tag>
    <one-of>
      <item> team </item>
      <item> kara </item>
      <item> john </item>
      <item> george </item>
    </one-of>
  </item>
  <item>
    <tag>FOOD</tag>
    <one-of>
      <item> apple </item>
      <item> banana </item>
    </one-of>
  </item>
</one-of>
</rule>
<rule id="anotherRule">
<one-of>
  <item>
    <tag>COMMANDS</tag>
    <one-of>
      <item> close </item>
      <item> shut down </item>
      <item> stop the application </item>
    </one-of>
  </item>
  <item>
    <tag>TOYS</tag>
    <one-of>
      <item> doll </item>
      <item> teddy bear </item>
    </one-of>
  </item>
  </one-of>
 </rule>
</grammar>

Приложение будет распознавать только слова, принадлежащие идентификатору правила «rootRule», игнорируя все слова в пределах идентификатора правила «anotherRule». Почему это происходит? Я не обрабатываю файл XML вручную, SDK уже делает это, я только указываю местоположение файла, используя:

spRecEng.LoadGrammar(new Grammar(filename));

И он отлично работает для первого правила, поэтому теоретически он должен работать для всех следующих?!

Я разрабатываю свое приложение на основе уже существующего (оба имеют одну и ту же проблему), и его исходный код можно найти по адресу: https://dl.dropboxusercontent.com/u/28555145/KinectForWindowsSpeech.rar


person user3019217    schedule 11.05.2014    source источник


Ответы (1)


Вы указали свое корневое правило в элементе грамматики root="rootRule":

 <grammar version="1.0" xml:lang="en-US" root="rootRule" tag-format="semantics/1.0-literals" xmlns="http://www.w3.org/2001/06/grammar">

поэтому он использует rootRule в качестве основы. Вы можете построить альтернативы сверху, если вам нужны альтернативы. На второе правило может ссылаться первое правило, и оно также может использоваться для распознавания, например, см. здесь:

http://msdn.microsoft.com/en-us/library/hh362887%28v=office.14%29.aspx

Но есть единственная точка входа в грамматику, которая ведет к распознаванию. Вот так работает двигатель.

person Nikolay Shmyrev    schedule 12.05.2014