代码之家  ›  专栏  ›  技术社区  ›  mtmurdock

vxml:我可以在语音提示和枚举提示之间切换吗?

  •  1
  • mtmurdock  · 技术社区  · 14 年前

    我使用的VXML由一个类似于tellme的引擎驱动。我在语音邮件系统的电话提示中添加了语音识别。新菜单将首先提示用户进行口头输入,如果找不到匹配项,或者如果没有给出输入,则会再次提示用户使用按键选项。

    原始菜单如下:

    <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>
    

    新菜单如下:

    <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>
    

    但是,我想使用 <enumerate> <choice> 从原始菜单重新打印而不是长文本的行为(太长并导致错误)。

    问题是:在第二种提示样式中有没有一种方法可以使用第一种提示样式?我能把它放在田里吗?我该怎么做?

    1 回复  |  直到 14 年前
        1
  •  0
  •   Jim Rush    14 年前

    选项元素特定于菜单。虽然可以在一般提示中使用enumerate,但在第一个示例中,它将提示与允许的输入绑定在一起。对于字段,您将从定义的语法中获取可用的输入。

    在后一点上,您的代码片段没有提到语法,字段也没有指明类型。VoiceXML文档中的语法是在更高级别定义的还是内置语法?如果没有,这可能是你的错误的根源。

    可以对菜单和选项使用语音识别,但使用枚举定义选择的方式:

    这是VoiceXML 2.0规范中修改过的示例:

    <menu>
      <choice dtmf="1" next="http://www.sports.example.com/vxml/start.vxml">
        <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">
       <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">
       <grammar src="astronews.grxml" type="application/srgs+xml"/>
       press 3 or say Stargazer astrophysics for ?
      </choice>
    </menu>
    

    如果将提示放入ECMAScript数组中,也可以使用枚举。

    一般来说,我建议采用现场方法。您在提供丰富的提示和错误处理方面获得了更多的灵活性。菜单/选项是一种快捷机制,用于简单、有限的情况。

    推荐文章