Как я могу использовать семантическую маркировку в файлах grxml, когда я повторяю элементы? - PullRequest
3 голосов
/ 28 февраля 2011

Я создаю грамматику GRXML для программного обеспечения, которое будет использовать Microsoft Speech SDK от Microsoft для распознавания голоса.

Теги должны соответствовать формату тега "properties-ms / 1.0", о котором я не нашел никакой конкретной документации (кроме MSDN, который не отвечает на мой вопрос).

Мой основнойбеспокойство касается маркировки цифр, чтобы преобразовать распознанный текст типа «один два три четыре» в число «1234».Вот идея:

<rule id="CODE">
    <item repeat="4">
        <ruleref uri="#DIGIT"/>
    </item>
</rule>

<rule id="DIGIT">
    <one-of>
        <item>
            one
            <tag>"1"</tag>
        </item>
        <item>
            two
            <tag>"2"</tag>
        </item>
        <item>
            three
            <tag>"3"</tag>
        </item>
        <item>
            four
            <tag>"4"</tag>
        </item>
        <item>
            five
            <tag>"5"</tag>
        </item>
    </one-of>
</rule>

Это не делает конкатенацию, но по крайней мере я получаю семантическое значение для каждой цифры.

Однако, когда я использую такое правило для цифр, во время выполненияпрограмма прерывается, вызывая исключение, в котором говорится, что «семантическое значение в правиле« КОД »уже установлено и не может быть изменено».

Как заставить семантическую пометку работать вместе с «повторением» правила DIGIT?Я не хочу разбивать мое правило CODE на 4 одинаковых элемента, каждый из которых имеет свой семантический ключ: в моей грамматике есть другие случаи, когда количество цифр не является фиксированным.

Кроме того, есть ли способобъединить теги, чтобы обеспечить общее семантическое значение числа.

Ответы [ 2 ]

1 голос
/ 31 января 2014

Возможное решение будет что-то вроде этого

<rule id="numbers">
  <item repeat="4">
   <ruleref uri="#numbers_1to4"/>
   <tag>out += rules.numbers_1to4;</tag> 
  </item>
</rule>


<rule id="numbers_1to4">
    <one-of>
      <item>one<tag>out = "1"</tag></item>
      <item>two<tag>out = "2"</tag></item>
      <item>three<tag>out = "3"</tag></item>
      <item>four<tag>out = "4"</tag></item>
     </one-of>
  </rule>
0 голосов
/ 13 июня 2011

Я не знаком с проприетарным tag-format, используемым в Microsoft Speech SDK, но вот как это можно сделать с помощью стандартного формата «семантика-1.0»:

<rule id="CODE">
   <tag>out.CODE = &quot;&quot;;</tag>
   <item repeat="4">
      <ruleref uri="#DIGIT"/>
      <tag>out.CODE += rules.latest();</tag>
   </item>
</rule>


<rule id="DIGIT">
   <one-of>
      <item>
         one
         <tag>out = &quot;1&quot;;</tag>
      </item>
      <item>
         two
         <tag>out = &quot;2&quot;;</tag>
      </item>
      <item>
         three
         <tag>out = &quot;3&quot;;</tag>
      </item>
      <item>
         four
         <tag>out = &quot;4&quot;;</tag>
      </item>
      <item>
         five
         <tag>out = &quot;5&quot;;</tag>
      </item>
</one-of>

...