我把中文口播视频生产流程,做成了一个 Codex Skill

我把中文口播视频生产流程,做成了一个 Codex Skill

最近我把自己使用的一套中文口播视频生成流程,整理成了一个可以复用的 Codex Skill,并公开到了 GitHub:

https://github.com/SJCZL/skill-video

这个 Skill 叫做 agnes-video,主要用来生成 45~60 秒的中文竖屏口播视频。

它并不只是"输入一句提示词,然后生成一段视频",而是把文案配音、画面分段、数字人口型、音画对齐、字幕生成和最终交付,串成了一套相对完整的生产流程。

为什么要做这个 Skill

在实际制作口播视频时,我遇到过几个比较典型的问题:

  • 长文案直接生成视频,容易出现口型逐渐失步
  • 每次生成的声音不够稳定
  • 固定时长切片会把一句话切断
  • 强行拉伸整段视频,会出现局部语速异常
  • 多段音频拼接后,音色、语气和停顿不够连贯
  • 数字人二次口型生成容易降低面部清晰度
  • 项目素材、缓存和最终成片容易混在一起

所以我希望这套流程满足几个目标:

  1. 整段视频只使用一条连续的主配音
  2. 根据真实配音时长动态切分画面
  3. 尽量保留 Agnes 原始生成的人脸和口型画面
  4. 通过词级时间戳做局部音画对齐
  5. 自动生成字幕和标准化交付目录
  6. 整个流程可以被 Codex 自动执行

整体工作流程

这套 Skill 以 MiniMax 生成的完整旁白作为时间基准。

完整口播文案
    ↓
MiniMax 生成连续旁白和词级时间戳
    ↓
根据标点与真实语音时长动态切分
    ↓
Agnes 分段生成数字人口播画面
    ↓
Faster-Whisper 识别 Agnes 原始语音
    ↓
建立 Agnes 与 MiniMax 之间的词级时间锚点
    ↓
对画面进行分段、非线性变速
    ↓
移除 Agnes 原始音频
    ↓
合入完整 MiniMax 旁白
    ↓
生成字幕并输出最终 MP4

其中一个比较重要的设计是:不直接重新生成嘴部区域

Agnes 生成的视频会暂时保留原始音频,系统通过 Faster-Whisper 识别这段音频,再与 MiniMax 返回的词级时间戳进行匹配。

匹配成功后,脚本会建立一组单调递增的时间锚点,对原始画面进行分段变速,使画面中的说话节奏尽可能贴近最终旁白。

这样可以减少二次生成嘴部区域带来的面部模糊、身份漂移和画质下降。

动态切分,而不是固定切片

很多视频工作流会简单地每隔 5 秒或 10 秒切一段。

这种方式虽然容易实现,但经常会把一句话从中间切断。

agnes-video 会结合以下信息生成切分方案:

  • MiniMax 返回的真实配音时长
  • 文案中的句号、逗号和停顿位置
  • Agnes 单段视频的时长限制
  • 每段口播的语义完整性
  • 目标视频总时长

默认情况下,它会优先寻找接近 14 秒的自然切分点,并保证每段不超过 Agnes 的最大时长限制。

一段 45 秒的口播通常会生成约 3 个视频片段,一段 60 秒的口播通常会生成约 4 个片段。

Skill 包含什么

仓库目前包含一个 agnes-video Skill:

agnes-video/
├── SKILL.md
├── .env.example
├── agents/
│   └── openai.yaml
├── assets/
│   └── finance-adviser-profile.json
├── references/
│   └── agnes-video-v20.md
└── scripts/
    ├── agnes_video.py
    ├── minimax_tts.py
    ├── minimax_clone_voice.py
    ├── produce_talking_video.py
    ├── retime_visual_to_narration.py
    ├── timestamps_to_srt.py
    └── burn_srt_overlay.py

各个脚本分别负责:

  • agnes_video.py:创建、查询和下载 Agnes 视频任务
  • minimax_tts.py:生成完整旁白与词级时间戳
  • minimax_clone_voice.py:创建经过授权的声音克隆
  • produce_talking_video.py:编排完整视频生产流程
  • retime_visual_to_narration.py:按照词级锚点调整画面节奏
  • timestamps_to_srt.py:生成忠于原始文案的 SRT 字幕
  • burn_srt_overlay.py:将字幕安全地烧录到视频画面中

安装方法

首先克隆仓库:

git clone https://github.com/SJCZL/skill-video.git

然后把 Skill 复制到 Codex 的 skills 目录:

cp -R skill-video/agnes-video ~/.codex/skills/

重新打开 Codex 后,就可以通过 $agnes-video 调用它。

环境准备

这套流程需要:

  • Python 3
  • FFmpeg
  • Agnes Video API
  • MiniMax API
  • Faster-Whisper
  • Pillow,用于字幕烧录

API Key 只应保存在本机环境变量或者不会提交到 Git 的本地配置中。

export AGNES_API_KEY="你的本地 Agnes API Key"
export MINIMAX_API_KEY="你的本地 MiniMax API Key"
export TALKING_VIDEO_ALIGNMENT_PYTHON="/包含 faster-whisper 的 Python 路径"

仓库中的 .env.example 只有变量名称和占位符,不包含任何真实凭据。

运行完整视频流程

准备好完整文案和人物参考图后,可以运行:

python3 scripts/produce_talking_video.py \
  --script-file /absolute/path/script.txt \
  --reference-image /absolute/path/presenter.png \
  --project-dir /absolute/path/project-name \
  --output-root /absolute/path/output \
  --output-name topic-name \
  --voice-profile assets/finance-adviser-profile.json \
  --target-seconds 55 \
  --subtitle

默认输出规格为:

  • 竖屏 9:16
  • 分辨率 704 × 1280
  • 帧率 24fps
  • 建议时长 45~60 秒
  • 可选字幕版本
  • MP4 格式交付

最终文件会按照日期整理:

output/
└── YYYY-MM-DD/
    ├── topic-name_9x16.mp4
    ├── topic-name_9x16_subtitled.mp4
    └── topic-name.srt

API 任务、原始片段和对齐文件会保存在 projects/ 中,最终交付文件则统一放在 output/YYYY-MM-DD/ 下。

关于声音克隆

Skill 支持复用 MiniMax 的克隆声音,但声音克隆必须建立在本人声音或已经获得明确授权的声音基础上。

如果已有可用的 voice_id,应该直接复用,不需要每次重新克隆。

这样既可以减少重复操作,也能让不同视频之间的音色、情绪和语速保持一致。

安全与开源边界

在整理仓库时,我把本地生产环境和可公开的 Skill 源码做了明确区分。

以下内容不会提交到 GitHub:

  • Agnes 和 MiniMax API Key
  • 本机 .env 文件
  • Python 虚拟环境
  • 原始人物素材
  • 声音训练素材
  • 视频项目缓存
  • API 中间结果
  • 已生成的 MP4、MP3、WAV 等文件
  • 私钥、证书和本机凭据

仓库只保留可复用脚本、Skill 说明、参考文档和非敏感配置模板。

写在最后

我认为 AI 视频工作流真正有价值的部分,不只是"能生成一段视频",而是能不能形成一套稳定、可重复、可检查的生产流程。

这次整理的 agnes-video Skill,主要解决的是中文口播视频中的连续配音、自然分段、口型同步、字幕生成和文件交付问题。

后续我也会继续完善这套流程,例如:

  • 增加更多人物与声音配置
  • 优化中文词级对齐效果
  • 增加批量文案生产能力
  • 完善失败任务重试机制
  • 支持更多视频生成模型
  • 增加成片质量自动检查

项目地址:GitHub:SJCZL/skill-video

如果你也在使用 Codex、Agnes 或 MiniMax 制作中文口播视频,欢迎尝试、提交 Issue,或者一起完善这套工作流。