从原始录音/录屏出发,全自动完成 转录 → 说话人分离 → AI 剪辑 → 视觉编排 → 像素风视频渲染,输出可直接发布到自媒体平台的播客视频。
Minecraft 像素风圆桌动画 — 三个角色坐在一起讨论,话题、字幕、气泡自动同步
- 全自动 Pipeline:5 步串联,从原始录音到成品视频一键完成
- AI 智能剪辑:LLM 自动去口误、去冗余,保持语义完整
- 像素风视频渲染:Minecraft 风格的圆桌讨论动画,12 种动态主题背景
- 在线协作审阅:通过公网链接分享文稿给朋友审阅,实时同步
- 配置驱动:所有视觉参数通过 JSON 配置,LLM 自动生成或手动编辑
- 跨平台:支持 macOS、Linux、Windows
flowchart LR
A["🎙️ 录屏 / 音频<br/><sub>.mp4 .mp3 .m4a ...</sub>"]
B["🔊 音频提取<br/><sub>Step 1</sub>"]
C["📝 ASR 转录<br/>+ 说话人分离<br/><sub>Step 2</sub>"]
D["✂️ AI 文稿剪辑<br/><sub>Step 3</sub>"]
E["🎨 视觉编排<br/><sub>Step 3.5</sub>"]
F["🎬 像素风渲染<br/><sub>Step 4</sub>"]
G["📺 成品视频<br/><sub>1080p MP4</sub>"]
A --> B --> C --> D --> E --> F --> G
style A fill:#f5f0ff,stroke:#8b6cc1,color:#2d2a26
style B fill:#edf7f1,stroke:#4a9e6b,color:#2d2a26
style C fill:#eef4fb,stroke:#5b8fd4,color:#2d2a26
style D fill:#fef0eb,stroke:#e8734a,color:#2d2a26
style E fill:#f3eefb,stroke:#8b6cc1,color:#2d2a26
style F fill:#fbf5ee,stroke:#d4a55b,color:#2d2a26
style G fill:#edf7f1,stroke:#4a9e6b,color:#2d2a26
每一步的输入、输出和中间产物:
flowchart TB
subgraph step1 ["Step 1 · 音频提取"]
direction LR
I1[".mp4 / .mp3 / .m4a<br/>任意音视频"]
O1["16kHz 单声道 .wav"]
T1[/"ffmpeg"/]
I1 --> T1 --> O1
end
subgraph step2 ["Step 2 · ASR 转录 + 说话人分离"]
direction LR
I2[".wav 音频"]
I2b["会议转录 .txt<br/><sub>(可选, 提供说话人)</sub>"]
O2["转录 .json<br/><sub>start_time, end_time,<br/>speaker, text</sub>"]
T2a[/"云端 ASR<br/><small>qwen3-asr-flash</small>"/]
T2b[/"本地 ASR<br/><small>Qwen3-ASR-1.7B</small>"/]
I2 --> T2a & T2b
I2b -.->|"融合说话人"| O2
T2a & T2b --> O2
end
subgraph step3 ["Step 3 · AI 文稿剪辑"]
direction LR
I3["转录 .json"]
O3["编辑稿 .json<br/><sub>keep / remove / trim<br/>+ 编辑后文字</sub>"]
O3f["_final.json<br/><sub>人工定稿</sub>"]
T3[/"LLM API<br/><small>OpenAI 兼容</small>"/]
R3{{"👥 人工审阅<br/><small>Web / 公网分享</small>"}}
I3 --> T3 --> O3 --> R3 --> O3f
end
subgraph step35 ["Step 3.5 · 视觉编排"]
direction LR
I35["转录 / 编辑稿 .json"]
O35["visual_config.json<br/><sub>话题时间线 · 角色配置<br/>背景主题 · 配色方案</sub>"]
T35[/"LLM 分析内容<br/><small>或自动推断</small>"/]
I35 --> T35 --> O35
end
subgraph step4 ["Step 4 · 像素风视频渲染"]
direction LR
I4a["转录 .json"]
I4b[".wav 音频"]
I4c["visual_config.json"]
O4["🎬 1080p MP4"]
T4[/"Pillow 绘制帧<br/>+ ffmpeg 合成"/]
I4a & I4b & I4c --> T4 --> O4
end
step1 ==> step2 ==> step3 ==> step35 ==> step4
style step1 fill:#edf7f1,stroke:#4a9e6b,color:#2d2a26
style step2 fill:#eef4fb,stroke:#5b8fd4,color:#2d2a26
style step3 fill:#fef0eb,stroke:#e8734a,color:#2d2a26
style step35 fill:#f3eefb,stroke:#8b6cc1,color:#2d2a26
style step4 fill:#fbf5ee,stroke:#d4a55b,color:#2d2a26
每期播客的数据独立存放在 data/episodes/<id>/ 下:
flowchart LR
subgraph ep ["📁 data/episodes/001/"]
direction TB
META["meta.json<br/><sub>名称 · 说话人</sub>"]
VC["visual_config.json<br/><sub>视觉编排配置</sub>"]
RAW["raw/<br/><sub>原始录音 / 会议转录</sub>"]
AUD["audio/<br/><sub>Step 1 输出的 .wav</sub>"]
TRANS["transcripts/<br/><sub>Step 2 ASR 结果<br/>+ _final.json 定稿</sub>"]
SCRIPTS["scripts/<br/><sub>Step 3 编辑稿</sub>"]
OUT["output/<br/><sub>Step 4 渲染的 .mp4</sub>"]
end
RAW -->|"Step 1"| AUD
AUD -->|"Step 2"| TRANS
TRANS -->|"Step 3"| SCRIPTS
SCRIPTS -->|"Step 3.5"| VC
TRANS & AUD & VC -->|"Step 4"| OUT
style ep fill:#faf8f5,stroke:#e8e3dc,color:#2d2a26
style META fill:#f3eefb,stroke:#8b6cc1,color:#2d2a26
style VC fill:#f3eefb,stroke:#8b6cc1,color:#2d2a26
style OUT fill:#edf7f1,stroke:#4a9e6b,color:#2d2a26
Step 2 的转录结果可能来自三个独立的数据源,各有优势和局限:
| 数据源 | 提供什么 | 不提供什么 | 如何获取 |
|---|---|---|---|
| 腾讯会议 / 飞书妙记转录 (.txt) | 说话人分离(谁在说话) | 字级时间戳、精确文字 | 从会议软件导出 |
| 云端 ASR (qwen3-asr-flash) | 句级时间戳(毫秒精度)、准确文字 | 说话人分离、字级时间戳 | 需要 DASHSCOPE_API_KEY |
| 本地 ForcedAligner | 字级时间戳(每个字精确到毫秒) | 说话人分离、文字识别 | 需要本地模型 (0.6B) |
flowchart TB
subgraph sources ["三个数据源"]
S1["🎤 腾讯会议/飞书 .txt<br/><sub>说话人 1, 0:42<br/>大家好,今天聊聊AI<br/><br/>说话人 2, 1:15<br/>对,我最近在研究...</sub>"]
S2["☁️ 云端 ASR<br/><sub>0:42.3–0:48.1 大家好今天聊聊AI<br/>1:15.0–1:22.4 对我最近在研究...</sub>"]
S3["🔤 ForcedAligner<br/><sub>大(0.423–0.455)<br/>家(0.455–0.501)<br/>好(0.501–0.533)<br/>...</sub>"]
end
MERGE["🔀 融合引擎"]
OUT["📄 最终转录 .json<br/><sub>每段话 = 精确时间 + 说话人 + 字级时间戳</sub>"]
S2 -->|"①基准:文字+句级时间"| MERGE
S1 -.->|"②时间重叠匹配<br/>继承说话人ID"| MERGE
S3 -.->|"③逐段对齐<br/>补充字级时间戳"| MERGE
MERGE --> OUT
style S1 fill:#f3eefb,stroke:#8b6cc1,color:#2d2a26
style S2 fill:#eef4fb,stroke:#5b8fd4,color:#2d2a26
style S3 fill:#fbf5ee,stroke:#d4a55b,color:#2d2a26
style MERGE fill:#fef0eb,stroke:#e8734a,color:#2d2a26
style OUT fill:#edf7f1,stroke:#4a9e6b,color:#2d2a26
融合步骤:
- 以 ASR 为基准:云端或本地 ASR 产生准确的文字和句级时间戳,作为主要结果
- 叠加说话人:将每个 ASR 段落的时间区间与会议转录的时间区间做重叠匹配,取重叠最大的会议段落的说话人 ID 赋给 ASR 段落
- 补充字级时间戳:用 ForcedAligner 将已确定的文字与音频片段逐字对齐,产出每个字的起止毫秒
冲突处理:
- 文字不一致(ASR 识别的文字 ≠ 会议转录的文字)→ 以 ASR 文字为准(更准确),仅继承说话人
- 时间偏移(会议转录时间 ≠ ASR 时间)→ 容许偏差,用最大重叠区间匹配,不要求精确相等
- 说话人缺失(没有会议转录)→ 所有段落标记为 speaker=0(未知),前端/渲染仍可正常工作
当 AI 剪辑(Step 3)删除段内的口头禅时(如把"其实最开始我和Lemon我们在二月份"编辑为"最开始我和Lemon在二月份"), 渲染引擎需要知道"其实"和"我们"各自对应音频中的哪几百毫秒,才能精确裁切。
- 有字级时间戳 → 精确删除每个被剪掉的字对应的音频片段
- 没有字级时间戳 → 只能整段保留或整段删除,无法实现词级裁切
# macOS
brew install ffmpeg
# Linux (Ubuntu/Debian)
sudo apt install ffmpeg
# Windows
winget install ffmpeg
# 或: choco install ffmpeg如果你只使用云端 ASR,可以跳过此步。如果需要本地离线转录或字级时间戳精确剪辑,需要下载模型:
| 模型 | 用途 | 大小 | HuggingFace 链接 |
|---|---|---|---|
| Qwen3-ForcedAligner-0.6B | 字级时间戳(精确剪辑必需) | ~1.2 GB | Qwen/Qwen3-ForcedAligner-0.6B |
| Qwen3-ASR-1.7B | 本地离线 ASR 转录 | ~3.4 GB | Qwen/Qwen3-ASR-1.7B |
# 方式 1: 用 huggingface-cli 下载(推荐)
pip install huggingface_hub
huggingface-cli download Qwen/Qwen3-ForcedAligner-0.6B --local-dir models/Qwen3-ForcedAligner-0.6B
huggingface-cli download Qwen/Qwen3-ASR-1.7B --local-dir models/Qwen3-ASR-1.7B
# 方式 2: 用 git lfs 克隆
git lfs install
git clone https://huggingface.co/Qwen/Qwen3-ForcedAligner-0.6B models/Qwen3-ForcedAligner-0.6B
git clone https://huggingface.co/Qwen/Qwen3-ASR-1.7B models/Qwen3-ASR-1.7B
# 方式 3: 从 ModelScope 下载(国内用户推荐,无需翻墙)
pip install modelscope
modelscope download Qwen/Qwen3-ForcedAligner-0.6B --local_dir models/Qwen3-ForcedAligner-0.6B
modelscope download Qwen/Qwen3-ASR-1.7B --local_dir models/Qwen3-ASR-1.7B模型文件不包含在代码仓库中(太大),需要自行下载。 只需要字级时间戳的话,只下载 ForcedAligner(1.2GB)即可,ASR 可以用云端。
# 创建虚拟环境(推荐 Python 3.10+)
python -m venv .venv
# 激活虚拟环境
source .venv/bin/activate # macOS / Linux
.venv\Scripts\activate # Windows
# 安装依赖
pip install -r requirements.txt注意:如果只需要云端 ASR + AI 剪辑 + 渲染(不用本地 ASR),可以跳过
torch等大型依赖:pip install openai Pillow fastapi uvicorn python-multipart requests
cp .env.example .env
# 编辑 .env,填入你的 API Key需要配置的 Key:
| 变量 | 用途 | 必须? |
|---|---|---|
LLM_API_KEY |
AI 剪辑 + 视觉编排 (Step 3/3.5) | 是(用 AI 剪辑时) |
LLM_BASE_URL |
LLM API 地址 | 否(默认 OpenAI) |
LLM_MODEL |
LLM 模型名 | 否(默认 gpt-4o) |
DASHSCOPE_API_KEY |
云端 ASR (Step 2) | 否(用云端 ASR 时) |
支持 OpenAI / Claude / DeepSeek / Qwen / Kimi 等任何兼容 OpenAI API 格式的服务。
# 步骤 1: 提取音频
python run_pipeline.py --step 1 --input data/raw/录音.mp3
# 步骤 2: ASR 转录
python run_pipeline.py --step 2 --input data/audio/录音.wav
# 步骤 3: AI 剪辑
python run_pipeline.py --step 3 --input data/transcripts/录音.json
# 步骤 3.5: 视觉编排
python run_pipeline.py --step 35 --input data/transcripts/录音.json
# 步骤 4: 渲染视频
python run_pipeline.py --step 4 --episode data/episodes/001
# 渲染 demo 片段(用于预览)
python run_pipeline.py --step 4 --demo --episode data/episodes/001
# 渲染指定时间段
python run_pipeline.py --step 4 --start 60 --end 180 --episode data/episodes/001cd web && uvicorn app:app --port 8080打开 http://localhost:8080 即可使用可视化管理界面,支持:
- 期数管理(新建 / 切换 / 删除)
- 文件上传
- 分步运行 Pipeline(实时进度 + 取消)
- 音频编辑器(逐段播放 + 时间戳跳转)
- AI 剪辑审阅(在线审阅 + 公网分享)
- 渲染预览
Pipeline 内置了公网审阅功能,允许你把 AI 编辑后的文稿分享给朋友在线审阅。
sequenceDiagram
actor 你 as 🧑💻 发起者
participant Web as 🖥️ 本地 Web 服务
participant Tunnel as 🌐 cloudflared 隧道
actor 审阅者 as 👥 审阅者
你 ->> Web: 1. 打开编辑稿 → 点击「分享审阅」
Web ->> Tunnel: 2. 自动启动隧道
Tunnel -->> Web: 生成公网链接
Web -->> 你: 返回分享链接
你 ->> 审阅者: 3. 发送链接
审阅者 ->> Tunnel: 4. 打开链接
Tunnel ->> Web: 转发请求
Web -->> 审阅者: 返回审阅页面
loop 逐段审阅
审阅者 ->> Web: 5. 接受 / 拒绝 / 修改
Web -->> 你: WebSocket 实时同步
end
审阅者 ->> Web: 6. 点击「确认定稿」
Web ->> Web: 生成 _final.json
Web -->> 你: 通知定稿完成
Note over 你,Web: 7. 用 _final.json 进行后续渲染
发起者必须保持在线!
协作审阅依赖 cloudflared 隧道将你的本机 Web 服务暴露到公网。这意味着:
要求 说明 电脑保持运行 uvicorn服务不能关闭网络保持连接 断网后审阅者无法访问 链接是临时的 每次启动隧道都会生成新链接 审阅者零门槛 不需要安装任何软件,只需浏览器 如果你需要关闭电脑,请先确认审阅已完成并已点击「确认定稿」。
需要安装 cloudflared:
# macOS
brew install cloudflare/cloudflare/cloudflared
# Linux
# 参考: https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/
# Windows
winget install Cloudflare.cloudflaredStep 4 的渲染引擎由 visual_config.json 驱动,所有视觉参数可配置:
flowchart TB
subgraph config ["visual_config.json"]
direction TB
SHOW["show_name<br/><sub>节目名称</sub>"]
CHARS["characters[]<br/><sub>角色列表:名称 · 头型 · 配色</sub>"]
TOPICS["topics[]<br/><sub>话题时间线:标题 · 起止时间 · 视觉主题</sub>"]
REACT["segment_reactions{}<br/><sub>逐段表演指令:思考 · 大笑 · 惊讶 ...</sub>"]
PROPS["table_props{}<br/><sub>桌面道具:书本 · 盾牌 · 灯泡 ...</sub>"]
end
LLM[/"🤖 LLM 自动生成<br/><small>Step 3.5</small>"/]
MANUAL[/"✏️ 手动编辑"/]
RENDER["🎬 Step 4 渲染引擎"]
LLM --> config
MANUAL --> config
config --> RENDER
style config fill:#f3eefb,stroke:#8b6cc1,color:#2d2a26
style LLM fill:#eef4fb,stroke:#5b8fd4,color:#2d2a26
style MANUAL fill:#fbf5ee,stroke:#d4a55b,color:#2d2a26
style RENDER fill:#edf7f1,stroke:#4a9e6b,color:#2d2a26
visual_config.json 示例(点击展开)
{
"show_name": "AI 瞎聊 EP.001",
"characters": [
{"name": "阿言", "id": 1, "head_type": "cactus"},
{"name": "Lemon", "id": 2, "head_type": "lemon"},
{"name": "Melon", "id": 3, "head_type": "melon"}
],
"topics": [
{"start": 0, "end": 300, "title": "开场闲聊", "visual_theme": "social"},
{"start": 300, "end": 900, "title": "AI Agent 深度讨论", "visual_theme": "tech"},
{"start": 900, "end": 1500, "title": "代码实战", "visual_theme": "code"}
],
"segment_reactions": {
"5": {"2": "laughing", "3": "surprised"},
"12": {"1": "thinking"}
},
"table_props": {
"0": ["book", "plant"],
"1": ["shield", "gear"]
}
}| head_type | 外观 |
|---|---|
cactus |
仙人掌(绿色,顶部小花) |
lemon |
柠檬(黄色,顶部叶子) |
melon |
甜瓜(绿条纹,顶部蒂) |
strawberry |
草莓(红色,绿叶冠) |
blueberry |
蓝莓(紫蓝色) |
每种主题有独特的背景动画和配色,LLM 会根据话题内容自动分配:
tech 科技/AI |
code 代码/开发 |
data 数据/数据库 |
|---|---|---|
![]() |
![]() |
![]() |
| 神经网络节点 + 扫描光线 | 代码编辑器滚动 | 数据库柱体 + 数据流 |
system 服务器/运维 |
alert 安全/风险 |
social 协作/社交 |
|---|---|---|
![]() |
![]() |
![]() |
| 服务器机架 + LED 闪烁 | 盾牌 + 扫描线 | 卡片式 UI 浮动 |
business 产品/商业 |
creative 设计/创意 |
science 研究/理论 |
|---|---|---|
![]() |
![]() |
![]() |
| 仪表板模块浮动 | 流程节点 + 光点流动 | 神经网络层可视化 |
nature 生活/健康 |
abstract 思维/哲学 |
warm 情感/故事 |
|---|---|---|
![]() |
![]() |
![]() |
| 时钟 + 齿轮转动 | 同心圆弧 + 脉冲粒子 | 温暖色调粒子 |
AI_video_edit/
├── src/
│ ├── config.py # 全局配置(.env 解析、路径、跨平台设置)
│ ├── step1_audio_extract.py # 步骤 1: 音频提取
│ ├── step2_asr_transcribe.py # 步骤 2: ASR 转录 + 说话人分离
│ ├── step3_ai_edit.py # 步骤 3: AI 文稿剪辑
│ ├── step3_5_visual_plan.py # 步骤 3.5: LLM 视觉编排
│ ├── step4_render_video.py # 步骤 4: 像素风视频渲染
│ ├── visual_config.py # 视觉配置模块(角色/话题/主题/配色)
│ ├── sprite_manager.py # Sprite 素材管理器
│ ├── generate_sprites.py # AI Sprite 素材生成器
│ └── utils/
│ ├── audio.py # 音频处理工具
│ ├── text.py # 文本处理工具
│ ├── video.py # 视频处理工具
│ └── safe_path.py # 路径安全工具(防路径遍历)
├── web/
│ ├── app.py # FastAPI 后端 + WebSocket
│ └── static/index.html # 单页前端
├── data/
│ └── episodes/ # 期数数据(每期独立目录)
│ └── 001/
│ ├── meta.json # 期数元信息(名称、说话人)
│ ├── visual_config.json # 视觉配置(LLM 生成 / 手动编辑)
│ ├── raw/ # 原始文件
│ ├── audio/ # Step 1 提取的音频
│ ├── transcripts/ # Step 2 ASR 转录 + 定稿
│ ├── scripts/ # Step 3 AI 编辑稿
│ └── output/ # Step 4 渲染输出
├── models/ # 本地模型权重(需自行下载)
├── legacy/ # 历史探索归档
├── .env.example # 环境变量模板
├── requirements.txt # Python 依赖
└── run_pipeline.py # CLI 入口
| 组件 | 技术 |
|---|---|
| CLI 入口 | Python argparse |
| ASR 转录 | Qwen3-ASR (本地) / qwen3-asr-flash-filetrans (云端) |
| AI 剪辑 | OpenAI 兼容 LLM API |
| 视频渲染 | Pillow + ffmpeg |
| Web 后端 | FastAPI + WebSocket |
| Web 前端 | 纯 HTML/CSS/JS(无框架) |
| 公网隧道 | cloudflared |
| 视觉配置 | visual_config.json(LLM 生成 / 手动配置) |
legacy/ 目录保留了项目早期的三轮技术探索。当前方案(Pillow 像素风 + LLM 编排)是经过多次试错后的选择,这些历史代码记录了探索过程,也代表了未来可能的演进方向。
| 探索 | 技术方案 | 结果 | 潜在价值 |
|---|---|---|---|
| 探索 1 | Pillow 2D 像素风 + HTML5 Canvas | 采用 → 演化为当前 Step 4 渲染引擎 | 当前方案的基础 |
| 探索 2 | Blender 3D 程序化建模 | 放弃 — 纯代码控制 3D 场景的开发成本过高 | 如果未来接入 3D 模型编辑器,可以产出更专业的画面 |
| 探索 3 | SoulX-FlashTalk 数字人 | 放弃 — 需要 2×H100 GPU,硬件门槛太高 | 随着模型量化和硬件发展,未来有望在消费级 GPU 上运行 |
探索效果截图(点击展开)
探索 2:Blender 3D 程序化建模 — 纯代码控制 Blender 构建播客工作室场景
探索 3:SoulX-FlashTalk 数字人 — AI 生成的说话人头像(音频驱动口型同步)
legacy/开源仓库 README/ 中收集了调研过的开源项目文档(Qwen3-ASR、SoulX 系列、LTX-2 等),供有兴趣深入探索的开发者参考。
渲染时间取决于 CPU 性能。每帧需要用 Pillow 绘制 1920x1080 的图像,30 分钟 = 43200 帧(24fps)。在 M1 MacBook Pro 上大约需要 30-60 分钟。
磁盘空间:渲染过程中会产生临时 PNG 帧文件,像素风图片压缩后每帧约 500KB-1MB,30 分钟峰值约 20-40GB。渲染完成(或中途失败)后,临时帧文件会自动清理(通过 try/finally 保证),最终只保留一个 MP4 文件(通常几百 MB)。建议渲染前确保磁盘有 40GB+ 可用空间。
可能是系统缺少中文字体:
- macOS: 内置苹方字体,通常不会有问题
- Windows: 需要微软雅黑(msyh.ttc),Windows 10+ 默认自带
- Linux: 需要安装 CJK 字体:
sudo apt install fonts-noto-cjk
可以。直接跳到 Step 4,它会自动使用 Step 2 的 ASR 转录结果渲染。适用于音频已经人工剪辑好的场景。
支持任何兼容 OpenAI Chat Completions API 格式的服务:
- OpenAI (GPT-4o, GPT-4, ...)
- Anthropic Claude (通过兼容层)
- DeepSeek
- 通义千问 (Qwen)
- Moonshot (Kimi)
- 本地部署的 LLM (Ollama, vLLM, ...)
在 .env 中配置 LLM_BASE_URL 和 LLM_MODEL 即可。
MIT











