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

如何使用Twilio AMD留语音留言?现有配置无法生效问题咨询

问题根因

  1. asyncAmdStatusCallback是仅做状态通知的回调接口,Twilio不会将该接口返回的TwiML应用到正在进行的呼叫中,你在回调中写的response.Say指令完全不会被执行,这是无法留下语音留言的核心原因。
  2. 你在发起外呼时直接指定了固定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:15:07