您所描述的 Stream 工作但 Gather 不工作的行为是您正在使用的 Twiml 的设计所致。 Twilio 按顺序处理 Twiml,直到“动词”完成后才继续处理。 Twiml 中的动词是“连接”和“聚集”。直播后您可以看到 Gather twiml:
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Connect>
<Stream url="wss://..."/>
</Connect>
<Gather speechTimeout="auto" speechModel="phone_call" enhanced="true" input="speech" action="/respond"/>
</Response>
另一种方法是仅使用 Gather Twiml,然后使用 Twilio REST API 来处理 Media Streams:
string accountSid = Environment.GetEnvironmentVariable("TWILIO_ACCOUNT_SID");
string authToken = Environment.GetEnvironmentVariable("TWILIO_AUTH_TOKEN");
TwilioClient.Init(accountSid, authToken);
var stream = StreamResource.Create(
url: new Uri("wss://example.com/"),
pathCallSid: "CAXXXXXXXXXXXXXXXXXXXXXXXXXXX"
);
您的应用程序需要从处于“收集”模式的调用中获取 pathCallSid,然后使用 Twilio REST API 启动该调用的媒体流。这种方法的一个问题是,Gather 似乎最适合通话的一小部分。
解决您提出的另一个问题:
完全通过流来完成吗?
我在获取 StreamId、ConnectionId、CallId 时遇到问题 一个地方。
创建流时查看状态回调参数:
statusCallback 属性采用绝对或相对 URL 作为 价值。每当流启动或停止时,Twilio 都会生成一个 请求此网址
例如:
<Stream url="wss://..." statusCallback="http://yourapi.com..." />
发送到 statusCallback url 的参数包含 StreamSid 和 CallSid。