我在记录标记中处理dtmf时遇到问题。
我希望识别录制过程中输入的零点,并根据值执行特定操作。在讲话之前或之后的任何时间都可以输入零。
使用以下代码段,我看到当我输入零时,应用程序退出。它看起来像是块标记,但随后处理终止。我不知道这里有什么问题。或者有更好的方法来实现同样的目标吗?
我在这里也提到了答案:VoiceXML - Recognize DTMF in Recording,但需要更多细节。
<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>
答案 0 :(得分:0)
如你所述,dtmfterm = false可能是原因。 您可以通过访问application.lastresult $来获得语法匹配的字符。参考http://www.w3.org/TR/voicexml20/#dml2.3.6 同意@kevin在IVR中,很多东西都依赖于供应商本身(在记录中使用语法本身是可选的)