views:

17

answers:

1

I am using vxml powered by an engine similar to TellMe. I adding voice recognition to telephone prompts for a voice mail system. The new menu will first prompt the user for verbal input, and if no match is found, or if no input is given, the user is prompted again with touch tone options.

The original menus look like this:

<menu id="msgedit">
        <prompt><enumerate><value expr="_prompt"/>press <value expr="_dtmf"/>.</enumerate></prompt>
        <choice dtmf="9" next="#checkurgent">To deliver your message </choice>
        <choice dtmf="7" next="#playmsg">To play your message </choice> 
        <choice dtmf="3" next="#rerecord">To discard your message and record over </choice>
        <choice dtmf="2" next="#addtomsg">To add to your message </choice>
        <choice dtmf="6" next="#testnumber">To enter a phone number where you may be reached </choice>
        <choice dtmf="1" next="#cancel">To cancel making a message </choice>
        <!-- handle no input/no match -->   
</menu>

The new menu looks like this:

<form id="msgedit">
      <field name="choice">
         <prompt>
         <if count == 0">
            Please choose one of the following. 
            deliver, play back, rerecord, add to, 
            enter a callback number, or cancel.
            <else/>
            Please choose one of the following. 
            To deliver your message, press 9. 
            To play back your message, press 7. 
            To discard your message and rerecord, press 3. 
            To add to your message, press 2. 
            To enter a callback number, press 6. 
            To cancel your message, press 1.
         </if>
         </prompt>
      </field>
      <filled>
         <if cond="choice == 'deliver' || choice == '9'">
            <goto next="#checkurgent"/>
            <elseif cond="choice == 'play' || choice == '7'"/>
            <goto next="#playmsg"/>
            <elseif cond="choice == 'rerecord' || choice == '3'"/>
            <goto next="#rerecord"/>
            <elseif cond="choice == 'add' || choice == 'add to' || choice == '2'"/>
            <goto next="#addtomsg"/>
            <elseif cond="choice == 'enter callback number' || choice == 'callback number' || choice =='6'"/>
            <goto next="#testnumber"/>
            <elseif cond="choice == 'cancel' || choice =='1'"/>
            <goto next="#cancel"/>
            <else/>
            <throw event="nomatch"/>
         </if>
      </filled>
      <!-- handle no input/no match -->
   </form>

However, I want to use the <enumerate> and <choice> behavior from the original menu to reprompt instead of the long text (which is too long and causes an error).

HERE'S THE QUESTION: is there a way to use the first style of prompt within the second style of prompt? can i put and inside of a field? and how would i do that?

A: 

The choice element is specific to menu. While can use enumerate in a general prompts, the way it is used in the first example, it is tying the prompts to the allowed input. For a field, you are getting the available inputs from a defined grammar.

On the latter point, your snippet doesn't mention grammar nor does the field indicate a type. Is the grammar defined at a higher level within the VoiceXML document or a built in grammar ? If not, that may be the source of your error.

You can use speech recognition with menus and choices, but the way the selections are defined with the enumeration:

This is a modified example from the VoiceXML 2.0 specification:

<menu>
  <choice dtmf="1" next="http://www.sports.example.com/vxml/start.vxml"&gt;
    <grammar src="sports.grxml" type="application/srgs+xml"/>
    Press 1 or say Sports for sports scores
  </choice>
  <choice dtmf="2" next="http://www.weather.example.com/intro.vxml"&gt;
   <grammar src="weather.grxml" type="application/srgs+xml"/>
   Press 2 or say weather for weather
  </choice>
  <choice dtmf="3" next="http://www.stargazer.example.com/voice/astronews.vxml"&gt;
   <grammar src="astronews.grxml" type="application/srgs+xml"/>
   press 3 or say Stargazer astrophysics for ?
  </choice>
</menu>

If you put the prompts into an ECMAScript array, you could probably use the enumeration as well.

In general, I would recommend the field approach. You gain a lot more flexibility for providing rich prompts and error handling. menu/choice is a shortcut mechanism that is meant for simple, limited cases.

Jim Rush
So i can use `<menu>` for speech rec prompts instead of `<form>`? Thats good to know. but here's my question: say i needed to be able to switch between two different menu's based on wheather or not the user has speech rec enabled. In a `<form>` i can just put in an `<if cond="speechRecEnabled == true">` to change the prompt. can i do this in the `<menu>` tag?
mtmurdock
According to the VoiceXML DTD(http://www.w3.org/TR/voicexml20/vxml.dtd) the only element allowed in a choice is a grammar. Therefore, you can't do it in a choice element. You can in a form. For the best user experience, I recommend one sound clip for each path and use the srcexpr of the audio element with your flag to select the correct clip.
Jim Rush
Thanks. I came up with something a little different, but you put me on the right track. :)
mtmurdock