Skip to content

Repository files navigation

AI 播客后期处理 Pipeline

从原始录音/录屏出发,全自动完成 转录 → 说话人分离 → AI 剪辑 → 视觉编排 → 像素风视频渲染,输出可直接发布到自媒体平台的播客视频。

渲染效果预览
Minecraft 像素风圆桌动画 — 三个角色坐在一起讨论,话题、字幕、气泡自动同步

核心特性

  • 全自动 Pipeline:5 步串联,从原始录音到成品视频一键完成
  • AI 智能剪辑:LLM 自动去口误、去冗余,保持语义完整
  • 像素风视频渲染:Minecraft 风格的圆桌讨论动画,12 种动态主题背景
  • 在线协作审阅:通过公网链接分享文稿给朋友审阅,实时同步
  • 配置驱动:所有视觉参数通过 JSON 配置,LLM 自动生成或手动编辑
  • 跨平台:支持 macOS、Linux、Windows

Pipeline 总览

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
Loading

数据流转详解

每一步的输入、输出和中间产物:

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
Loading

文件存储结构

每期播客的数据独立存放在 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
Loading

多源数据融合 — 三个数据源如何合成?

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
Loading

融合步骤:

  1. 以 ASR 为基准:云端或本地 ASR 产生准确的文字和句级时间戳,作为主要结果
  2. 叠加说话人:将每个 ASR 段落的时间区间与会议转录的时间区间做重叠匹配,取重叠最大的会议段落的说话人 ID 赋给 ASR 段落
  3. 补充字级时间戳:用 ForcedAligner 将已确定的文字与音频片段逐字对齐,产出每个字的起止毫秒

冲突处理:

  • 文字不一致(ASR 识别的文字 ≠ 会议转录的文字)→ 以 ASR 文字为准(更准确),仅继承说话人
  • 时间偏移(会议转录时间 ≠ ASR 时间)→ 容许偏差,用最大重叠区间匹配,不要求精确相等
  • 说话人缺失(没有会议转录)→ 所有段落标记为 speaker=0(未知),前端/渲染仍可正常工作

为什么需要字级时间戳?

当 AI 剪辑(Step 3)删除段内的口头禅时(如把"其实最开始我和Lemon我们在二月份"编辑为"最开始我和Lemon在二月份"), 渲染引擎需要知道"其实"和"我们"各自对应音频中的哪几百毫秒,才能精确裁切。

  • 有字级时间戳 → 精确删除每个被剪掉的字对应的音频片段
  • 没有字级时间戳 → 只能整段保留或整段删除,无法实现词级裁切

快速开始

1. 系统依赖

# macOS
brew install ffmpeg

# Linux (Ubuntu/Debian)
sudo apt install ffmpeg

# Windows
winget install ffmpeg
# 或: choco install ffmpeg

2. 下载模型(可选,本地 ASR + 字级时间戳需要)

如果你只使用云端 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 可以用云端。

3. 安装 Python 依赖

# 创建虚拟环境(推荐 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

4. 配置 API Key

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 格式的服务。

5. 运行

命令行(分步运行)

# 步骤 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/001

Web 管理界面

cd 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 进行后续渲染
Loading

重要注意事项

发起者必须保持在线!

协作审阅依赖 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.cloudflared

视觉配置系统

Step 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
Loading
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 蓝莓(紫蓝色)

可用的视觉主题(12 种)

每种主题有独特的背景动画和配色,LLM 会根据话题内容自动分配:

tech 科技/AI code 代码/开发 data 数据/数据库
tech code data
神经网络节点 + 扫描光线 代码编辑器滚动 数据库柱体 + 数据流
system 服务器/运维 alert 安全/风险 social 协作/社交
system alert social
服务器机架 + LED 闪烁 盾牌 + 扫描线 卡片式 UI 浮动
business 产品/商业 creative 设计/创意 science 研究/理论
business creative science
仪表板模块浮动 流程节点 + 光点流动 神经网络层可视化
nature 生活/健康 abstract 思维/哲学 warm 情感/故事
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 构建播客工作室场景

Blender 3D 播客场景

探索 3:SoulX-FlashTalk 数字人 — AI 生成的说话人头像(音频驱动口型同步)

数字人 1 数字人 2 数字人 3

legacy/开源仓库 README/ 中收集了调研过的开源项目文档(Qwen3-ASR、SoulX 系列、LTX-2 等),供有兴趣深入探索的开发者参考。


常见问题

Q: 渲染一个 30 分钟的视频需要多久?磁盘需要多大?

渲染时间取决于 CPU 性能。每帧需要用 Pillow 绘制 1920x1080 的图像,30 分钟 = 43200 帧(24fps)。在 M1 MacBook Pro 上大约需要 30-60 分钟。

磁盘空间:渲染过程中会产生临时 PNG 帧文件,像素风图片压缩后每帧约 500KB-1MB,30 分钟峰值约 20-40GB。渲染完成(或中途失败)后,临时帧文件会自动清理(通过 try/finally 保证),最终只保留一个 MP4 文件(通常几百 MB)。建议渲染前确保磁盘有 40GB+ 可用空间。

Q: 为什么字幕显示为空白?

可能是系统缺少中文字体:

  • macOS: 内置苹方字体,通常不会有问题
  • Windows: 需要微软雅黑(msyh.ttc),Windows 10+ 默认自带
  • Linux: 需要安装 CJK 字体:sudo apt install fonts-noto-cjk

Q: 可以不用 AI 剪辑,直接渲染吗?

可以。直接跳到 Step 4,它会自动使用 Step 2 的 ASR 转录结果渲染。适用于音频已经人工剪辑好的场景。

Q: 支持哪些 LLM?

支持任何兼容 OpenAI Chat Completions API 格式的服务:

  • OpenAI (GPT-4o, GPT-4, ...)
  • Anthropic Claude (通过兼容层)
  • DeepSeek
  • 通义千问 (Qwen)
  • Moonshot (Kimi)
  • 本地部署的 LLM (Ollama, vLLM, ...)

.env 中配置 LLM_BASE_URLLLM_MODEL 即可。


License

MIT

About

AI 播客后期全自动 Pipeline — 从录音到像素风动画视频,一键完成转录、智能剪辑、视觉编排和渲染

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages