 Помогите составить SRGS-грамматику (нужен оператор if)
    Помогите составить SRGS-грамматику (нужен оператор if)
    
  |  | Наши проекты: Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту | |
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS | 
| [216.73.216.164] | 
|   | 
 | 
 Помогите составить SRGS-грамматику (нужен оператор if)
    Помогите составить SRGS-грамматику (нужен оператор if)
    
  | 
         
         
          
           Сообщ.
           #1
          
          , 
          
         
         | |
|  |  Добрый день! Я пытаюсь составить грамматику вида : <тип объекта> <уровень> <имя объекта> , но никак не могу понять как)) Грамматику <тип объекта> <уровень> я сделал:   <?xml version="1.0" encoding="utf-8" ?> <grammar version="1.0" xml:lang="ru-RU" mode="voice" root="objects"  xmlns="http://www.w3.org/2001/06/grammar" tag-format="semantics/1.0">   <rule id="objects">     <one-of>       <item>тип1</item>       <item>тип2</item>     </one-of>     <ruleref uri="Levels.grxml"/>     <item repeat="0-1"> баллов </item>   </rule> </grammar>   <?xml version="1.0" encoding="utf-8" ?> <grammar version="1.0" xml:lang="ru-RU" mode="voice" root="levels"  xmlns="http://www.w3.org/2001/06/grammar" tag-format="semantics/1.0">   <rule id="levels" scope="public">     <one-of>      <item>5</item>       <item>10</item>       <item>150</item>       <item>20</item>     </one-of>   </rule> </grammar> Далее, я могу составить список "имен объектов", которые удовлетворяют условиям фильтра : тип1 5, тип1 10, тип2 15 и тд. Но как мне эти отфильтрованные грамматики вставить? То есть мне нужна проверка- if(тип1 и 10)-то ruleref grType1_10 и тд. Как ее сделать? Спасибо. | 
|   | 
         
         
          
           Сообщ.
           #2
          
          , 
          
         
         | 
|  |  В грамматиках one-of это и есть if.     <rule id="objects">    <one-of>      <rule>         <item>тип1</item>         <one-of>           <item> объект1 </item>           <item> объект2 </item>           <item> объект3 </item>         </one-of>      </rule>      <rule>         <item>тип2</item>         <one-of>           <item> объект4 </item>           <item> объект5 </item>           <item> объект6 </item>         </one-of>      </rule>    </one-of>    <rule id="levels">      ...    </rule>    <item repeat="0-1"> баллов </item>  </rule> В чём проблема-то? | 
| 
         
         
          
           Сообщ.
           #3
          
          , 
          
         
         | |
|  | Цитата nsh @  В грамматиках one-of это и есть if.  Тут фишка в том, что мне нужно как-то отфильтровать по уровню. У меня получился только такой вариант: составить список отфильтрованных по правилу слов (тип и уровень 10 , тип1 и уровень 20 и тд)- и запихнуть в грамматику.   <rule id="objects">     <one-of>       <item>тип1 </item>       <item>тип2</item>     </one-of>     <ruleref uri="Levels.grxml"/>     <item repeat="0-1">баллов</item>     <one-of>       <item>         <ruleref uri="тип1_уровень_10.grxml"/>       </item>       <item>         <ruleref uri="тип1_уровень_20.grxml"/>       </item>         <item>                    <ruleref uri="тип2_уровень_10.grxml"/>         </item>       </one-of>   </rule> Вопрос такой- как движок будет переходить по таким правилам? Например: распознал слово "тип1"- затем "уровень 10" ,затем "слово,которое находится в грамматике тип1_уровень_10" ,а затем он последовательно проходит по грамматикам "тип1_уровень_10", "тип1_уровень_20" и ищет совпадени?Так? Я к тому,можно ли сделать так, что при распознавании первых фраз -"тип1 уровень 10"- движок бы заходил сразу в грамматику "тип1_уровень_10"? П.С. пользуюсь Microsoft Speech Platform 11. Спасибо. | 
|   | 
         
         
          
           Сообщ.
           #4
          
          , 
          
         
         | 
|  | Цитата  Я к тому,можно ли сделать так, что при распознавании первых фраз -"тип1 уровень 10"- движок бы заходил сразу в грамматику "тип1_уровень_10"? Можно, но для этого сложное правило где сначала идёт "уровень 10" потом "тип1 уровень 10" нужно поместить внутрь one-of, а не после него. one-of можно вложенные делать, как я написал в примере выше. | 
| 
         
         
          
           Сообщ.
           #5
          
          , 
          
         
         | |
|  | Цитата nsh @  Можно, но для этого сложное правило где сначала идёт "уровень 10" потом "тип1 уровень 10" нужно поместить внутрь one-of, а не после него. one-of можно вложенные делать, как я написал в примере выше. Хи.Я тут немного доработал вашу грамматику и у меня такое получилось:   <?xml version="1.0" encoding="utf-8" ?>  <rule id="objects"> <one-of>     <rule>            <item>тип1></item>               <one-of>                <rule>                     <item>уровень_10</item>                     <one-of> объект1_который_входит_в_тип1_уровень10</one-of> //или ruleref на нужную грамматику со списком подготовленных слов?                 </rule>                 <rule>                    <item>уровень_20</item>                    <one-of>объект1_который_входит_в_тип1_уровень_20</one-of>                 </rule>               </one-of>     </rule>     <rule>         <item>тип2</item>             <one-of>                 <rule>                     <item>уровень10</item>                     <one-of>объект1_который_входит_в_тип2_уровень10</one-of>//или ruleref?                  </rule>                  <rule>                     <item>уровень_20</item>                     <one-of>объект1_который_входит_в_тип2_уровень20</one-of>                   </rule>             </one-of>      </rule> </one-of> </rule> Такую грамматику Вы имели ввиду? П.С. - добавил конструкцию one-of в самом начале грамматики. То есть мы выбираем один из типов (тип1,тип2). Затем когда пользователь сказал тип-мы выбираем из правил тип_уровень_10,тип_уровень_20. И уже если пользователь сказал фразу: тип1 уровень 10 - то идем в соответствующий список слов и пытаемся распознать там. | 
| 
         
         
          
           Сообщ.
           #6
          
          , 
          
         
         | |
|  |  П.С. запустил такую грамматику- микрософтовский движок не принял ее. В состав тулов входит GrammarValidator.exe - он мне пишет,что "под элементов one-of не может быть элемента rule@". | 
|   | 
         
         
          
           Сообщ.
           #7
          
          , 
          
         
         | 
|  | Цитата Simplevolk @  В состав тулов входит GrammarValidator.exe - он мне пишет,что "под элементов one-of не может быть элемента rule@". Поместите item внутри one-of, а внутри item уже сложное правило.   <?xml version="1.0" encoding="utf-8" ?>  <rule id="objects"> <one-of>   <item>   <rule>          <item>тип1></item>              <one-of>               <item>               <rule>                    <item>уровень_10</item>                    <one-of> объект1_который_входит_в_тип1_уровень10</one-of>                </rule>                </item>              </one-of>   </rule>   </item> </one-of> </rule> | 
| 
         
         
          
           Сообщ.
           #8
          
          , 
          
         
         | |
|  |  Уф... Пришлось допилить эту грамматику так,чтобы валидатор пропускал ее. У меня получилась такая штука:   <?xml version="1.0" encoding="utf-8" ?> <grammar version="1.0" xml:lang="ru-RU" mode="voice" root="objects"  xmlns="http://www.w3.org/2001/06/grammar" tag-format="semantics/1.0">   <rule id="objects">     <one-of>       <item>         <ruleref uri="#Type1"/>       </item>       <item>         <ruleref uri="#Type2"/>       </item>     </one-of>   </rule>   <rule id="Type1">     <item>Тип1</item>     <one-of>       <item>         <ruleref uri="#Type1_Level10"/>       </item>       <item>         <ruleref uri="#Type1_Level20"/>       </item>     </one-of>   </rule>   <rule id="Type2">     <item>тип2</item>     <one-of>       <item>         <ruleref uri="#Type2_Level10"/>       </item>     </one-of>   </rule>   <rule id="Type1_Level10">     <item>10 уровень</item>     <one-of>       <item>объект 10-го уровня(и это не ММОРПГ!)</item>     </one-of>   </rule>    <rule id="Type1_Level20">     <item>20-й уровень</item>     <one-of>       <item>объект 20-го уровня</item>     </one-of>   </rule>   <rule id="Type2_Level10">     <item>10 уровень</item>     <one-of>       <item>объект 10-го уровня</item>     </one-of>   </rule> </grammar> Вопрос- получается, когда пользователь скажет фразу - тип1 уровень10 объект_10го_уровня - то движок зайдет в правило Type1,затем в Type1_Level10 и уже там он пойдет по вариантам? Это мне нужно для того, чтобы в каждой грамматике нижнего уровня - Type1_Level10 - количество элементов было максимальным для данного движка (1500-2000 слов). Соответственно, на каждую грамматику по 2к слов- а нижних грамматик у меня будет достаточное количество. И общая мощность будет вычисляться как 2000слов*N? Такой финт пройдет? П.С. просто надо распознать достаточно большое количество наименований из БД. Спасибо. | 
|   | 
         
         
          
           Сообщ.
           #9
          
          , 
          
         
         | 
|  | Цитата  Такой финт пройдет? Чего стесняться-то? Попробуйте и узнаем. | 
| 
         
         
          
           Сообщ.
           #10
          
          , 
          
         
         | |
|  |  nsh попробовал. Грамматика работает.   |