一个开箱即用的AI虚拟主播:LiveStream-Agent
一个开箱即用的AI虚拟主播:LiveStream-Agent完整解析
让AI帮你实时与直播间弹幕互动,带情感、带人设、带记忆,7x24小时无人值守直播
为什么做这个项目
2025年最火的赛道是什么?虚拟主播绝对排得上号。
从V圈的不断破圈,到品牌直播间里24小时在线的数字人,虚拟主播已经从"小众爱好"变成了"主流生产力"。但真正做过直播的朋友都知道,当虚拟主播的"皮"有了,接下来最大的难题是——内容怎么填?
弹幕一多,根本看不过来,更别说一一回复了。新主播尤其痛苦,一边盯着弹幕,一边要控场,还要兼顾内容输出,手忙脚乱是常态。而且人的精力是有限的,不可能24小时都在线。
这时候,LLM Agent的概念给了我启发。
AI Agent(智能体)是2025年技术圈最热的关键词之一,Agent的核心是"感知-思考-执行"的自主循环。我就在想:能不能把Agent的能力搬到直播间里?让AI不仅能"看到"弹幕,还能"理解"上下文、"思考"怎么回复,最后"说出"带有情感的话?
于是LiveStream-Agent诞生了。
LiveStream-Agent是一个开箱即用的虚拟主播AI助手,能够实时接收直播间弹幕,通过大模型进行智能决策,生成带情感的语音回复。最关键的是——这套系统可以7x24小时无人值守运行。
实际体验下来,效果非常自然——弹幕进来,AI分析上下文、判断意图、选择语气,最后用带有情感色彩的真人语音说出来。整个过程实时发生,就像直播间里有一个真正的助理在帮你和观众互动。
今天这篇文章,我想完整分享一下这个项目的架构设计、核心链路和部署方法,也算是对自己这段时间开发的一个总结。
整体架构:Sense → Think → Act
整个系统遵循LLM Agent的经典循环:感知 → 思考 → 执行。
最核心的设计思路是将直播互动抽象成标准的事件流处理管道:
系统分层架构
整个系统自上而下分为三层:接入层、处理层、执行层,每一层都有明确的职责边界。
接入层(Sense) 负责连接各直播平台,将不同平台的原生消息格式统一转换为系统内部的标准事件。目前我实现了抖音和B站两个连接器,通过插件化设计可以轻松扩展更多平台。
处理层(Think) 是整个系统的核心。消息进入后先经过过滤和调度,去除垃圾信息和重复内容,然后由LLM Brain结合三级记忆系统进行推理决策,最后通过情感引擎为回复内容赋予情感标签。这一层完成了从"感知"到"决策"的全部思考过程。
执行层(Act) 将决策结果转化为实际行动——把文本内容和情感参数交给TTS引擎合成带情感的语音,并通过本机播放器输出。如果需要推流到直播间,可以配合虚拟音频设备使用。
三层之间通过标准化的数据接口通信,每一层都可以独立替换和升级,这也是系统具备良好扩展性的基础。
核心交互流程
如果说分层架构是系统的"骨架",那交互流程就是系统的"血脉"。下面用时序图展示一条弹幕从进入系统到AI回复播出的完整生命周期:
整个流程的关键节点如下:
第一步,消息接入。观众在直播间发送弹幕,直播平台通过WebSocket将消息推送给系统。Connector层负责协议解码,抖音需要解析Protobuf格式,B站则使用bilibili_api库处理。解码完成后,Connector将消息封装成标准的LiveEvent事件对象,向上层传递。
第二步,过滤与调度。Pipeline接收到事件后,首先经过Filter模块进行垃圾检测、去重和关键词过滤;然后Scheduler模块判断是否满足回复条件——包括最小间隔限制、同用户冷却时间、队列长度等。只有通过全部校验的消息才能进入Brain处理。
第三步,AI推理决策。Brain模块从Memory系统拉取三级记忆(短期对话上下文、工作记忆关键事实、长期用户画像),结合人设配置构建完整的System Prompt,调用LLM API进行推理。LLM必须以结构化JSON格式返回,包含回复内容、情感标签、行为类型和内心独白。
第四步,情感语音合成。Pipeline将LLM输出的文本内容和情感参数传递给TTS引擎。Emotion模块将情感标签(如happy)映射为具体的语速和音调调整值,Edge TTS根据这些参数合成带情感的MP3音频,最后由Player模块播放出来。
从弹幕发送到语音播出,整个过程在数秒内完成,观众几乎感受不到延迟。
分层与流程的关系
简单总结一下:分层架构定义了系统"是什么"——有哪些模块、各模块的职责边界;交互流程描述了系统"怎么做"——数据如何在模块间流转、每一步执行什么操作。 两者结合,就构成了系统的完整设计蓝图。
核心模块深度解读
1. 平台连接器(Connector)—— 插件化接入
目前支持抖音和B站两大平台,我设计了插件化架构,方便后续扩展。
抖音连接器走的是WebSocket + Protobuf协议,需要解析抖音的内部消息格式;B站连接器则基于bilibili_api库实现。
所有连接器都继承自BaseConnector抽象基类,只需要实现connect、disconnect、send_message三个方法,并通过self._emit(LiveEvent(...))发送标准化事件即可。这种设计让新增平台变得非常简单,有需要的同学可以自己扩展。
2. 三级记忆系统(Memory)—— 让AI"记住"观众
这是我花心思最多的模块之一。普通的AI回复是"无状态"的,每条弹幕独立处理,但我希望AI能真正"记住"观众,做到越聊越懂你。
在记忆系统的设计中,我借鉴了RAG(检索增强生成)和Embedding向量检索的思路。对于长期记忆,每条记忆都带有重要性权重(importance),当需要召回时,系统会根据用户ID和记忆key进行精确检索,将高权重的记忆注入到LLM的上下文中,实现"记忆增强生成"的效果。目前我使用的是基于SQLite的轻量级键值检索,未来计划引入向量数据库(如Chroma或Milvus),将记忆文本通过Embedding模型向量化,实现语义级别的相似度检索,让记忆召回更加精准。
| 记忆层级 | 存储方式 | 技术实现 |
|---|---|---|
| 短期记忆 | 滑动窗口(内存) | 保持最近N轮对话上下文,用于LLM的实时推理 |
| 工作记忆 | 会话内(内存+SQLite) | 记录本场直播的关键事实,如"观众X点了歌《永别纱世里》" |
| 长期记忆 | SQLite持久化 + 向量检索 | 跨会话的用户画像,含importance权重,未来接入向量数据库 |
数据库ER图:
数据持久化在data/agent_memory.db中,有了这套记忆系统,AI就能真正做到"记得老观众",互动体验大幅提升。
3. LLM大脑(Brain)—— 结构化输出驱动行为
这是整个LLM Agent的"决策中枢"。每次LLM调用会构建完整的System Prompt,包含人设、对话历史和记忆,要求模型以结构化JSON回复。
在这个模块中,我深度融合了Prompt Engineering的技术实践:
- 角色扮演指令:通过System Prompt定义主播的人设、性格、说话风格和行为规则,让LLM精准扮演虚拟主播角色
- Few-shot示例:在Prompt中嵌入对话示例,引导LLM理解输出格式和风格要求
- 结构化输出约束:强制要求LLM输出JSON格式,通过明确的schema定义确保输出可解析
- 上下文窗口管理:精心控制输入token数量,在LLM上下文窗口限制内最大化保留有效信息
此外,系统内置了Tool Calling机制。LLM输出的action字段(reply/greet/thank_gift/ignore/question)本质上是调用不同"工具"的指令——当action为thank_gift时,系统会自动触发礼物感谢流程;当action为question时,系统会调整TTS的语调为疑问语气。这种设计将LLM的决策与系统行为解耦,实现了灵活的"决策-执行"分离。
System Prompt构建示例:
你是一个虚拟主播,正在直播间与观众实时互动。
## 你的人设
你的名字是小Q。一个活泼可爱的虚拟主播,善于聊天互动。
## 性格特点
活泼开朗、幽默风趣、共情能力强、偶尔毒舌但不伤人。
## 说话风格
语气轻快,喜欢用语气词(呀、呢、哦、嘛);回应简洁,一般不超过两句话;
善于反问,引导观众继续互动。
## 行为规则
永远不透露自己是AI,坚持虚拟主播身份;优先回复有实质内容的弹幕;
对新观众主动打招呼并表示欢迎。
## 近期对话
[09:00:42] 观众: 小Q,mua一个
[09:00:42] 小Q: 哎呀,这么热情呀~mua!比心比心~
[09:02:12] 观众: 小Q,喜欢喝奶茶吗
## 当前观众信息
昵称:福***;互动次数:245;标签:虚拟主播,音乐,萌宠
## 你对该观众的记忆
点歌偏好:喜欢点歌《永别纱世里》;提及的角色偏好:多次提及Sayori
---
你必须严格按照以下JSON格式回复,不要输出任何其他内容:
{ "content": "...", "emotion": { "category": "...", "intensity": 0.8 },
"action": "reply|greet|thank_gift|ignore|question",
"inner_thought": "..." }
LLM输出的结构化JSON:
{
"content": "哈哈,说到奶茶我可就不困了!我超爱喝奶茶的,尤其是那种带芝士奶盖的,你呢?你最喜欢什么口味?",
"emotion": {
"category": "happy",
"intensity": 0.8
},
"action": "reply",
"inner_thought": "这位老粉互动很多,用轻松的语气回应ta的问题"
}
输出字段的含义:
| 字段 | 说明 | 对应技术 |
|---|---|---|
content |
主播说出口的话,严格符合人设 | Prompt Engineering |
emotion.category |
7种情感之一:happy/excited/calm/sympathetic/funny/serious/warm | 情感计算 |
emotion.intensity |
0.0~1.0,映射为TTS语速和音调 | 参数映射 |
action |
行为类型:reply/greet/thank_gift/ignore/question | Tool Calling |
inner_thought |
内心独白,仅日志记录不播出 | Chain-of-Thought |
项目采用LLM无关的设计,基于OpenAI兼容接口,理论上支持DeepSeek、GPT、智谱GLM等任意兼容API,大家可以根据自己的需求选择。
4. Agent循环(Loop)与状态管理
整个系统运行在一个持续不断的Agent Loop中。与传统的单次LLM调用不同,LiveStream-Agent是一个长期运行的智能体,每一轮循环都包含"接收→感知→思考→决策→执行"的完整链路。
这个Loop的核心设计要点:
- 事件驱动:每一条弹幕或礼物都是一个事件,驱动Agent完成一轮"感知-思考-执行"循环
- 状态持久化:每一轮循环结束后,对话记录、用户画像、工作记忆都会持久化到SQLite,确保系统重启后状态不丢失
- 流式处理:采用异步流水线设计,消息在Pipeline中逐级处理,每一级都可以独立并行,最大化吞吐量
- 优雅退出:按
Ctrl+C时系统会完成当前Loop,生成直播摘要后再退出
目前我采用的是单轮独立决策的Loop模式,即每条弹幕独立触发一次完整的"思考-执行"流程。未来计划引入更复杂的多轮对话管理,让Agent在连续对话中保持更长的推理链条。
5. 情感引擎(Emotion)+ TTS —— 让语音"活"起来
情感引擎将LLM输出的情感标签和强度,映射为TTS的语速和音调参数:
Edge TTS天然支持通过rate和pitch参数控制语音风格:
| 情感 | 语速 | 音调 | 效果 |
|---|---|---|---|
| 开心(happy) | +10% | +5% | 轻快上扬 |
| 激动(excited) | +20% | +10% | 快速高亢 |
| 平静(calm) | -10% | -5% | 舒缓平稳 |
| 共情(sympathetic) | -5% | 0% | 温和贴心 |
TTS引擎使用Microsoft Edge TTS,免费、中文效果好,生成MP3后通过本机播放器输出。如果想推送到直播间,可以使用虚拟音频设备(如VB-Cable)将播放输出作为麦克风输入。
6. 防刷屏调度 —— 保持对话秩序
直播间弹幕密集,直接全部回复会变成"话痨"。我实现了一套完整的调度策略:
- 最小回复间隔:避免回复过于频繁
- 队列管理:待处理消息排队,防止并发冲突
- 同用户冷却:同一用户在短时间内不重复回复
- 垃圾消息过滤:去重、关键词黑名单、长度过滤
7. 桌面UI —— 主播的"第二屏幕"
项目提供了Tkinter桌面界面,包含三个窗口:
- 控制台窗口:实时日志,LLM输入输出一目了然
- 字幕悬浮窗:AI回复文字先于语音显示,观众能"看到"思考过程
- 弹幕滚动窗:实时显示观众弹幕,持续堆积不消失
项目结构
LiveStream-Agent/
├── agent/ # Agent 核心
│ ├── brain.py # 大脑:LLM调用、决策、响应生成
│ ├── memory.py # 记忆系统:三级记忆 + SQLite存储
│ ├── persona.py # 人设管理:角色定义、Prompt构建
│ └── emotion.py # 情感引擎:情感标签 ↔ 语速/音调参数
│
├── connectors/ # 平台连接器(插件化)
│ ├── base.py # 抽象基类,定义统一接口
│ ├── douyin/ # 抖音连接器(WebSocket + Protobuf)
│ └── bilibili/ # B站连接器(bilibili_api)
│
├── llm/ # 大模型接口层(适配器模式)
│ ├── base.py # LLM抽象基类 + 数据结构
│ └── adapter.py # OpenAI兼容适配器
│
├── speech/ # 语音模块
│ ├── tts.py # TTS引擎
│ └── player.py # 音频播放器
│
├── ui/ # 界面模块
│ └── __init__.py # 字幕 + 弹幕窗口(Tkinter)
│
├── pipeline/ # 消息处理管道
│ ├── orchestrator.py # 管道编排器
│ ├── filter.py # 消息过滤
│ └── scheduler.py # 响应调度
│
├── storage/ # 持久化存储
│ ├── database.py # SQLite连接管理(aiosqlite)
│ └── models.py # 数据模型
│
├── config/ # 配置中心
│ ├── settings.yaml # 全局配置
│ ├── personas/ # 人设定义(YAML)
│ └── prompts/ # Prompt模板
│
├── utils/ # 通用工具
│ └── logger.py # 统一日志(loguru)
│
├── data/ # 运行时数据
├── main.py # 主入口
├── requirements.txt
└── README.md
技术栈一览
LiveStream-Agent整合了当前LLM Agent生态的核心技术组件:
| 技术领域 | 具体技术 | 在项目中的应用 |
|---|---|---|
| LLM Agent | 自主决策智能体 | 整套系统遵循Sense-Think-Act范式,实现感知→决策→执行的完整闭环 |
| 大语言模型 | DeepSeek/GPT/GLM(OpenAI兼容接口) | LLM Brain核心推理引擎,负责内容生成和意图理解 |
| Prompt Engineering | 角色扮演 + Few-shot + 结构化输出 | System Prompt精心设计,控制LLM输出格式和风格 |
| RAG(检索增强生成) | 记忆检索 + 上下文注入 | 从长期记忆中检索用户画像和历史偏好,增强LLM回复质量 |
| Embedding向量检索 | 文本向量化 + 语义相似度( | 长期记忆的语义级检索,接入向量数据库实现精准召回 |
| 向量数据库 | Chroma / Milvus | 存储用户记忆的Embedding向量,支持海量记忆的高效检索 |
| Tool Calling | action字段驱动行为分发 | LLM输出action触发不同系统行为(回复/欢迎/感谢/忽略/反问) |
| Agent Loop | 事件驱动的持续运行循环 | 系统7x24h运行,每轮循环完成"接收→感知→思考→执行→更新" |
| LangGraph | 工作流编排 | 引入LangGraph实现更复杂的多轮对话状态管理和分支路由 |
| TTS语音合成 | Edge TTS | 将文本+情感参数合成为带情感的中文语音 |
| 异步I/O | aiohttp + aiosqlite | 高并发弹幕处理和异步数据库操作 |
| 结构化日志 | loguru | 完整的LLM输入输出日志,便于调试和优化Prompt |
快速部署指南
环境要求
- Python 3.10+
- 任一LLM API Key(DeepSeek/OpenAI/智谱GLM)
- Windows / macOS / Linux
安装步骤
# 克隆项目
git clone https://github.com/LiveStream-Agent.git
cd LiveStream-Agent
# 创建虚拟环境
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 安装依赖
pip install -r requirements.txt
配置
编辑config/settings.yaml,填入LLM API信息:
llm:
api_key: "sk-your-api-key-here" # 或设置环境变量 LLM_API_KEY
base_url: "https://api.deepseek.com"
model: "deepseek-chat"
temperature: 0.8
也支持环境变量注入,更安全:
export LLM_API_KEY="sk-your-api-key-here" # Linux/macOS
set LLM_API_KEY=sk-your-api-key-here # Windows
启动运行
# 抖音直播间(完整URL)
python main.py https://live.douyin.com/1122334
# 抖音直播间(仅ID)
python main.py 1122334 --platform douyin
# B站直播间
python main.py 1111 --platform bilibili
# 仅文本回复,不播放语音
python main.py 1111 --no-voice
项目根目录还提供了Windows桌面启动脚本启动LiveStream-Agent.bat,一键启动B站1111直播间,自动设置编码和PYTHONPATH。
按Ctrl+C优雅退出,会自动生成直播摘要并持久化存储。
二次开发指南
添加新人设
在config/personas/下新建YAML文件,参考default.yaml的结构:
name: "小Q"
title: "活泼可爱的虚拟主播"
description: "善于聊天互动的虚拟主播"
traits:
- "活泼开朗"
- "幽默风趣"
- "共情能力强"
style: "语气轻快,喜欢用语气词(呀、呢、哦、嘛)"
rules:
- "永远不透露自己是AI"
- "优先回复有实质内容的弹幕"
然后在settings.yaml中切换:
agent:
persona: "my-new-persona"
支持运行时热切换:brain.switch_persona("my-new-persona")
对接新LLM
任何兼容OpenAI SDK格式的API均可直接使用,只需修改base_url和model。如需特殊处理,可继承llm/base.py的BaseLLMAdapter实现自定义适配器。
添加新直播平台
继承connectors/base.py的BaseConnector,实现三个核心方法即可。平台消息通过_emit(LiveEvent(...))标准化后进入处理管道。
扩展记忆检索(接入向量数据库)
当前长期记忆使用SQLite进行键值检索。如果需要接入向量数据库实现语义检索,可以按照以下步骤扩展:
# storage/vector_store.py
import chromadb
from sentence_transformers import SentenceTransformer
class VectorMemoryStore:
def __init__(self):
self.client = chromadb.Client()
self.collection = self.client.get_or_create_collection("memories")
self.encoder = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
def add_memory(self, user_id, text, importance):
embedding = self.encoder.encode(text).tolist()
self.collection.add(
embeddings=[embedding],
documents=[text],
metadatas=[{"user_id": user_id, "importance": importance}]
)
def retrieve(self, user_id, query, top_k=3):
query_embedding = self.encoder.encode(query).tolist()
results = self.collection.query(
query_embeddings=[query_embedding],
where={"user_id": user_id},
n_results=top_k
)
return results["documents"]
适用场景与使用须知
适用场景:
- 虚拟主播/数字人24小时无人直播
- 游戏直播的实时弹幕互动
- 电商直播的自动答疑与促单
- 内容创作者的直播辅助工具
使用须知:
- 本项目仅用于学习和研究目的
- 请遵守各直播平台的使用条款,合理使用
- 建议在使用前测试语音输出效果,调整情感参数
总结
从最初的一个小想法,到如今功能完整的开源项目,LiveStream-Agent经历了不少迭代。在设计上,LiveStream-Agent遵循了LLM Agent的经典范式(Sense → Think → Act),深度融合了Prompt Engineering、结构化输出、Tool Calling、RAG记忆检索、Agent Loop等前沿技术;在工程上,插件化、配置化、异步化的设计让系统具备良好的扩展性;在体验上,三级记忆 + 情感语音带来了真正"有温度"的互动。
最关键的是,LiveStream-Agent让"24小时无人直播"从概念变成了现实。 你只需要启动程序,AI就会替你值守直播间,实时回复弹幕、感谢礼物、与观众互动,就像一个永远不会累的虚拟主播。
项目采用MIT许可证,完全开源。如果你对这个项目感兴趣,欢迎去GitHub点个Star,也欢迎大家提Issue和PR一起完善。
后续我还计划支持更多直播平台、接入LangGraph实现更复杂的多轮对话编排、引入向量数据库和Embedding检索升级记忆系统、优化情感表达的细腻度、接入更多TTS引擎。如果你有好的想法,也欢迎一起交流!
如果这篇文章对你有帮助,欢迎点赞、收藏、转发!
更多推荐



所有评论(0)