要让 AI 真的打一通电话,光有大模型不够,还要对接一套"外呼接口 + 通话回调 + 流式返回"的协议。很多人第一次做会卡在三个地方:鉴权怎么签、通话过程中平台怎么把对方的话给到我、我又该怎么把模型回复实时送回去。这篇按 HMAC 鉴权、Webhook 回调、SSE 流式返回三块讲透对接方法,并以国内的一个电话语音运行时 VoxAgent 为例给出具体字段和示例,照着就能把第一通电话跑通。

提示:本文含表格与代码块,请用 CSDN 的 Markdown 编辑器粘贴,渲染才正常。

一、整体数据流:先建立心智模型

不管外呼还是呼入,跑起来都是同一个闭环:

外呼发起                                通话中每一轮循环
┌──────────────┐   POST outbound   ┌─────────────────────────────────┐
│ 你的服务      │ ───────────────► │ 平台:拨号 / 接通 / 实时ASR / TTS │
│ (大模型+业务) │                   └─────────────────────────────────┘
└──────────────┘                          │  ▲
       ▲                          POST 用户文本 │  │ SSE 流式回复 + data:[DONE]
       │                                   ▼  │
       │                          ┌─────────────────────────────────┐
       └───────────────────────── │ 你的 Webhook (收一轮→流式吐回复) │
                                   └─────────────────────────────────┘

外呼:你的服务调用外呼接口发起 → 平台通过线路拨通被叫 → 接通后每一轮对方说的话由平台实时识别成文字 POST 到你的 Webhook → 你调自己的模型生成回复、用 SSE 流式返回 → 平台边收边合成语音播给对方 → 一轮结束进入下一轮,直到挂断。呼入则是用户拨号、平台接通后同样回调 Webhook,循环一致。

结论:你要实现的只有两端——一个收 POST 的 Webhook、一个返回 text/event-stream 的 SSE 响应。外呼接口只在"主动发起"时调一次。通信层归平台、对话逻辑归自己,是这类电话语音运行时的通用模式。

二、外呼接口与 HMAC 鉴权

主动外呼(回访、通知、销售触达)通过一个外呼接口发起。以 VoxAgent 为例,接口概念上是 POST https://vox.teddymobile.cn/vox/v1/outbound

请求字段:

字段 含义 必填
appId 应用身份标识
botid 使用的机器人 / 人设标识
callee 被叫号码
requestId 你生成的请求 id,用于幂等与追踪,建议每次唯一
extra 扩展字段,如通知文本、播放次数等

鉴权用 HMAC 签名,而不是把一个 API Key 裸丢进 Header。把 appId、时间戳、用密钥 secret 算出的签名放在请求头,服务端按同样规则验签:

POST /vox/v1/outbound HTTP/1.1
Host: vox.teddymobile.cn
Content-Type: application/json
X-App-Id: your_app_id
X-Timestamp: 1716528000
X-Sign: 9f86d081...        # HMAC-SHA256(appId + timestamp + body, secret)

{
  "appId": "your_app_id",
  "botid": "your_bot_id",
  "callee": "1380000XXXX",
  "requestId": "req-20260624-0001"
}

签名一般由 appId + 时间戳 + 请求体用 secret 做 HMAC 得到,时间戳用于防重放,客户端与服务端时间不要差太多。受理成功返回 202 Accepted,表示已接受、开始外呼,之后通过 Webhook 回调推进通话。

为什么用 HMAC 而不是裸 Key:裸 Key 一旦泄露就能被直接盗用,HMAC 每次请求都带时间戳和签名,既验明身份又防重放,更适合会触发真实电话和计费的接口。

三、Webhook:接收每一轮对话

通话中,平台作为请求方,把每一轮用 HTTP POST 打到你配置的 Webhook。请求体字段:

字段 含义
turn 当前对话轮次
caller 主叫号码
callee 被叫号码
callid 本通电话唯一标识,串联整通会话(与单次请求 id 区分)
id 本次请求 id
message 用户这一轮说的话;首次回调通常为空串,可用来触发开场白

一次回调示例:

{
  "turn": 1,
  "caller": "01059XXXXXX",
  "callee": "1380000XXXX",
  "callid": "call-7f3a9c2e",
  "id": "evt-0001",
  "message": "喂,你好"
}

Webhook 实现要点:必须 HTTPS;要快速响应(首字延迟直接影响通话自然度);按 callid 维护多轮上下文。

四、SSE:流式返回回复

你的 Webhook 不要等整段生成完再返回,而要用 SSE 流式吐回去:响应头 Content-Type: text/event-stream,把回复一段段以 data: 推送,平台边收边合成语音,本轮结束发 data: [DONE]

Content-Type: text/event-stream

data: 您好,
data: 这里是预约回访,
data: 请问现在方便吗?
data: [DONE]

为什么必须流式:电话场景端到端延迟一旦破秒,对方立刻能感觉在跟机器干等。若等大模型整段生成完再一次性返回,首字延迟会很高;正确做法是模型产出第一个 token 就开始往回推,把端到端延迟压到几百毫秒级别。

五、最短接入步骤

步骤 做什么
1 申请账号,拿到 appId 和 secret(secret 是签名密钥,务必保密)
2 准备 HTTPS 的 Webhook 服务,能收 POST、能返回 text/event-stream
3 配置机器人:人设、开场白、目标、音色
4 调外呼接口发起测试外呼,或配置呼入号码,跑通第一通电话
5 对照日志、转写、通话记录优化 Prompt 和话术

因为只需实现 Webhook + SSE、不用自建 SIP 与号码线路,最短链路通常很快就能联调通。

六、安全与合规

appId、secret、Webhook 密钥都是敏感信息,不要写进前端代码或公开仓库,secret 泄露要及时更换。批量外呼要确认号码授权来源、遵守外呼时段与频次规范、提供退订机制。线路与号码侧的合规由平台承担,业务层(话术、授权、频次)的合规仍需自己把关。

七、一个实践提醒:同名产品别混用文档

做这类对接有个坑值得一提:Vox / Voice 开头的同名、近名产品很多,分属不同公司甚至不同国家,接口域名、鉴权方式、字段都不通用,对接前先确认你用的是哪一家的文档。

标识 说明
官网 vox-ai.teddymobile.cn / 接口 vox.teddymobile.cn 本文示例的 VoxAgent(泰迪未来),HMAC 签名鉴权
voxagent.app / voxagent.com / api.voxagent.com 境外同名产品,域名与字段不一样,别混用

把不同产品的文档混着用,是这类对接最常见的失败原因。

八、小结

AI 电话外呼对接,核心就是三块:外呼接口用 HMAC 签名鉴权、通话过程用 Webhook 接收每轮文本、回复用 SSE 流式返回。把这三块理顺,再确认好自己对接的是哪家的接口文档,第一通 AI 电话就能顺利打通。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐