一、数字人直播功能
数字人直播通过 TTS(文字转语音)驱动虚拟形象说话,配合预先准备好的话术循环播放,加上 AI 自动回复弹幕,实现无人值守的 7×24 小时直播。
LiveStream数字人直播控制系统------它像一座桥梁,连接了虚拟数字人引擎LiveTalking 和直播平台,并给这座桥装上了 AI 大脑。
二、系统全景
先看一张架构全景图:

整个系统分为四大核心能力:
| 模块 | 职责 | 关键技术 |
|---|---|---|
| 话术引擎 | 管理带货话术,自动循环播放 | 优先级队列 + 加权随机选取 |
| 弹幕采集 | 实时抓取多平台弹幕/礼物/关注 | WebSocket + 平台适配器 |
| AI 大脑 | 生成个性化弹幕回复 | LLM + 人设记忆 + 知识库 RAG |
| 数字人交互 | 驱动数字人说话、播放音频/视频 | LiveTalking HTTP + SSE |
三、与 LiveTalking 的交互:如何"遥控"一个数字人?
这是本系统最核心的交互链路。LiveTalking 是一个开源的数字人引擎,它负责:
- 🎭 嘴部驱动:根据音频生成口型同步的虚拟人画面
- 🔊 语音合成:将文字转为自然语音(TTS)
- 🎬 媒体渲染:播放自定义视频/音频
我们通过 HTTP API + SSE 事件流 两种方式与 LiveTalking 通信:
3.1 发送指令给数字人
python
# 文字驱动:发送文字,LiveTalking 自动 TTS + 表情驱动
POST /human {"sessionid": "xxx", "text": "欢迎来到直播间!", "type": "echo"}
# 音频驱动:上传预录制音频,数字人直接对口型
POST /humanaudio form-data: { file: "报价音频.wav" }
# 视频驱动:上传视频,LiveTalking 自动解压为帧序列+音频
POST /convert_custom_media form-data: { file: "产品展示.mp4" }
# 然后加载播放:
POST /load_custom_media {"sessionid": "xxx", "media_path": "/customvideo/media_xxx"}
这三种方式的灵活性让我们可以支持三种话术类型:
- ✍️ 文字话术:适合灵活多变的场景,由 LiveTalking 实时 TTS,适合需要每次播放时随机变换其中某些文字的场景。
- 🎵 音频话术:适合需要特定语气/音效的场景(预录制更可控),不需要消耗tts性能。
- 🎬 视频话术:提前真人录制,直播场景更真实。只在交互时切换到数字人,该功能需要与商业版livetalking配合。
3.2 感知数字人的播放状态
这是整个系统的节拍器 ------我们通过 SSE(Server-Sent Events)长连接实时感知数字人"说完一句话"的时刻:
python
# SSE 事件流:当数字人说完一段内容的瞬间,推送 end 事件
GET /sse?sessionid=xxx
# 事件示例:
data: {"status": "start", "text": "欢迎来到直播间!"}
data: {"status": "end"} ← 关键!触发下一条播放
当收到 status: "end" 事件时,系统立刻从播放队列中取出下一条内容发送给 LiveTalking。这样实现了无缝衔接------上一条刚说完,下一条立刻跟上,中间没有尴尬的空白。
3.3 Session 管理
LiveTalking 支持多个数字人实例同时运行,我们在前端提供了 Session 选择下拉框,用户可以选择使用哪个数字人。底层通过 LiveTalking 的 admin API 获取活跃 session 列表:
python
GET /api/admin/sessions → [{sessionid, model, transport, avatar_id, ...}]
四、智能播放队列:高优弹幕 vs 低优话术的分级调度
这是一个巧妙的设计------两级优先级队列:
┌─────────────────────┐
│ 高优队列 (High) │ ← 弹幕回复、感谢礼物、欢迎关注
│ 先进先出 FIFO │ (插在下一条待播放话术前播放)
└─────────┬───────────┘
│ 优先级 > 低优
┌─────────▼───────────┐
│ 低优队列 (Low) │ ← 话术循环补位
│ 先进先出 FIFO │ (弹幕空闲时才播)
└─────────────────────┘
出队规则非常简洁:优先从高优队列取,高优空了再从低优队列取。
python
async def get_next(self):
if self._high: return self._high.popleft() # 弹幕优先
elif self._low: return self._low.popleft() # 话术轮播
return None # 都空了阻塞等待
自动补位机制
低优队列配置了自动补位:当队列中待播放话术少于 2 条时,后台任务自动从话术库中挑选一条加入队列。选取策略也很有讲究:
- 加权随机:播放次数越少的话术,被选中的概率越大(避免重复)
- 短期去重:最近 5 条已播放的话术不会再次出现
五、AI 大脑:LLM + 人设记忆 + 知识库 RAG
这是让数字人"有灵魂"的关键。
5.1 人设驱动
用户可以自定义数字人的"人设"(Persona),包括:
- 🏷️ 名称:如"小助手"、"带货达人"
- 🎭 性格:如"热情友好、耐心细致、幽默风趣"
- 🗣️ 说话风格:如"轻松活泼,喜欢用简短的句子,偶尔加入网络流行语"
- 📚 知识范围:如"日常闲聊、生活百科、娱乐八卦"
- 🚫 禁止话题:可配置避而不谈的内容
这些配置会被拼接到 LLM 的 System Prompt 中,确保每一次 AI 回复都符合人设:
5.2 短期记忆
每位观众都维护独立的对话历史(滑动窗口 10 轮)。当观众 A 问"这个多少钱?"之后又问"那红色的呢?",AI 能结合上下文回答------不是鸡同鸭讲。
5.3 知识库 RAG
这是让数字人"懂行"的能力。商家把产品手册、FAQ、规格表等文档上传到知识库后,系统自动:
- 📄 文档解析:支持 PDF、Markdown、纯文本
- ✂️ 文本分块:RecursiveCharacterTextSplitter,每块 500 字符,重叠 50 字符
- 🧮 向量化存储:通过 Embedding 模型(如 text-embedding-v4)转为向量,存入 ChromaDB
- 🔍 语义检索:观众提问时,检索最相关的 2 条知识片段
- 💬 增强生成:将检索结果注入 LLM Prompt,生成更准确的回答
python
# 弹幕回复的完整链路
async def generate_reply(self, message, sender):
# Step 1: 检索知识库
docs = await self._knowledge_base.search(message, k=2)
kb_context = "\n".join(d.page_content for d in docs)
# Step 2: 构建 Prompt(人设 + 记忆 + 知识)
messages = self._build_messages(message, sender, kb_context)
# Step 3: 调用 LLM 生成回复
response = await self.client.chat.completions.create(
model="qwen-plus", messages=messages, max_tokens=200
)
# Step 4: 记录到记忆
self.add_to_memory(sender, "user", message)
self.add_to_memory(sender, "assistant", reply)
return reply
模型兼容性
系统采用 OpenAI 兼容接口,支持任何兼容的 LLM 服务:
- 默认使用 通义千问(qwen-plus) + DashScope Embedding
- 可切换为 DeepSeek、GLM、Moonshot 等任意兼容 API
- 通过前端配置页直接修改 API Key 和 Base URL
六、多平台弹幕采集:统一的消息流
弹幕采集采用策略模式设计,不同平台的采集器各自实现统一的抽象接口:
BaseDanmakuCollector (抽象基类)
├── BilibiliCollector → bilibili-api 的 LiveDanmaku WebSocket
├── DouyinCollector → 抖音弹幕抓取工具
└── WxliveCollector → 视频号弹幕抓取工具
所有平台的消息被归一化为统一的 DanmakuMessage 格式:
python
@dataclass
class DanmakuMessage:
platform: str # "bilibili" | "douyin" | "wxlive"
sender: str # 发送者昵称
content: str # 消息内容
msg_type: str # "danmaku" | "gift" | "follow" | "enter"
timestamp: float # 时间戳
收到消息后的处理逻辑:
| 事件类型 | AI 处理方式 |
|---|---|
| 📝 弹幕(提问/闲聊) | LLM + 知识库生成个性化回复 |
| 🎁 礼物 | 模板感谢:"谢谢 XX 的火箭 x1!" |
| 👥 关注 | 模板欢迎:"欢迎 XX 关注直播间!" |
七、完整的数据流:一条弹幕的旅程
让我们跟随一条弹幕,走过整个系统的完整链路:

整个过程从弹幕到达,到数字人开口回答,完整链路通常在 1-3 秒内完成。
八、部署与运行
整体部署非常轻量,适合个人或小团队:
-
启动 LiveTalking 数字人引擎
浏览器打开 http://livetalking-server:8010/index.html 连接视频
或使用虚拟摄像头模式:--transport virtualcam
-
启动 LiveStream 服务
bash
cd frontend && npm run build
cd backend
pip install -r requirements.txt #第一次安装运行
python app/main.py # 默认监听 8020 端口
-
打开前端控制台
Web 模式:直接访问 http://127.0.0.1:8020
-
配置
- 在「系统设置」中配置 LiveTalking 地址和 LLM API Key
- 在「话术管理」中添加带货话术(文字/音频/视频)
- 在「人设配置」中设定数字人性格
- 在「知识库」中上传产品资料(可选)
- 在「直播控制」中选择 Session 和平台 → 开始直播!
-
用 OBS 或直播伴侣抓取数字人画面推流
九、总结与展望
LiveStream 项目展示了数字人直播的核心技术栈------以 LiveTalking 为驱动引擎,以 LLM+RAG 为智能大脑,以优先级队列为调度中枢,以多平台弹幕采集为感知层,构成了一个完整的无人值守直播方案。
它的亮点在于:
- 🧩 模块化设计:每个组件职责清晰、可独立替换(换 LLM、换弹幕平台都很容易)
- 🎯 优先级调度:弹幕回复随时打断话术播放,互动体验远好于固定顺序轮播
- 🧠 知识增强:RAG 让 AI 回复不只是闲聊,而是真正懂产品、懂业务
- 🔌 多平台兼容:B站、抖音、视频号,你只需要选择平台就能开播
- 🏠 轻量部署:SQLite + ChromaDB,零外部依赖,笔记本就能跑
当然,这个系统还有很多可以深化的方向:
- 多模态数字人:支持更丰富的表情和动作
- 情感识别:根据弹幕情绪动态调整回复风格
- 数据分析:直播数据大屏、观众画像分析
- 更智能的话术管理:根据实时转化率自动调整话术优先级
项目地址 :
LiveStream: https://github.com/lipku/livestream --- 数字人直播
LiveTalking: https://github.com/lipku/livetalking --- 数字人引擎
作者注:如果你对数字人直播感兴趣,欢迎动手尝试------整个项目在本地就能跑起来。如果本地没有显卡,可以将LiveTalking跑在云服务上。