如何在Voximplant中实现接收客户的DTMF信号(如分机号输入场景)
在Voximplant平台接收并处理DTMF信号的实现方法
核心逻辑
Voximplant通过Call对象的dtmfReceived事件捕获用户发送的DTMF信号,基于这个事件就能实现分机号输入、按键选择这类交互场景。
步骤1:绑定DTMF事件监听
通话建立完成后,给当前Call实例绑定dtmfReceived事件监听器,用户每按下一个按键,事件会返回对应的按键值(如"1"、"#"、"*")。
步骤2:分机号输入场景的具体处理
针对分机号输入需求,你需要做这些操作:
- 维护变量存储用户输入的按键序列
- 设置输入超时(比如5秒),用户超过时限未继续输入则判定输入完成
- 限制分机号最大长度(比如4位),达到长度后直接触发后续逻辑
- 输入完成后,根据收集到的分机号执行转接、提示等操作
完整代码示例
// 初始化变量 let extInput = ''; let inputTimer = null; const MAX_EXT_LENGTH = 4; const INPUT_TIMEOUT = 5000; // 5秒超时 // 通话振铃阶段触发 VoxEngine.addEventListener(AppEvents.CallAlerting, (e) => { const call = e.call; call.answer(); // 播放引导提示 call.say('请输入分机号,按井号结束'); // 监听DTMF信号 call.addEventListener(CallEvents.DTMFReceived, (dtmfEvent) => { const digit = dtmfEvent.digit; // 按#号直接结束输入 if (digit === '#') { clearTimeout(inputTimer); processExtension(extInput); return; } // 收集数字按键 if (!isNaN(parseInt(digit))) { extInput += digit; // 重置超时定时器 clearTimeout(inputTimer); inputTimer = setTimeout(() => { processExtension(extInput); }, INPUT_TIMEOUT); // 达到最大长度直接处理 if (extInput.length === MAX_EXT_LENGTH) { clearTimeout(inputTimer); processExtension(extInput); } } }); }); // 分机号处理逻辑 function processExtension(extension) { if (!extension) { // 空输入提示重试 VoxEngine.getCurrentCall().say('分机号不能为空,请重新输入'); extInput = ''; return; } // 根据分机号执行对应操作 switch (extension) { case '1001': VoxEngine.getCurrentCall().say('正在转接技术支持'); VoxEngine.callUser('tech_support', VoxEngine.getCurrentCall()); break; case '1002': VoxEngine.getCurrentCall().say('正在转接客服中心'); VoxEngine.callUser('customer_service', VoxEngine.getCurrentCall()); break; default: VoxEngine.getCurrentCall().say('您输入的分机号不存在,请重新输入'); extInput = ''; break; } }
额外注意点
- 可根据业务需求调整超时时间、分机号长度和转接逻辑
- 若需支持取消输入(比如按*号),可在DTMF事件中添加对应分支处理
- 处理完输入后记得重置变量和定时器,避免影响后续交互
内容的提问来源于stack exchange,提问作者Ksenia Cherkasova
相关产品推荐
相关产品推荐

