Twilio 弹性中继对接 OpenAI 实时 API 需配置项目 ID 与 TLS 端口
通过 Twilio Elastic SIP Trunking 将呼入电话转接至 OpenAI Realtime API,能把 Twilio 当作语音网关利用 SIP 协议传输。实现该流程需完成号码绑定、配置 Origination URI 以及订阅 incoming 事件。
在 Twilio 控制台设置 Elastic SIP Trunking 时,需将电话号码关联到 SIP trunk。Origination URI 的填写格式必须为 sip:<OPENAI_PROJECT_ID>@sip.api.openai.com;transport=tls,其中的 <OPENAI_PROJECT_ID> 必须替换为与 Webhook 配置一致的实际项目 ID。传输协议必须选 TLS 且端口设为 5061,使用 UDP 或 TCP 会导致握手失败。随后在 OpenAI Webhook 设置中勾选 realtime.call.incoming 事件。
如果服务器没收到事件,检查 Twilio Call Logs 中的 SIP 响应码。4xx 或 5xx 错误通常意味着:
- Request-URI 缺少正确的 Project ID,标准 outbound SIP INVITE 首行应为
INVITE sip:<OPENAI_PROJECT_ID>@sip.api.openai.com SIP/2.0。 - 5061 端口或 TLS 配置有问题。
- Twilio 填写的 ID 与 Webhook 项目不匹配。
其他细节要求:Webhook 必须在 OpenAI 项目层级设置且具备公网访问能力,需快速返回 2xx 响应。签名验证要用 raw request body。接听电话的 API Key 必须与项目归属一致。
收到 realtime.call.incoming 事件后,必须调用 POST /v1/realtime/calls/{call_id}/accept(将 {call_id} 替换为事件 ID)执行显式接听,否则 OpenAI 会挂断或拒接。
若 Twilio 将 Request-URI 中的 Project ID 替换成了 E.164 号码,OpenAI 将无法识别导致通话失败。此时可以改用 TwiML 的 <Sip> 标签指定目的地,或者在中间部署 SBC 强制保留 OpenAI 的 Project ID。
全部回复 (3)
想当场把话说完?进全球 AI 聊天室,登录就能开口。
订阅 incoming 事件时确实要快,响应慢了直接被掐断,我之前调试时就卡在这儿气得想摔键盘。不过后来发现问题出在 Origination URI 格式不严格,我一开始用的只是 sip:openai.com 之类的,结果 Twilio 发送的 SIP INVITE 首行就变成了 INVITE sip:1234567890@sip.api.openai.com(把 Project ID 替换成了电话号码),导致 OpenAI 完全识别不了项目。后来按照文档严格填写 sip:<OPENAI_PROJECT_ID>@sip.api.openai.com;transport=tls,并且确保 Project ID 与 Webhook 所在项目一致,才终于接通了。别再像我一样折腾半天了。
在配置 Twilio Elastic SIP Trunking 时,只依赖于 Project ID 显然不够,因为还需确保每个步骤的细节都严格匹配 OpenAI 的要求。首先,在 Twilio 控制台中为电话号码分配 SIP trunk,然后在 Trunk 的 Origination URI 中,严格按照指定格式填写:sip:<OPENAI_PROJECT_ID>@sip.api.openai.com;transport=tls,务必将 <OPENAI_PROJECT_ID> 替换为实际项目 ID,并确保与 Webhook 所属项目完全一致,否则呼叫将无法到达 OpenAI 服务端。此外,还要确保传输协议严格锁定为 TLS,端口固定为 5061,避免因 UDP 或 TCP 导致握手中断。最后,在 OpenAI Webhook 设置中勾选 realtime.call.incoming 事件,以便及时接收来电通知。

配置 Twilio 的 Elastic SIP Trunking 时,Origination URI 的 TLS 端口 5061 绝对不能随意省略,否则 SIP 握手阶段可能因协议不匹配而中断。我之前在调试时发现,即使 URI 格式正确,若忽略了固定端口,Twilio 的 SIP 请求会直接被 OpenAI 拒绝,导致呼叫无法转发到 Webhook。具体来说,在填写 Trunk 的 Origination URI 时,必须严格遵循标准格式:
而不仅仅是仅填写域名部分,确保
<OPENAI_PROJECT_ID>与 Webhook 所在的 OpenAI 项目 ID 完全一致,否则请求将无法被正确识别。此外,在 Twilio 侧配置时,还需要确保传输协议严格锁定为 TLS,端口固定为 5061,否则会导致呼叫在握手阶段失败。