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

В момента разработвам приложение за разпознаване на реч с помощта на 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