You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Twilio Voice SDK检测外呼被拒接并转语音信箱?

解决Twilio Voice JS SDK外呼转语音信箱的状态捕获问题

核心原因

被叫拒接后转语音信箱时,Twilio会将呼叫标记为已接通(语音信箱属于自动应答的机器终端),因此SDK原生的reject、cancel事件不会触发。需要通过Twilio的机器检测功能+呼叫状态回调来识别这类场景。

具体解决方案

1. 启用机器检测并配置状态回调

发起外呼时必须开启机器检测,同时指定statusCallback接收呼叫全生命周期的状态通知:

  • 若用TwiML发起呼叫,在<Dial>标签中添加参数:
<Dial machineDetection="Enable" statusCallback="/your-webhook-url" statusCallbackEvent="initiated ringing answered completed">
  <Number>+1234567890</Number>
</Dial>
  • 若用REST API发起呼叫(以Node.js为例):
const client = require('twilio')(yourAccountSid, yourAuthToken);
client.calls.create({
  url: 'https://your-server.com/twiml-endpoint',
  to: '+1234567890',
  from: '+0987654321',
  machineDetection: 'Enable',
  statusCallback: 'https://your-server.com/call-status-webhook',
  statusCallbackEvent: ['initiated', 'ringing', 'answered', 'completed']
});

2. 在Webhook中识别语音信箱场景

Twilio会向statusCallback地址发送POST请求,关键识别字段:

  • AnsweredBy:取值为machine(机器应答,含语音信箱)、human(真人应答)或空(未检测到)
  • CallStatus:转语音信箱后最终会变为completed

在后端Webhook逻辑中,判断AnsweredBy === 'machine'即可标记为转语音信箱场景,之后可通过WebSocket或接口同步状态到前端。

3. 前端SDK配合处理

前端监听Call对象的disconnect事件,在呼叫结束后从后端获取识别结果:

const call = device.connect({ params: { To: '+1234567890' } });

call.on('disconnect', () => {
  fetch(`/api/call-status/${call.parameters.CallSid}`)
    .then(res => res.json())
    .then(data => {
      if (data.answeredBy === 'machine') {
        console.log('呼叫已转至语音信箱');
        // 执行你的业务逻辑
      }
    });
});

注意事项

  • 机器检测功能需额外付费,具体参考Twilio定价规则
  • AnsweredBy的检测结果并非100%精准,部分特殊语音信箱可能无法被识别
  • 确保statusCallback地址可被Twilio公网访问(本地开发可使用ngrok等内网穿透工具)

内容的提问来源于stack exchange,提问作者Sobyt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:43:16