Search code examples
grammarvoice-recognitionvxmlvoicexml

vxml: defining grammars with equivalent inputs


I am using an engine based on TellMe. I have seen examples of grammars where the user can say one of a few different things that are considered the same. However, all the examples i've seen have been for in-line grammars (which dont work with the vxml engine im using). I want to know how i can change my .grxml file to do this. This is the file:

<?xml version="1.0"?>
<!-- created by Matthew Murdock. Grammars for speech rec menus -->
<grammar xmlns="http://www.w3.org/2001/06/grammar" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/06/grammar      http://www.w3.org/TR/speech-grammar/grammar.xsd" xml:lang="en" version="1.0" mode="voice" scope="dialog" tag-format="semantics/1.0.2006">
   <rule id="keep">
      <one-of>
         <item>exit</item>
         <item>exit the system</item>
         <item>another</item>
         <item>another mailbox</item>
         <item>play</item>
         <item>play back</item>                      
      </one-of>
   </rule>
</grammar>

instead of having 6 items, i want to have 3 items, each having two possible utterances. Any ideas on how i can do this?


Solution

  • I figured it out. I changed my grammar to look like this:

    <?xml version="1.0"?>
    <grammar xmlns="http://www.w3.org/2001/06/grammar" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/06/grammar      http://www.w3.org/TR/speech-grammar/grammar.xsd" xml:lang="en" version="1.0" mode="voice" scope="dialog" tag-format="semantics/1.0-literals">
       <rule id="keep">
          <one-of>
             <item><ruleref id="#exit"/></item>
             <item><ruleref id="#play"/></item>
          </one-of>
       </rule>
       <rule id="exit">
          <one-of>
             <item>exit</item>
             <item>exit the system</item>
          </one-of>
          <tag>out.result = "exit"</tag>
       </rule>
       <rule id="play">
          <one-of>
             <item>play</item>
             <item>play back</item>
          </one-of>
          <tag>out.result = "play"</tag>
       </rule>
    </grammar>
    

    Then, back in my script instead of basing my actions on callerInput (the variable specified in the <field> tag), i based them off of callerInput$.interpretation which holds xml containing whatever i assigned out.result to in the <tag> element of the grammar.

    I guess it makes sense to base your actions on the "interpretation" and not the caller's literal input.

    NOTE: Because we are working with our own vxml engine we were able to create a method for extracting the interpretation value out of the xml.