Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Речевые Технологии > Помогите составить SRGS-грамматику (нужен оператор if)


Автор: Simplevolk 03.07.15, 12:02
Добрый день!

Я пытаюсь составить грамматику вида : <тип объекта> <уровень> <имя объекта> , но никак не могу понять как))

Грамматику <тип объекта> <уровень> я сделал:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <?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>


<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <?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 и тд.

Как ее сделать?
Спасибо.

Автор: nsh 04.07.15, 15:49
В грамматиках one-of это и есть if.

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     <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>


В чём проблема-то?

Автор: Simplevolk 06.07.15, 06:14
Цитата nsh @
В грамматиках one-of это и есть if.


Тут фишка в том, что мне нужно как-то отфильтровать по уровню.
У меня получился только такой вариант: составить список отфильтрованных по правилу слов (тип и уровень 10 , тип1 и уровень 20 и тд)- и запихнуть в грамматику.


<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <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.

Спасибо.

Автор: nsh 06.07.15, 08:54
Цитата
Я к тому,можно ли сделать так, что при распознавании первых фраз -"тип1 уровень 10"- движок бы заходил сразу в грамматику "тип1_уровень_10"?


Можно, но для этого сложное правило где сначала идёт "уровень 10" потом "тип1 уровень 10" нужно поместить внутрь one-of, а не после него. one-of можно вложенные делать, как я написал в примере выше.

Автор: Simplevolk 07.07.15, 12:07
Цитата nsh @
Можно, но для этого сложное правило где сначала идёт "уровень 10" потом "тип1 уровень 10" нужно поместить внутрь one-of, а не после него. one-of можно вложенные делать, как я написал в примере выше.



Хи.Я тут немного доработал вашу грамматику и у меня такое получилось:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <?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 - то идем в соответствующий список слов и пытаемся распознать там.

Автор: Simplevolk 08.07.15, 07:47
П.С. запустил такую грамматику- микрософтовский движок не принял ее.
В состав тулов входит GrammarValidator.exe - он мне пишет,что "под элементов one-of не может быть элемента rule@".

Автор: nsh 08.07.15, 09:12
Цитата Simplevolk @
В состав тулов входит GrammarValidator.exe - он мне пишет,что "под элементов one-of не может быть элемента rule@".


Поместите item внутри one-of, а внутри item уже сложное правило.


<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <?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>

Автор: Simplevolk 08.07.15, 11:46
Уф... Пришлось допилить эту грамматику так,чтобы валидатор пропускал ее.
У меня получилась такая штука:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <?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?

Такой финт пройдет?
П.С. просто надо распознать достаточно большое количество наименований из БД.
Спасибо.

Автор: nsh 08.07.15, 15:36
Цитата
Такой финт пройдет?


Чего стесняться-то? Попробуйте и узнаем.

Автор: Simplevolk 11.11.15, 10:12
nsh попробовал. Грамматика работает.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)