把 Twilio Elastic SIP Trunking 接入 OpenAI Realtime API 只要搞定 Project ID 和 TLS 端口就能通
想在 OpenAI 的 Realtime API 里接真实电话,最稳的方案就是用 Twilio 的 Elastic SIP Trunking。简单来说,就是把 Twilio 当成一个语音网关,把打进来的电话通过 SIP 协议转发给 OpenAI。核心步骤只有三步:给 Twilio 绑定号码、配置 Origination URI 指向 OpenAI、并在 OpenAI 侧订阅 incoming 事件。
如何配置 Twilio 端的 SIP 转发
在 Twilio 控制台配置 Elastic SIP Trunking 时,最关键的是把呼叫指向 OpenAI 的服务器。
一、首先把你的 Twilio 电话号码分配到对应的 SIP trunk 中。
二、设置 Trunk 的 Origination URI。这里必须严格遵守这个格式,否则 OpenAI 认不出是谁在调用:
sip:<OPENAI_PROJECT_ID>@sip.api.openai.com;transport=tls
注意,这里的 <OPENAI_PROJECT_ID> 必须替换成你实际的 OpenAI 项目 ID,而且这个 ID 必须和你配置 Webhook 的项目完全一致。
三、传输协议必须选择 TLS,端口号固定用 5061。如果用了 UDP 或 TCP 很容易在握手阶段就挂掉。
四、在 OpenAI 的 Webhook 配置界面,记得订阅 realtime.call.incoming 这个事件,这样电话打进来时,OpenAI 才会给你发通知。
没收到 Webhook 事件怎么排查
如果电话打进来但你的服务器没收到事件,别对着代码死磕,先去看 Twilio 的 Call Logs 和 SIP 响应码。只要看到 4xx 或 5xx 错误,基本就出在以下这几个点:
- URI 格式错误: 检查发往 OpenAI 的 Request-URI 里是否真的带了 Project ID。你可以抓包看一眼 outbound SIP INVITE 的第一行,正常的应该是:
INVITE sip:<OPENAI_PROJECT_ID>@sip.api.openai.com SIP/2.0
- TLS 握手失败: 检查端口 5061 是否畅通,TLS 配置是否有误。
- 项目 ID 错位: 检查 Twilio 填的 ID 和 Webhook 所在的项目是不是同一个。
怎么正确接听这个电话
收到 realtime.call.incoming 事件后,你不能直接开始对话,必须先显式地接听这个呼叫。
调用 OpenAI 的这个接口:
POST /v1/realtime/calls/{call_id}/accept
记得把 {call_id} 替换成事件里传过来的 ID。如果你在这个环节卡住了或者没调用,OpenAI 最终会自动拒绝或终止这个通话。
处理 Request-URI 被篡改的问题
在实际操作中,有些 Twilio 的配置会导致 Request-URI 的用户部分(即 Project ID 那块)被替换成了被叫方的 E.164 电话号码。如果发生了这种情况,OpenAI 无法识别项目 ID,通话会直接失败。
解决办法有两种:
1. 弃用直接的 Trunk 转发,改用 TwiML 的 <Sip> 标签来指定目的地。
2. 在 Twilio 和 OpenAI 之间加一层 SBC(会话边界控制器),强制在转发时保留 OpenAI 的 Project ID。
全部回复 (3)
想当场把话说完?进全球 AI 聊天室,登录就能开口。

配置 Origination URI 时千万别漏了那个 TLS 端口,我上次因为没写端口号死活调不通,折腾了一整晚才发现是这破事。