
本文详解如何利用 twilio 的 answering machine detection(amd)功能,在 javascript 外呼场景中准确区分被叫方挂断、无人接听、语音信箱应答等状态,从而实现呼叫结果的精细化处理。
本文详解如何利用 twilio 的 answering machine detection(amd)功能,在 javascript 外呼场景中准确区分被叫方挂断、无人接听、语音信箱应答等状态,从而实现呼叫结果的精细化处理。
在 Twilio Voice SDK 的 JavaScript 应用中,开发者常遇到一个关键限制:外呼(outbound)通话无法直接监听“被叫方主动拒接”事件(如对方点击红色挂断按钮),因为该行为发生在终端设备侧,不触发 Twilio 信令层的标准化事件(如 reject 仅适用于 inbound call)。此时通话看似“仍在进行”,实则已被路由至语音信箱——而传统 connect/disconnect 事件无法反映这一语义变化。
解决此问题的核心方案是启用 Answering Machine Detection(AMD)。AMD 并非监听用户操作,而是通过分析通话建立后前几秒的音频特征(如静音时长、提示音模式、回声特性等),由 Twilio 后端实时判断应答主体类型,并在 <dial></dial> 动作完成时,将检测结果作为参数回调至你的 TwiML webhook URL。
✅ 正确配置 AMD 的关键步骤
-
发起外呼时启用 AMD
在调用client.calls.create()时,必须显式设置machineDetection: 'Enable'(注意大小写),并确保url指向能处理 AMD 结果的 TwiML 端点:
const accountSid = process.env.TWILIO_ACCOUNT_SID;
const authToken = process.env.TWILIO_AUTH_TOKEN;
const client = require('twilio')(accountSid, authToken);
client.calls.create({
machineDetection: 'Enable', // 必填:启用 AMD
url: 'https://your-domain.com/twiml-handler', // 接收 AMD 结果的 endpoint
to: '+1562300000',
from: '+18180000000',
timeout: 30 // 建议设置合理超时,避免长时间等待
})
.then(call => console.log('Call initiated:', call.sid))
.catch(err => console.error('Call failed:', err));
-
在 Webhook 中解析 AMD 结果
Twilio 将在通话应答后,向你的url发送 POST 请求,携带关键参数:-
AnsweredBy: 可能值为'human'、'machine'、'fax'或'unknown' -
MachineDetectionTimeout: 检测超时时间(秒) -
MachineDetectionSpeechThreshold: 语音阈值(调试用)
-
示例 Node.js Express 处理逻辑:
app.post('/twiml-handler', (req, res) => {
const answeredBy = req.body.AnsweredBy;
let twimlResponse = new twiml.VoiceResponse();
if (answeredBy === 'human') {
twimlResponse.say('Hello! A human answered.');
} else if (answeredBy === 'machine') {
twimlResponse.say('This appears to be an answering machine.');
// 可在此处播放定制语音留言,或触发后续业务逻辑(如标记为“转语音信箱”)
} else if (answeredBy === 'fax') {
twimlResponse.say('Fax machine detected.');
} else {
twimlResponse.say('Unable to determine answerer type.');
}
res.type('text/xml').send(twimlResponse.toString());
});
⚠️ 重要注意事项与最佳实践
- AMD 不是实时事件监听器:它依赖音频分析,需通话建立后约 3–10 秒完成判断,因此无法替代前端 UI 的即时反馈(如显示“对方已挂断”),但可作为服务端权威状态依据。
-
网络与语音质量影响准确性:弱信号、背景噪音或特殊语音信箱提示音可能导致误判。建议结合
MachineDetectionTimeout和SpeechThreshold参数微调。 - 费用与合规性:AMD 功能按分钟计费(含检测时段),且需遵守目标国家/地区的自动语音留言法规(如美国 TCPA 要求明确告知录音用途)。
-
替代方案局限性:单纯依赖
call.on('disconnected')无法区分“被叫挂断”和“网络中断”,而statusCallback中的completed状态亦不包含应答方类型信息——唯有 AMD 提供语义级分类。
综上,对于外呼场景中“被拒转语音信箱”的识别需求,Answering Machine Detection 是 Twilio 官方推荐且唯一可靠的解决方案。通过正确配置 machineDetection 参数并解析 Webhook 回调,你可精准驱动后续业务逻辑,例如自动发送短信摘要、更新 CRM 状态或触发人工坐席介入。










