你可能以为数字人直播是个"AI 团队 + 音视频团队"才能干的活。但真实情况是一个 Web 前端工程师用一套 SDK,当天就能跑通。
数字人直播门槛卡在哪?
让一个数字人开口直播,技术上要跨过几道坎?
- 把用户说的话听下来:实时语音识别(ASR);
- 让大模型想清楚说什么:LLM 推理;
- 把回答变成声音:语音合成(TTS);
- 让声音驱动一个虚拟形象开口、动表情:数字人驱动与唇形/表情同步;
- 把这套东西实时推给观众:RTC 推拉流。
那好,问题来了:这里头哪一步难?
大部分人第一反应是 AI 能力难。但你把这话扔给真正接过数字人直播的工程师,他会告诉你恰恰相反——现在的 ASR、TTS、LLM 单点能力都成熟到可以按 API 采购。真正把人卡死的,是第 5 步:当你要把 4 家供应商的能力缝成一条低延迟、不掉帧、能打断、唇音同步的实时链路时,工程量瞬间爆炸。
为什么?因为这不是算法问题,是工程问题。流格式怎么对齐?丢包了怎么重传?首帧能不能做到秒开?数字人嘴唇动了、声音没到,观众一眼就出戏。用户一句停,这 4 层链路怎么协作才算打断成功?
数字人直播的门槛,从来不在「AI」,而在这条管道。
而ZEGO 实时互动 AI Agent做的事,说白了就是把这条管道直接递到你手里——ASR、LLM、TTS、数字人驱动,一站式封装成一个智能体。
本文把这条可复现的路一步一步地分享给你。
一、先分清两种"数字人直播"
ZEGO 的接入方式,是按交互形态分的,不要弄混。
| 形态 | 典型场景 | 客户端行为 | 交互性 | 接入成本 |
|---|---|---|---|---|
| 数字人实时播报 | 数字人直播、口播、带货开场引导、新闻播报 | 只登录房间拉流观看,不推流 | 单向,可主动触发播报 | 最低 |
| 数字人视频通话/互动 | AI 互动、AI 客服、数字人老师 | 用户推流上麦,Agent 拉用户流 | 双向,可打断、LLM 实时回复 | 中 |
这两个形态在代码层面有本质区别,我先把最关键的一点摆出来:
- 播报场景:客户端不创建本地流,不调
startPublishingStream。 你只需要拿到服务端返回的agent_stream_id,登录房间拉流、播放,三步结束。
- 互动场景:客户端要推流。 用户的声音和画面推上去,数字人 Agent 在云端拉取,处理完再把回复推回来。
这里有个特别值得 Web 开发者高兴的事:数字人视频通话的互动场景在 iOS/Android 端需要额外集成数字人 SDK,做自定义渲染——把远端视频帧和 SEI 数据喂给数字人 SDK,由它驱动形象。但 Web 端不用。Web 端直接拿 ZEGO Express SDK 播放数字人视频流就行。也就是说同样一套互动能力,Web 的接入步骤反而最少。
二、整体架构:一条时序图看懂
在写代码前,先把这条链路的角色和顺序刻进脑子里。整个系统有三个部分:
- 客户端(Web):你的页面,负责登录房间、推拉流、播放。
- 业务后台:你自己的服务端。所有 ZEGO API 调用都在这里。
- ZEGO AI Agent 后台:云端真正跑数字人的地方。
特别强调:客户端不直接碰 ZEGO 的服务端 API,也不生成 Token。 它只跟你的业务后台说话。这是整个架构安全性的第一根钉子。
下面是数字人实时播报的完整时序:
sequenceDiagram
participant 客户端
participant 业务后台
participant AI Agent 后台
业务后台->>业务后台: 注册智能体(RegisterAgent)
业务后台->>AI Agent 后台: 注册智能体
AI Agent 后台-->>业务后台: 响应
客户端->>业务后台: 通知开始播报
业务后台->>AI Agent 后台: 创建播报数字人实例(CreateDigitalHumanAgentInstance)
AI Agent 后台->>AI Agent 后台: 数字人登录房间并推送数字人流
AI Agent 后台-->>业务后台: 返回数字人配置 + 流信息
业务后台-->>客户端: 数字人配置 + 流信息
客户端->>业务后台: 请求 Token
业务后台-->>客户端: Token
客户端->>客户端: 初始化 ZEGO Express SDK,登录房间
客户端->>客户端: 初始化数字人 SDK,设置配置(仅 iOS/Android)
客户端->>客户端: 拉取数字人流,播放(Web 直接播放)
客户端->>业务后台: 主动播报文本
业务后台->>AI Agent 后台: 调用主动播报能力(SendAgentInstanceTTS)
AI Agent 后台-->>客户端: 数字人开始播报
客户端->>业务后台: 通知停止播报
业务后台->>AI Agent 后台: 删除播报数字人实例
AI Agent 后台-->>业务后台: 响应
业务后台-->>客户端: 响应
客户端->>客户端: 停止拉流,退出房间
互动场景的时序几乎一样,差别在两点:创建的是数字人智能体实例,且客户端多了推流上麦这个动作,数字人在云端拉你的流。
现在开始动手。
三、Step 1:准备
1.1 开通控制台
到ZEGO 控制台注册账号,创建一个项目,记下两个东西:app_id 和 server_secret。
这两个值一个进客户端 SDK 初始化,一个只进服务端。server_secret 一旦出现在前端代码或 commit 里,等于把整个鉴权敞开了。
1.2 定一个数字人形象
数字人形象有几种定制路线,按需选:
| 数字人类型 | 素材要求 | 特点 |
|---|---|---|
| 图片数字人 | 1 张高质量真人照片 | 最快,当天可用 |
| 真人视频数字人 | 5–10 分钟绿幕拍摄视频 | 一比一复刻,神态动作表情媲美真人 |
| 自定义动作库 | 定制时生成 | 支持「比心」「打招呼」等特殊动作 |
这里有个玄机要提前说:视频数字人的最终效果 80% 取决于你拍的素材。 唇形、表情、妆造、灯光、绿幕,任何一个环节糊了,AI 训出来的形象就跟着糊。官方有专门的《视频数字人拍摄指南》,别嫌麻烦,第一次拍之前先照着看一遍。素材规格以《视频数字人素材规范》和《图片数字人素材规范》为准。
四、Step 2:服务端(业务后台)
2.1 注册智能体
业务后台先调注册智能体 RegisterAgent,把智能体的人设配好——你要接哪个 LLM、用什么音色、绑定哪个数字人形象。
2.2 创建实例
客户端点开始直播,请求你的接口,比如 /api/start-live-digital-human。你的业务后台收到后调 ZEGO 的CreateDigitalHumanAgentInstance(互动场景对应创建数字人智能体实例),AI Agent 后台随即让数字人登录房间并开始推流,然后返回三样东西:
agent_instance_id:这个实例的唯一标识agent_stream_id:数字人的视频流 ID,客户端靠它拉流digital_human_config:数字人配置(互动场景的 Web 端用不到,播报场景下不同端处理方式不同)
Web 端客户端请求你的后台,用 fetch 就行:
async function startLiveDigitalHuman(roomId: string) {
const response = await fetch(`${baseURL}/api/start-live-digital-human`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
digital_human_id: config.digitalHuman.id,
config_id: config.digitalHuman.configId,
room_id: roomId,
}),
});
const result = await response.json();
if (result.code !== 0) throw new Error(result.message);
return result; // 返回 agent_instance_id / agent_stream_id 等
}
注意这里的 digital_human_id就是你在 Step 1 里定制好的那个形象的 ID。config_id 是客户端配置标识。
2.3 生成 Token
Token 必须在服务端生成。 客户端每次要用的时候,从业务后台现取。这是硬性要求,不是建议。
Token 生成涉及一套签名逻辑,参考Token 生成文档和各语言(Go / Java / Python / Node.js / PHP / C++ 等)的完整示例代码。你在接入时直接对照着实现,别自己拍脑袋造签名。服务端 API 的签名规则(Signature = md5(AppId + SignatureNonce + ServerSecret + Timestamp))见服务端 API 调用方式。
五、Step 3:客户端(Web 接入)
现在到了 Web 端本身。这份代码是全文的落点,也是本文可复现核心。
3.1 集成 ZEGO Express SDK
Web 端只需要装一个 zego-express-engine-webrtc(按你的构建工具引入SDK,地址见SDK 及 Demo 下载页)。初始化引擎:
import { ZegoExpressEngine } from 'zego-express-engine-webrtc';
const zg = new ZegoExpressEngine(appID, server);
3.2 登录房间
先通过业务后台拿 Token,再登录房间:
const token = await fetchToken(); // 从你自己的业务后台拿
await zg.loginRoom(roomID, { userID, userName }, { userID: userID, token });
3.3 按形态操作
完整可运行代码直接看官方快速开始:实现数字人实时播报(Web)和实现数字人视频通话(Web)。下面是核心逻辑:
播报场景:登录房间后,直接拉数字人流播放。
// 从业务后台拿到的 agent_stream_id
zg.startPlayingStream(agentStreamId, {
canvas: document.getElementById('digital-human-canvas'),
});
// 监听房间流更新,找到目标流再拉(Web 常用的方式)
zg.onRoomStreamUpdate = (roomID, updateType, streamList) => {
streamList.forEach(stream => {
if (updateType === 'ADD' && stream.streamID === agentStreamId) {
zg.startPlayingStream(stream.streamID, {
canvas: document.getElementById('digital-human-canvas'),
});
}
});
};
互动场景:多一步推流。用户上麦,把自己的视频/音频推上去,同时拉数字人流。
// 创建本地流并推流
const localStream = await zg.createStream({ camera: { video: true }, mic: true });
zg.startPublishingStream('my_stream_id', localStream);
然后同样拉取数字人流的 agent_stream_id 播放。到这里,一个能实时对话的数字人就在你页面里跑起来了。
3.4 主动控制数字人
直播里经常需要让数字人主动说一句话,比如带货开场白、报个价格。Web 端通过房间信令 callExperimentalAPI 实现(详见智能体自定义控制),消息体是 JSON,里面带 Action 和 Params:
zg.callExperimentalAPI(msgContent); // msgContent = JSON.stringify({...})
支持的 5 类控制能力:
| Action | 能力 | 对应服务端接口 |
|---|---|---|
SendAgentInstanceTTS | 让数字人朗读一段文本 | 自定义调用 TTS |
SendAgentInstanceLLM | 让 Agent 基于文本推理并回复 | 自定义调用 LLM |
InterruptAgentInstance | 打断当前 TTS/LLM 流程 | 打断智能体实例 |
StartListening | Agent 开始聆听指定用户 | 智能体开始聆听 |
StopListening | Agent 结束聆听 | 智能体结束聆听 |
一条主动播报就是:
const msgContent = JSON.stringify({
Action: 'SendAgentInstanceTTS',
Seq: 'user_123:device_456:000001', // 业务链路追踪标识
Params: { Text: '欢迎来到直播间,今天全场八折' },
});
zg.callExperimentalAPI(msgContent);
关于 Seq,建议养成填的习惯。它是你排障时的根据,格式推荐 user_id:device_id:local_seq,在回调里会原样返回给你。
同时你要在客户端初始化时把数字人 开启自定义视频渲染 的配置设好。
六、Step 4:联调与上线
4.1 直接用官方示例跑通
说了这么多,不如直接跑一个能跑的。ZEGO 官方示例仓库ZEGOCLOUD/ai_agent_quick_start的web 目录,开箱即用。里面有两个入口:
- 最基础的登录 / 推流 / 拉流 / 退出房间
Start Live Digital Human——播报数字人
把这套 clone 下来,配上自己的 app_id 和 server_secret,跟着 README 把服务端和 Web 端都跑起来,第一时间验证你脑子里的架构图对不对。
4.2 用量化指标验延迟
数字人直播的生死线是延迟。ZEGO 提供了获取智能体状态及延迟数据的接口,能拿到:
- LLM 首 token 耗时(毫秒)
- TTS 音频首帧耗时(毫秒)
- 服务端总耗时(毫秒)
上线前先量一次,把这三段分别记住。哪一段异常,一眼就能定位是模型问题、TTS 问题还是链路问题,而不是抓瞎。
4.3 收尾:释放资源
停止播报时,按「删除智能体实例 → 停止拉流 → 退出房间」的顺序来。别忘了删掉 agent_instance_id。直播中间如果反复创建实例不删,资源泄漏会慢慢吃掉你的并发额度。
最后
数字人直播的技术门槛越来越低。 当 ASR、LLM、TTS、数字人驱动全部被封进一个智能体,当 Web 端连渲染 SDK 都不用碰,那剩下需要你投入的是技术之外的东西:
数字人的人设、专业语料、业务编排。 一个只会背稿的数字人和一个能接得住观众提问、会引导成交、有品牌人格的数字人,差距不只是代码还要内容层的东西。
建议先跑通官方ai_agent_quick_start的 Web 示例,先让数字人「说」起来,祝你的第一个数字人开口说话。




