冲到 OpenAI 社区榜二,我做了个让 C 罗解说梅西比赛的 AI 解说员丨开源项目分享
四年一度的世界杯来了。看比赛的时候我冒出一个念头:解说员那么多如果没有我心仪的,能不能自己动手搓一个新的 AI 实时解说员?
于是就有了这个项目。做完我把它发到 OpenAI 的 Reddit 社区,没想到当天冲到了日榜第二,评论区不少人问原理、问怎么搭,还提出了很多我自己都没想到的新点子。所以干脆把原理和玩法整理成文,一次讲清楚。
先看一段效果。这场比赛是美国对阵比利时,解说员是"特朗普":个人特色非常鲜明,夸人有自己的一套,还有自己的专属口头禅,总能将话题引到自己身上。
视频里发生的事,说白了就一句话:给一路真实的直播流,配一个会看画面、会实时开口的 AI 解说员。这就是我开源的 WorldCupVoice (https://github.com/zicojiao/worldcupvoice)。
它不是把比赛录下来事后配音,是真·实时:直播流进来,AI 看着和观众一模一样的画面,生成的语音再被送回直播间。世界杯只是它最好看的演示场景,这套链路适用于任何一路直播。
准确而言,这个不大的小项目,把「实时直播 + 大模型看懂画面 + AI 开口解说」这条最难的链路整个跑通了。
除了图一乐,好像还真能做点有意义的事情
一个是无障碍辅助(Accessibility),给视障人士做专业解说。
这个想法来自 Reddit 评论区一位网友的回复。真人解说默认"你看得见画面",所以很多球场细节他不会讲——球在哪、压力从哪侧压上来、谁在悄悄前插。这些对看得见的人是废话,对看不见的人却是全部。AI 可以把这些被省略的空间信息补回来,给视障观众一份"看得见的解说"。它不是要取代真人,而是补上真人会跳过的那部分。
另一个是普及大众赛事,让普通人的比赛也有自己的解说席。
当直播与 AI 解说的链路打通,解说员的人设、语气、水平就都能换。脑洞随之打开:让"梅西"去解说 C 罗的比赛是什么画风?给小区幼儿园的足球赛配一段央视级解说,孩子追着球跑、旁白热血沸腾,光想就又好笑又期待。再往后,拔河、广场舞、公司年会的趣味运动会,都能有自己的"激情解说席"。
体育解说一直是少数专业场合才有的待遇。而这套东西,理论上能把“专业解说”下放给每一场普通人自己的比赛——这才是我觉得它最有意思的地方。
一图看懂 AI 实时解说的架构
很多人以为"AI 解说"就是丢段视频给大模型让它说几句。难点恰恰在于:这是直播,要求边看、边想、边说,还得快。顺着数据流走一遍就明白了:
直播源(OBS/编码器/本地视频) │ RTMP 推流 ▼Agora Media Gateway ← 把 RTMP 转成实时音视频 │ ▼ Agora RTC 频道 ──────────┐ │ │ ▼ ▼浏览器观众 AI 解说后端(看直播+听AI解说) │ 1. 采样画面帧 │ 2. 视觉模型"看懂" │ 3. TTS 生成语音 └──→ 把 AI 声音回推到 RTC 频道拆开看,频道里其实有三种角色在同一个房间里:
直播源:把画面推进来的那一路。可以是循环播放的本地视频,也可以是 OBS、摄像头、编码器送来的实时现场画面。
AI 解说员:一个"后端参与者"。它不停地采样当前画面 → 交给视觉模型理解 → 让 TTS 把解说词读出来 → 再把这段声音发回频道。
浏览器观众:你打开网页看到的那一端,同时播放直播画面、AI 的声音、解说文字,还有"解说间状态"。
关键巧思在这里:AI 看的不是另一路视频,而是和观众完全相同的那一路 RTC 画面。 这意味着它解说的就是你正在看的内容,不会"画音不对齐"。
技术栈也很主流:前端是 Next.js,后端是 Python 的 FastAPI,实时音视频用 Agora,视觉理解 + TTS 语音合成各司其职。
整体的技术设计中,最吃功夫的其实是"实时"这两个字:画面要实时进来,AI 生成的语音还得低延迟送回直播间。这部分我交给了 Agora——延迟一高,解说就跟不上画面、马上穿帮。选它也有个现成的好处:Agora 是 OpenAI Realtime API 的官方合作伙伴,SDK 和 OpenAI 打通得比较顺,接起来省了不少胶水代码。
项目设计的三个小巧思
第一,先给 AI"补课",它才认得球员。
光看画面,AI 顶多说"穿红色球衣的球员"。所以我让你在 data/matches/ 里用一个 JSON 描述这场比赛:两队、球衣颜色、球员名单、剧情背景。喂了这份"小抄",AI 才能喊出具体名字、贴着比赛叙事去解说。换个场景同理——你也可以把"参赛的是哪几个小朋友"写进去。
第二,声音才是解说的灵魂。
音色很大程度上决定了"像不像真转播间"。项目支持三套 TTS:
OpenAI TTS:默认就能跑通,适合先把流程打通。前面提到 Agora 是 OpenAI Realtime API 的官方合作伙伴,所以真要往"实时语音对话"那个方向做,这套组合也是最省心的。
ElevenLabs:能自己"调"一个体育解说音色,激情、有爆发力,最接近电视里那种。
Fish Audio:想做中文解说的话值得试试,我预留了"中文玩梗解说"和"中文战术解说"两种角色。
顺带提一句:开源仓库里只放了解说员的人设和 prompt,没把我自己的私有音色 ID 塞进去——音色你得自己去对应平台建。
第三,在线 ≠ 烧钱。
AI 实时看画面、实时说话,是真金白银的 token 消耗。所以我专门做了一套成本闸门:
明确的 Start AI / Stop AI 开关、观众"心跳"(没人看了就自动停)、每个会话还有硬性最长时长上限。后台部署在那儿,并不会偷偷一直烧钱。
如果你也想复刻,这里是教程指南
下面是面向开发者的精简版。完整命令以仓库 README 为准,这里帮你建立"先后顺序"的全局观。
1) 装前端、配环境变量
pnpm installcp .env.example .env.localopenssl rand -hex 32 # 生成一个后端密钥,前后端要填同一个.env.local 里主要填 Agora 的 App ID / Certificate、后端地址、刚生成的密钥和一个本地访问密码。
2) 起后端(FastAPI)
cd serverpython -m venv .venv && source .venv/bin/activatepip install -r requirements.txt -r requirements-dev.txtcp .env.example .env.local # 填 Agora、密钥、OPENAI_API_KEYpython -m uvicorn app.main:app --reload --host 127.0.0.1 --port 80003) 配 TTS 音色(可选,但强烈建议)
默认 OpenAI TTS 能用;想要"广播腔"就配 ElevenLabs,想要中文就配 Fish Audio,把对应的 voice ID 填进 server/.env.local。TTS 会让你的解说,更富有灵魂!
4) 起前端、进直播间
pnpm dev # 打开 http://localhost:30005) 给它一路直播流
先在 Agora Console 启用 Media Gateway,用它的 REST API 生成 RTMP 推流 key(项目自带 pnpm run media-gateway:key 帮你生成)。然后三选一把画面推进去:

注意:仓库不内置任何比赛视频(转播画面有版权),你得自备一段 16:9 的 .mp4,或者直接接一路实时画面。配上前面那份比赛 JSON,解说效果会好很多。
6) 上线
前端部署到 Vercel,后端用 Railway 跑 Docker,前后端共用同一个密钥即可。
接下来想往哪走
路线图里几个方向,我觉得挺有想象力:
降低延迟:缩短"画面 → AI 开口"之间的时间差,越实时越像真解说;
多人解说:多个 AI 解说员同台,一个负责激情,一个负责战术分析,互相搭话;
无障碍专属模式:给视障观众提供更密集的球场空间信息;
多语言多音色:覆盖不同国家的语言和声音风格。
最后,聊点好玩的
做这个项目最爽的一刻,不是代码跑通,而是 AI 第一次对着画面喊出"好球!"的那一下——感觉就像你养的 AI 突然学会看球了,还看得特别投入。
以前聊语音合成,纠结的无非是音色像不像人、读得顺不顺。但解说这事儿,硬是把语音从"念稿机"逼成了"现场嘴替":它得先看懂场上发生了啥,再用对的情绪、对的人设,在对的那一秒开口。会看、会想、会接话——它不再是被动播放的声音,而是个真能跟上节奏的搭子。
所以别只盯着球场。下次你家猫主子打架,说不定也能配上一段激情解说。
项目地址:
github.com/zicojiao/worldcupvoice(MIT 协议,可自由使用)。
觉得有意思,欢迎去点个 Star。

阅读更多 Voice Agent 学习笔记:了解最懂 AI 语音的头脑都在思考什么