如何使用Twilio AMD留语音留言?现有配置无法生效问题咨询
问题根因
asyncAmdStatusCallback是仅做状态通知的回调接口,Twilio不会将该接口返回的TwiML应用到正在进行的呼叫中,你在回调中写的response.Say指令完全不会被执行,这是无法留下语音留言的核心原因。- 你在发起外呼时直接指定了固定TwiML,呼叫接通后Twilio会立刻执行
<Say>Ahoy there!</Say>,执行完成后如果没有后续指令会直接挂断呼叫,等到AMD检测结果返回触发回调时,呼叫大概率已经结束,自然无法插入留言内容。
相关疑问解答
你提到的返回response.Say的方式仅在接管呼叫流程的webhook中生效,在asyncAmd的状态通知回调中使用无法实现需求,调整配置后可正常实现目标逻辑。
可行实现方案
你可以根据需求选择以下任意一种方案调整:
方案一:改用同步AMD逻辑(推荐)
去掉asyncAmd相关配置,改为使用同步AMD,外呼时指定呼叫流程回调地址,在回调中根据AMD结果返回对应TwiML即可。
外呼代码调整示例:
var accountSid = configuration["accountSid"]; var authToken = configuration["authToken"]; TwilioClient.Init(accountSid, authToken); var call = CallResource.Create( machineDetection: "DetectMessageEnd", // 去掉asyncAmd相关参数,指定初始呼叫流程回调地址 url: new Uri("[URL]/callback/init"), method: HttpMethod.Post, from: new Twilio.Types.PhoneNumber(configuration["fromPhoneNumber"]), to: new Twilio.Types.PhoneNumber(configuration["toPhoneNumber"]) );
对应的回调代码示例:
[ApiController] [Route("callback")] public class CallbackController : TwilioController { [HttpPost] [Route("init")] public IActionResult Init() { var response = new VoiceResponse(); if (Request.Form.TryGetValue("AnsweredBy", out var answeredBy)) { if (answeredBy == "human") { // 人类接听播放预设内容 response.Say("Ahoy there!"); } else { // 非人类接听播放留言 response.Say("this is the voice message"); } } return Content(response.ToString(), "text/xml"); } }
方案二:保留asyncAmd,主动更新呼叫流程
如果必须使用异步AMD,需要在回调中调用Twilio API主动更新当前正在进行的呼叫的TwiML,注入留言内容。
回调代码调整示例:
[ApiController] [Route("callback")] public class CallbackController : TwilioController { [HttpPost] [Route("index")] public IActionResult Index() { // 从回调参数中获取呼叫ID和AMD检测结果 if (Request.Form.TryGetValue("CallSid", out var callSid) && Request.Form.TryGetValue("AnsweredBy", out var answeredBy) && answeredBy != "human") { // 主动更新呼叫的TwiML,插入留言内容 CallResource.Update( pathSid: callSid, twiml: new Twilio.Types.Twiml("<Response><Say>this is the voice message</Say></Response>") ); } // 状态通知回调的返回内容不会被Twilio执行,直接返回成功即可 return Ok(); } }
注意该方案需要保证AMD检测完成时呼叫还未挂断,你可以给初始外呼的TwiML增加等待逻辑,避免初始内容播放完成后呼叫提前挂断。
内容的提问来源于stack exchange,提问作者Michael McCarthy
相关产品推荐
相关产品推荐

