Обработка записи VXML dtmf termchar

У меня возникли проблемы с обработкой DTMF в теге записи.

Я хочу определить ноль, введенный во время записи, и выполнить определенное действие на основе значения. ноль можно было ввести в любое время до или после разговора.

В следующем фрагменте я вижу, что когда я ввожу ноль, приложение закрывается. Похоже, тег блока достигнут, но затем обработка прекращается. Я не уверен, в чем проблема. Или есть лучший способ добиться того же?

Я также сослался на ответ здесь: VoiceXML - распознавать DTMF в записи, но нужно больше деталей .

<form id="recordMessage">
<property name="termchar" value="" />
<property name="inputmodes" value="dtmf" />

<var name="lastdtmfchar" expr="1"/>

<record name="recording"  beep="true" maxtime="120s"  dtmfterm="false" type="audio/wav">
  <grammar mode="dtmf" version="1.0" root="dtmfSettings" xmlns="http://www.w3.org/2001/06/grammar">
     <rule id="dtmfSettings" >
        <one-of>
           <item>0</item>
           <item>#</item>               
        </one-of>
     </rule>
  </grammar>
    <filled>
    <assign name="lastdtmfchar" expr="recording$.termchar"/>        
    <if cond = "recording$.termchar == '#'">
    <prompt> Hash entered
    </prompt>           
    </if>
    <if cond = "recording$.termchar == '0'">
        <prompt> zero entered
    </prompt>
    </if>
    </filled>       
</record>   
<block>
    <if cond = "lastdtmfchar == '1'">   
    <prompt>  block value not assigned
    </prompt>
    </if>   
    <if cond = "lastdtmfchar == '#'">
        <prompt> block hash entered
    </prompt>           
    </if>
    <if cond = "lastdtmfchar == '0'">
        <prompt> block zero entered
    </prompt>
            </if>
</block> 

В форме есть только этот тег записи, но в корневом документе есть все обработчики.

<vxml .....>
<catch event="connection.disconnect.hangup">
    <goto next="${hangupUrl}?cause=hangup" />
</catch>
<catch event="connection.disconnect">
    <goto next="${hangupUrl}?cause=disconnect" />
</catch>
<catch event="error">
    <prompt>
        <audio src="${goodbyeUrl">
        </audio>
    </prompt>
    <exit/>
</catch>
<catch event="*">
    <prompt>
        <audio src="${goodbyeUrl">
        </audio>
    </prompt>
    <exit/>
</catch>
<property name="termchar" value="#"/>
<link dtmf="0" next="${globalHandlerUrl}">  
</link>
</vxml>

person jeera    schedule 01.08.2013    source источник
comment
На какой платформе IVR вы это используете? Не все они ведут себя одинаково. Я не думаю, что настройка termchar на допустима, и я не уверен, как платформа будет вести себя с этой настройкой. Чтобы подобрать завершающий символ, вам нужно установить для dtmfterm значение true. В противном случае он должен продолжить запись и записать ввод DTMF. Мне нужно будет увидеть полный документ vxml (а не только блок записей), чтобы ответить, почему приложение завершает работу при нажатии нуля.   -  person Kevin Junghans    schedule 01.08.2013
comment
Я добавил корневой документ. Возможно, запись $.termchar не получает символ dtmf, поскольку dtmfterm=false, но как я могу получить символ, соответствующий грамматике? Может быть, есть простой ответ.   -  person jeera    schedule 01.08.2013
comment
Да, термчар не работал. lastresult$.utterance получил «0» или «#».   -  person jeera    schedule 02.08.2013


Ответы (1)


Как вы упомянули, причиной может быть dtmfterm = false. Вы можете получить соответствующий символ грамматики, обратившись к application.lastresult$. См. http://www.w3.org/TR/voicexml20/#dml2.3.6 Согласен с @kevin, что в IVR многое зависит от самого поставщика (использование грамматики в записи само по себе необязательно в спецификации)

person Anupam    schedule 05.09.2013