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