当大语言模型(LLM)从"打字聊天"走向"开口说话",智能体才真正具备了与人自然交互的能力。本文将从架构原理到代码实战,系统拆解如何基于 ZEGO 实时互动 AI Agent,为你的智能体赋予低延迟、可打断、高自然度的实时语音通话能力。
一、智能体语音通话难在哪
把智能体语音通话拆开,本质是三条数据管道同时在跑:
- 听(ASR) :用户的说话声被实时转成文字,喂给 LLM;
- 想(LLM) :大模型基于上下文生成回复;
- 说(TTS) :文字被转成语音,实时播给用户。
这三条管道不是串联的「说话→识别→思考→生成→朗读」这么简单,而是并行且要抢时间的。真正的难点在于,LLM 的生成速度远慢于真人说话速度,而人类又习惯在对方没说完时就插嘴。两个矛盾叠加,就引出语音智能体独有的四个技术问题:
- 延迟:用户说完一句,AI 多久能接上?人说话的等待耐心大概在 1 秒内,超过就觉得卡住了。文本时代可接受的几秒延迟,在语音里是致命的。
- 打断:用户插话时要能同时“听”和“说”——即全双工。用户的语音要能切断 AI 的输出,否则就是你一言我一语各说各的。
- 断句:什么时候算用户说完了,该轮到我回答了?不能等用户喘口气就抢话,也不能一直猜。
- 音质:回声、噪声、远场人声,任何一个都会毁掉 ASR 的准确率,进而让整场对话「你听错我说的话」。
这四点决定了语音智能体不是一个调用一下 ASR/TTS 接口的拼接活儿,而是一套需要专门调优的实时系统。下面用 ZEGO 的产品把它落地。
二、ZEGO 实时互动 AI Agent:把听想说三条管道合到一个房间
2.1 架构:一个 RTC 房间里的三方协作
ZEGO 的 AI Agent 最核心的一个设计是:用户、智能体、AI Agent 后台三方通过一个 RTC 房间连接,而不是像很多方案那样由你自建一条「ASR→LLM→TTS」的流水线。
┌──────────┐ 推"用户流" ┌──────────────────────┐
│ 真实用户 │ ─────────────────────▶ │ │
│ (客户端SDK)│ │ RTC 房间 │
│ │ ◀───────────────────── │ (RoomId) │
└──────────┘ 拉"智能体流" │ │
│ ┌──────────────────┐ │
│ │ AI Agent 后台 │ │
│ │ ASR → LLM → TTS │ │
│ │ 自动登录 / 推流 │ │
│ └──────────────────┘ │
└──────────────────────┘
智能体在后台看起来就是一个普通的 RTC 房间成员:它自动登录房间、推送自己的音频流(TTS 输出)、拉取用户的流(ASR 输入),并在后台完成识别、推理、合成。而你的业务后台只需要负责一件事:让这个智能体实例上线。用户侧的客户端也只需接入 ZEGO Express SDK 进房、拉流、推流。
对比自建方案的优势很直接:ASR 里的回声消除、打断检测、噪声抑制,这些活儿 ZEGO 都替你做了,你不需要在自己服务端再搓一遍音频处理。
2.2 完整业务流程
一次语音通话的完整链路是:
sequenceDiagram
participant 客户端
participant 业务后台
participant AI Agent 后台
业务后台->>AI Agent 后台: 注册智能体(定义人设/音色/LLM/TTS)
客户端->>业务后台: 通知开始通话
业务后台->>AI Agent 后台: 创建智能体实例(CreateAgentInstance)
AI Agent 后台->>AI Agent 后台: 自动登录房间并推流、拉用户流
AI Agent 后台-->>业务后台: 返回实例ID/流ID
业务后台-->>客户端: 返回实例ID/流ID
客户端->>业务后台: 获取RTC Token
客户端->>客户端: 初始化Express SDK,进房,推用户流
客户端->>客户端: 拉智能体流播放 (开始对话)
客户端->>业务后台: 通知停止通话
业务后台->>AI Agent 后台: 删除智能体实例
客户端->>客户端: 停止推流,退出房间
三、代码实现:跑通一次语音通话
下面以 服务端(NodeJS) + Web 客户端为例,把上面流程逐段落地。完整示例代码见 ZEGO 官方仓库Web端客户示例代码和快速实现语音通话。
步骤 1:注册智能体(定人设、选音色、接 LLM/TTS)
在创建实例之前,你得先定义“这个 AI 是谁”。注册接口里要配置三样东西,分别是:人设(system prompt)、LLM 提供商(OpenAI、通义千问、火山方舟、MiniMax 等)、TTS 提供商(火山引擎、阿里云 CosyVoice、MiniMax 等)。
这一步是纯配置,重点是 system prompt——它决定了这个 AI 的角色扮演效果。写法上要像给演员写剧本一样,给它身份、语气、行为边界,而不是干巴巴的“你是客服”。
// 注册智能体(仅一次), 请求接口: https://aigc-aiagent-api.zegotech.cn?Action=RegisterAgent
const body = {
AgentId: 'my_voice_agent',
Name: '语音客服小助手',
LLM: {
Url: 'https://ark.cn-beijing.volces.com/api/v3/chat/completions',
ApiKey: '<你的仓库Key>',
Model: 'doubao-1-5-pro-32k-250115',
SystemPrompt: '你是一位耐心友好的客服助手。回答要简洁口语化, 适合被转成语音播放, 避免使用括号、emoji 和表格。',
},
TTS: {
Vendor: 'ByteDance',
Params: {
app: { appid: '<你的appid>', token: '<你的token>', cluster: 'volcano_tts' },
audio: { voice_type: 'zh_female_wanwanxiaohe_moon_bigtts' },
},
},
};
步骤 2:客户端进房前,先用 RTC 房间把用户流推进去
用户侧要做的第一件事是拿到 RTC Token 并进房。Token 由业务后台基于 AppID 和 ServerSecret 生成(对应 ZEGO 的 Token04 机制),客户端在进房成功后要立即推用户流,因为你得让 AI 能听到你。
步骤 3:创建智能体实例(服务端)
这是整个流程的关键一步。客户端进房成功后,由业务后台调用 CreateAgentInstance,把用户、房间、智能体三者绑定:
async createAgentInstance(agentId, userId, rtcInfo, messages = []) {
const action = 'CreateAgentInstance';
const body = {
AgentId: agentId, // 步骤1注册的智能体ID
UserId: userId, // 与AI交互的真实用户ID
RTC: rtcInfo, // { RoomId, AgentStreamId, AgentUserId, UserStreamId }
MessageHistory: {
SyncMode: 1, // 0=从ZIM历史消息加载, 1=手动传入messages
Messages: messages, // 初始对话上下文
WindowSize: 10
}
};
const result = await this.sendRequest(action, body);
return result.AgentInstanceId; // 客户端保存, 用于后续删除实例
}
rtcInfo 里的四个字段是关键:RoomId 是用户已进的那个房间,AgentStreamId/AgentUserId 是这个实例自己推流用的标识,UserStreamId 告诉 AI 该拉哪条用户流。调用后,AI Agent 后台会自动登录房间、开始推自己的语音流、拉用户的流。这一步之后,AI 就上线了,你不需要再写任何推拉流逻辑。
注意到 MessageHistory 没有?这就是智能体记忆的接入点。你可以外置传入一段对话作为初始上下文,也可以把 SyncMode 设为 0,让它直接从 ZIM(即时通讯)的历史消息里加载——这样用户之前在 IM 里和 AI 聊过什么,语音通话里它都能接上茬。
步骤 4:客户端拉流,开始对话
客户端在创建实例后,监听流变化事件,拉到 AgentStreamId 这条流并播放。此时智能体已经在说话了,它会在你说话结束后自动接话。这一段的客户端代码就是标准的 ZEGO Express SDK 进房、推流、拉流、播放,和你自己接一个普通 RTC 房间一模一样。
步骤 5:挂断,删除智能体实例
通话结束时要做的不是客户端静音就完事,而是要删除智能体实例(DeleteAgentInstance),否则这个实例会一直占用房间和并发额度(ZEGO 默认一个账号同时最多 10 个智能体实例)。删除后客户端再停止推流、退出房间。
四、让对话像真人:高级能力
跑通基本流程只是及格线。下面是 ZEGO 提供、用来把体验从能说话拉到像真人的关键能力,也是语音 Agent 真正的工程分水岭。
自然语音打断(全双工)
别让 AI 自顾自说完一整段。ZEGO 支持自然语音打断,用户一开口,AI 就能识别到打断意图并立即停止输出。也支持手动打断(通过服务端 API 或按钮)。这正是全双工的核心:在 AI 说话时,用户的语音是有优先级的。
主动说话:AI 先开口(欢迎语/提醒)
不要等用户说第一句。通过主动调 LLM(模拟用户提问让模型先答)或主动调 TTS,可以实现基于上下文的欢迎语、定时提醒、主动播报。这对客服场景很重要——AI 要先说「您好,有什么可以帮您」,而不是干等着。
语音识别断句控制(延迟与准确率的平衡)
用户什么时候说完了是玄学。ZEGO 提供人声检测的断句阈值、停顿时长设置,你可以在响应延迟和断句准确率之间手动权衡:阈值设短了,AI 抢话;设长了,用户说完还得等半天才被识别。
状态回调与字幕
- 状态回调:接收服务端回调拿到「开始说话/结束说话」,或查询状态 API 拿到「空闲/聆听/思考/讲话」,用来驱动 UI(比如 AI 思考时显示打字动画)。
- 实时字幕:对话实时转写成文字展示,这是语音产品交互的基础体验。
其他
- ASR 热词:对角色名、专业术语等设置临时热词,显著提升识别准确率。
- 音色克隆:把人设音色克隆下来,实现和特定音色的人通话。
- 数字人:结合 ZEGO 数字人,一张照片就能给语音通话配上 1080P 的形象。
- 结合 RAG:外挂知识库,让 AI 基于公司信息、专业资料回答,而不是瞎编。
五、常见问题排查
接入过程中最常见的问题是"智能体不回答"或"能看到文字但听不到声音",排查思路:
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 智能体完全不响应 | LLM 配置错误 | 检查 LLM Url、ApiKey、Model 是否正确,参考服务端异常回调 |
| 能看到文字但无语音 | TTS 配置错误 | 检查 TTS Vendor、appid、token、voice_type 是否正确 |
| 延迟过高 | 网络/配置问题 | 确认使用 AI Agent 优化版 SDK,检查 scenario 设置,确认全流式 TTS 厂商 |
| 打断不灵敏 | 打断模式关闭 | 确认 InterruptMode: 0,检查麦克风权限和音频3A是否开启 |
| 智能体实例创建失败 | 超出实例上限 | 默认最多 10 个并发实例,联系商务调整 |
强烈建议在接入测试阶段配置服务端回调地址,监听 Event: Exception 事件,通过 Data.Code 和 Data.Message 快速定位问题。
六、总结
将智能体实现语音通话,本质上是构建一条 “语音进 → 理解 → 生成 → 语音出" 的实时管道。ZEGO AI Agent 通过以下设计让这条管道既快又稳:
- 全链路流式处理:ASR→LLM→TTS 流水线并行,端到端延迟 ≈1s;
- AI 级音频处理:AI 降噪、AI VAD、AI AEC 专为双讲和打断场景优化;
- 插件化架构:LLM/TTS/ASR 厂商自由切换,不锁定供应商;
- 极简接入:服务端 4 个 API(注册/创建实例/删除实例/打断)+ 客户端标准 RTC 推拉流;
- 全平台覆盖:Web / iOS / Android / Flutter 统一 SDK 体验。
从 AI 陪伴到智能客服,从车载助手到智能硬件,语音通话正在成为智能体的标配能力。基于 ZEGO AI Agent,你可以专注于智能体的人设和业务逻辑,把实时语音的"脏活累活"交给专业的 RTC+AI 基础设施。
下一步:前往ZEGO 控制台创建项目、开通 AI Agent 服务,参考官方示例代码在 30 分钟内跑通你的第一通智能体语音通话。




