
本文介绍如何利用 twilio 的 answering machine detection(amd)功能,在 javascript 外呼场景中准确区分被对方挂断、无人接听、转至语音信箱或由真人应答等状态,解决标准事件无法捕获被叫方主动拒接的问题。
本文介绍如何利用 twilio 的 answering machine detection(amd)功能,在 javascript 外呼场景中准确区分被对方挂断、无人接听、转至语音信箱或由真人应答等状态,解决标准事件无法捕获被叫方主动拒接的问题。
在 Twilio Voice SDK 的 JavaScript 应用中,开发者常遇到一个关键限制:外呼(outgoing)通话无法通过 reject 或 cancel 等事件直接感知被叫方主动挂断或直接转入语音信箱的行为——因为这些事件仅适用于 接收方(即 IncomingConnection),而外呼连接一旦建立(即使对方未实际接听),Twilio 会持续维持呼叫通道,直至超时或被主叫主动终止。
真正可行的解决方案是启用 Answering Machine Detection(AMD)。它并非监听客户端事件,而是由 Twilio 在服务器侧对通话音频流进行实时分析,在接通后数秒内智能判断应答类型,并通过 <dial></dial> 动作的 action URL 或外呼 API 的 StatusCallback 返回结构化结果,从而实现对“被拒接→转语音信箱”这一典型路径的可靠识别。
✅ 正确配置 AMD 外呼请求(Node.js 示例)
const accountSid = process.env.TWILIO_ACCOUNT_SID;
const authToken = process.env.TWILIO_AUTH_TOKEN;
const client = require('twilio')(accountSid, authToken);
client.calls
.create({
to: '+1562300000', // 被叫号码
from: '+18180000000', // 主叫号码(已验证)
url: 'https://your-domain.com/twiml/voicemail-handler', // TwiML 指令URL
machineDetection: 'Enable', // 启用 AMD(必需)
statusCallback: 'https://your-domain.com/webhook/call-status', // 接收状态回调
statusCallbackEvent: ['initiated', 'ringing', 'answered', 'completed'], // 建议包含 answered
statusCallbackMethod: 'POST'
})
.then(call => console.log('Call initiated:', call.sid))
.catch(err => console.error('Call failed:', err));? AMD 判定结果说明(关键字段)
当 AMD 完成检测后,Twilio 会向 statusCallback URL 发送 POST 请求,其中包含 AnsweredBy 字段,其值可能为:
| 值 | 含义 | 场景说明 |
|---|---|---|
human |
真人接听 | 对方手动接听并说话 |
machine |
语音信箱/自动应答机 | 包括被叫方挂断后自动跳转、未接通直接进留言系统、或预设的语音信箱提示音 |
fax |
传真机 | 极少见,可忽略 |
unknown |
未识别 | 音频质量差或超时,需重试或降级处理 |
⚠️ 注意:
machine是识别“被拒接→转语音信箱”的核心标志。它不等于“对方按了拒接键”,但在绝大多数移动运营商场景下,主动拒接后立即触发语音信箱播放,AMD 将稳定返回machine。这是目前 Twilio 官方推荐且最可靠的间接判定方式。
? 关键注意事项
-
AMD 不是实时事件,而是异步判定:需依赖
statusCallback接收结果,而非前端 SDK 事件; -
必须配合 TwiML 使用:
url参数指向的 TwiML 必须包含<dial></dial>,且建议设置action属性以捕获<dial></dial>结束后的结果; - 免费额度与计费:AMD 功能按分钟计费(额外费用),请查阅最新定价文档;
-
延迟与准确性权衡:可通过
machineDetectionTimeout(默认30s)和machineDetectionSpeechThreshold等参数微调,但过度缩短可能降低准确率; -
iOS 限制提醒:若被叫为 iOS 设备,系统级“静音未知来电”或“阻止未知来电”策略可能导致直接转语音信箱,此时 AMD 仍可正确识别为
machine。
✅ 最佳实践建议
- 在
statusCallback接口里解析AnsweredBy,区分human/machine后触发不同业务逻辑(如:真人接通→播放语音;机器应答→播放定制留言或结束); - 对
unknown结果做降级处理(例如:等待 5 秒后重播简短问候语,再判断); - 前端 SDK 可监听
connection.disconnect()作为辅助信号,但不可单独依赖——它仅反映本地连接终止,无法区分是对方挂断还是网络中断。
通过合理配置 AMD 并结合服务端状态回调,即可稳健实现“外呼被拒接并转入语音信箱”的全流程识别与响应,显著提升通话自动化与用户体验。

















