0

给定客户端代码,可以像这样进行拨出电话:

var accountSid = configuration["accountSid"];
        var authToken = configuration["authToken"];

        TwilioClient.Init(accountSid, authToken);

        var call = CallResource.Create(
            machineDetection: "DetectMessageEnd",
            asyncAmd: "true",
            asyncAmdStatusCallback: new Uri("[URL]/callback/index"),
            asyncAmdStatusCallbackMethod: HttpMethod.Post,
            twiml: new Twilio.Types.Twiml("<Response><Say>Ahoy there!</Say></Response>"),
            from: new Twilio.Types.PhoneNumber(configuration["fromPhoneNumber"]),
            to: new Twilio.Types.PhoneNumber(configuration["toPhoneNumber"])
        );

aka,启用了 asyncAmd 并指定了回调 URL,我的 webhook 控制器操作如下所示:

[ApiController]
[Route("callback")]
public class CallbackController : TwilioController
{
    [HttpPost]
    [Route("index")]
    public IActionResult Index()
    {
        var response = new VoiceResponse();

        if (Request.Form.TryGetValue("AnsweredBy", out var answeredBy))
        {
            if (answeredBy != "human")
            {
                response.Say("this is the voice message");
            }
        }

        return Content(response.ToString(), "text/xml");
    }
}

为什么没有留下语音邮件?

注意:我包括我想在CallResource.Createb/c 中说的 Twiml,我不希望在有人回答的情况下通过回调来获取消息内容。

我只需要对 AMD 检测的结果进行回调,然后留下语音信息。

我会用 response.say 来做吗?

谢谢!

4

2 回答 2

1

Twilio 开发人员布道者在这里。

Twilio 应答机检测可以在同步或异步模式下进行。从这篇博文

在 Twilio 上使用 Async AMD,AMD 是异步完成的(因此得名)。接听电话后,会立即执行呼叫 url,因此如果有人接听电话而不是语音邮件,他们可以开始与您的应用程序进行交互,而无需任何静音。然后“异步”或“并行”,AMD 处理呼叫音频并确定接听电话的人。AMD 处理完成后,将结果(AnsweredBy参数)发送到第二个 URL,即asyncAmdStatusCallback.

标准 AMD 和异步 AMD 之间的一个关键区别是在收到 AMD 结果后如何修改调用。使用标准 AMD,您有一个 URL,结果将像任何其他出站 API 调用一样发送到该 URL。当您的 URL 收到结果时,您可以检查AnsweredBy参数并使用 TwiML相应地更新调用。使用 Async AMD,您的调用已经在执行 TwiML,您需要通过 API更新调用。

在您的情况下,您使用的是异步 AMD,但您没有通过 API 更新调用。

你有两个选择。您可以选择使用同步 AMD,然后您可以使用 TwiML 响应结果,就像您目前所做的那样。

或者,您可以继续使用异步 AMD,但不要使用 TwiML 响应 webhook,而是使用 REST API 使用新的 TwiML 或新的 webhook URL 更新调用

我也会注意一件事。您的初始 TwiML 非常短,您的示例代码显示它发送<Response><Say>Ahoy there!</Say></Response>. 此 TwiML 完全有可能在检测到应答机之前完成,并且由于它是呼叫的唯一 TwiML,因此呼叫将挂断。您可能需要考虑使用更长的消息或暂停,以便获得 AMD 的结果。

于 2021-11-08T23:38:23.093 回答
0

想我会在这里跟进。感谢@philnash 的帮助。你确实是对的

  • 我从 asyncAMD webhook 返回 Twiml 而不是更新调用。
  • 我在发起呼叫时非常短的 Twiml 不够长

我完成了第一部分,即使 Twiml 更长,事情仍然失败:

<Response><Say>Hello there. This is a longer message that will be about as long as the real message asking you to confirm or cancel your appointment. Hopefully it's long enough!</Say></Response>

但是,那不够长!当调用 asyncAMD 回调并且我尝试使用CallResource.Update时,调用已经结束。

我最终将大约 2,000 个 lorem ipsum 字符转储到传出呼叫 Twiml 中,并且使用的 asyncAMD 回调运行良好CallResource.Update

于 2021-11-10T02:47:19.480 回答