
sunyuzheng/lizheng-video-production
Developer tools立正视频后期生产工具:转录、校对、字幕、文章、高光与标题生成
Обзор
lizheng-video-production 把视频或已有字幕整理成可靠的字幕交付和按需发布资产:高光、文章、标题与 YouTube description。仓库同时包含可执行工具、视频编排 skill 与可独立使用的 video-title-and-cover skill;自动化边界、外部能力和草稿发布被明确分开。 - Apple Silicon Mac;主 ASR 基于 MLX。 - Python 3.10 或更高。说话人标注建议使用单独的 Python 3.11+ 环境。 - ffmpeg 与 ffprobe。 - 已安装并登录 Codex CLI。Claude Code CLI 是内容生成的可选 fallback,需要降级能力时再安装并登录。 AI 文本步骤使用已登录 CLI,不直接读取云 API key。可选的 pyannote 模型需要 Hugging Face 账号授权。 如果系统 python3 低于 3.10,用已安装的具体版本创建 venv,例如 /opt/homebrew/bin/python3.12 -m venv venv。首次转写会下载 Qwen3-ASR 模型;下载大小与模型 revision、缓存状态有关,请预留充足磁盘空间。 视频编排入口是 lizheng-video-editing;只做标题与封面时可以仅安装独立入口。在仓库根目录执行: 命令故意不带强制覆盖参数;目标已存在时先检查它指向哪里,再决定是否迁移。旧名 kdb-video-post-production 已弃用,不再是 frontmatter 或安装文档的当前名称。 没有当期专有名词时用 --no-seeds。单期实体只走 seeds;只有跨期复用且确认过的术语才进入 data/channel_vocab.json。 不传 --skip-transcribe 时,即使工作区已有 .qwen.srt 也会在隔离目录重跑 ASR;只有当前运行产出唯一且结构有效的 SRT 才刷新 raw,失败时保留上一版。 字幕 QC 是依赖门。除结构、时长、字数和阅读速度外,自动 candidate 还会检查重断句前后正文字符流,并筛查连续的机械等长边界;触发时保存诊断用 SRT 和报告、退出非零,不会晋升 SRT/VTT 或继续生成下游。
README
课代表立正 · 视频后期生产
lizheng-video-production 把视频或已有字幕整理成可靠的字幕交付和按需发布资产:高光、文章、标题与 YouTube description。仓库同时包含可执行工具、视频编排 skill 与可独立使用的 video-title-and-cover skill;自动化边界、外部能力和草稿发布被明确分开。
它真正完成什么
| 能力 | 自动化等级 | 入口/依赖 |
|---|---|---|
| 本地 ASR、全文精校、重新断句、字幕 QC、VTT | 主流程自动 | tools/process_video.py |
| 高光、文章、标题、YouTube description | 主流程按需生成;标题与 description 有格式门,高光与文章需编辑验收 | Codex CLI,失败时 Claude CLI fallback |
| 说话人区分与可选声纹映射 | 独立脚本 | pyannote + ffmpeg |
| 口头禅/重复/假启动的非破坏性剪辑 | 独立脚本,edit plan 需先审核 | tools/render_filler_cuts.py + ffmpeg |
| 双 WAV 漂移对齐、剪前导、社区版压制 | agent 制作 recipe,不是主脚本自动能力 | ffmpeg/ffprobe |
| 标题与 16:9、3:4 封面 | 独立封标 skill;图像按需实际制作 | video-title-and-cover、可用设计工具与品牌资产 |
| Google Doc、社区/Circle 草稿 | 外部 connector 或浏览器操作 | 只创建草稿;发布另需批准 |
目录:
skill/ 视频任务路由、交付契约和条件制作说明
skills/video-title-and-cover/ 独立封标 skill 与 canonical 规范
tools/ 可执行脚本
tests/ 确定性行为和失败语义测试
data/ 规范兼容链接、频道样本、术语、writing-skill fallback
DESIGN.md 长期技术决策
Fresh clone
前提
- Apple Silicon Mac;主 ASR 基于 MLX。
- Python 3.10 或更高。说话人标注建议使用单独的 Python 3.11+ 环境。
ffmpeg与ffprobe。- 已安装并登录 Codex CLI。Claude Code CLI 是内容生成的可选 fallback,需要降级能力时再安装并登录。
AI 文本步骤使用已登录 CLI,不直接读取云 API key。可选的 pyannote 模型需要 Hugging Face 账号授权。
安装代码
git clone https://github.com/sunyuzheng/lizheng-video-production.git
cd lizheng-video-production
python3 --version
python3 -m venv venv
venv/bin/pip install -r requirements.txt
ffmpeg -version
codex --version
claude --version # 可选 fallback
如果系统 python3 低于 3.10,用已安装的具体版本创建 venv,例如 /opt/homebrew/bin/python3.12 -m venv venv。首次转写会下载 Qwen3-ASR 模型;下载大小与模型 revision、缓存状态有关,请预留充足磁盘空间。
安装 skill
视频编排入口是 lizheng-video-editing;只做标题与封面时可以仅安装独立入口。在仓库根目录执行:
mkdir -p ~/.codex/skills
ln -s "$(pwd)/skills/video-title-and-cover" ~/.codex/skills/video-title-and-cover
test -f ~/.codex/skills/video-title-and-cover/SKILL.md
需要完整视频编排时,再安装:
mkdir -p ~/.codex/skills
ln -s "$(pwd)/skill" ~/.codex/skills/lizheng-video-editing
test -f ~/.codex/skills/lizheng-video-editing/SKILL.md
如果同时使用 Claude skill:
mkdir -p ~/.claude/skills
ln -s "$(pwd)/skill" ~/.claude/skills/lizheng-video-editing
test -f ~/.claude/skills/lizheng-video-editing/SKILL.md
命令故意不带强制覆盖参数;目标已存在时先检查它指向哪里,再决定是否迁移。旧名 kdb-video-post-production 已弃用,不再是 frontmatter 或安装文档的当前名称。
三个常用 recipe
1. 全链路
caffeinate -i venv/bin/python tools/process_video.py /path/to/video.mp4 \
--seeds 嘉宾名 公司名 产品名
访谈若要独立社区帖,而不是随视频伴读:
caffeinate -i venv/bin/python tools/process_video.py /path/to/video.mp4 \
--article-type interview \
--article-surface community \
--seeds 嘉宾名 公司名
没有当期专有名词时用 --no-seeds。单期实体只走 seeds;只有跨期复用且确认过的术语才进入 data/channel_vocab.json。
不传 --skip-transcribe 时,即使工作区已有 .qwen.srt 也会在隔离目录重跑 ASR;只有当前运行产出唯一且结构有效的 SRT 才刷新 raw,失败时保留上一版。
2. 只做字幕、VTT 和 QC
caffeinate -i venv/bin/python tools/process_video.py /path/to/video.mp4 \
--seeds 嘉宾名 公司名 产品名 \
--skip-highlights --skip-article --skip-titles --skip-youtube-description
字幕 QC 是依赖门。除结构、时长、字数和阅读速度外,自动 candidate 还会检查重断句前后正文字符流,并筛查连续的机械等长边界;触发时保存诊断用 SRT 和报告、退出非零,不会晋升 SRT/VTT 或继续生成下游。风险筛查不代替人工语义通读,处理方法见 skill/references/subtitle-delivery.md。
3. 已有 SRT,只补内容
venv/bin/python tools/generate_highlights.py /path/to/video.final.srt \
-o /path/to/delivery
venv/bin/python tools/generate_article.py /path/to/video.final.srt \
-o /path/to/delivery \
--workspace-dir /path/to/video_process \
--highlights /path/to/delivery/video.highlights.md \
--article-type interview --surface companion
venv/bin/python tools/generate_titles.py /path/to/delivery/video.article.md \
-o /path/to/delivery \
--workspace-dir /path/to/video_process \
--source-srt /path/to/video.final.srt
venv/bin/python tools/generate_youtube_description.py /path/to/video.final.srt \
-o /path/to/delivery
文章按类型只加载一个主责 writing skill:访谈使用 expert-interview-article,单口使用 substance-writing-review。本机没有当前 skill 时使用 data/writing-skills/ fallback;其中 substance-writing-review.md 同步自公开仓库 https://github.com/sunyuzheng/substance-writing-review 的自包含主文件。实际注入的文件、来源和 hash 会保存到本期工作区。自动流水线不会自行读取其中按需引用的外部 reference,因此 fallback 主文件必须能独立承担写作契约。
标题流程会先读取完整文章或带时间线的完整 SRT,保存一份 packaging_brief.md。它不概括整期,也不从最稀奇的事实倒推 relevance;它先找核心观众在这个题材上原本就有的观看动机,再扫描能改变理解的强事实、数字、冲突、人物关系和机制,保住可能被摘要磨平的现场问题。候选从一开始就是标题 × 封面组合,先比较不同观看承诺,再磨措辞。独立 challenger 在看见 brief 和首轮候选之前先重读源材料、另做一套候选,下一轮才把两套方案放在一起冷读,以减少首轮锚定;这种模型判断不是观众实测。输入文章并传入 --source-srt 时,brief 与 challenger 都优先读取完整逐字稿,文章作为辅助;同一 SRT 另为终审提供 cue-level 开头定位。主流程会自动传入本次 final SRT,终审也直接读取当前频道 guideline。编辑规范的 owner 是 skills/video-title-and-cover/references/editorial-judgment.md,旧 data/guideline_kedaibiao.md 为仓内相对链接,标题与高光脚本均直接读到新正文;完整 clone 不依赖本机另一份 skill。
终稿还会把开头当作同一包装的下一拍:访谈里若有干净原话能确认标题承诺并抬高问题,就给出 cue-level in/out 与可回查原话的 package-specific cold open;若最强 premise 需要跨片段综合,则给出可补录的主持人 narrative intro 和进入正片的位置。可用的 .speaker_labeled.srt 会自动校验并采用,也可以显式加 --speaker-srt /path/to/video.speaker_labeled.srt;没有可靠 sidecar 时不替原片声音强行标注“主持人/嘉宾”。一般高光用于发现 substance,不默认按顺序拼成开场。最终稿仍需要编辑判断,多轮输出不等于自动选中了可发布标题。
surface 含义:
| 值 | 产物 |
|---|---|
article |
不依赖视频的独立文章 |
community |
不依赖视频的社区帖 |
companion |
带观看导航的视频伴读/活动回放 |
release |
较短发布介绍 |
auto |
访谈默认 companion,单口默认 article |
主入口参数
以 python3 tools/process_video.py --help 为最终真值。常用参数:
| 参数 | 说明 |
|---|---|
--skip-transcribe / --skip-correct |
跳过对应步骤;后续使用的 raw SRT 会明示打印,不自动挑选旧 corrected/final |
--subtitle-source PATH |
显式使用已有 corrected/final SRT,并跳过 ASR 与校对 |
--skip-highlights / --skip-article / --skip-titles / --skip-youtube-description |
只是不生成该资产;不会把同目录旧文件注入本次下游 |
--article-type auto|interview|monologue |
文章素材类型;信号不足时 auto 不凭主题猜 |
--article-surface auto|article|community|companion|release |
文章发布契约 |
--article-writing-skill PATH |
固定或重新使用此前保存的 writing-skill 主文件;完整复现还需相同代码与本期素材 |
--seeds ... / --no-seeds |
当期实体与 ASR 上下文 |
--model MODEL |
显式覆盖 Codex 字幕精校模型;默认使用 CLI 配置 |
--correction-timeout SECONDS |
全文精校超时,默认 900 秒 |
--process-dir PATH |
自定义工作区 |
--max-chars N |
每条字幕最大可见字符,默认 20 |
维护频道词汇
data/channel_vocab.json 是运行时文件,只保留 schema_version、verified_candidates 和 hotwords_context。人工确认的源分别是 data/verified_corrections.json 与 data/verified_hotwords.txt:
python3 tools/extract_channel_vocab.py \
--channel-root /path/to/kedaibiao-channel \
--candidates data/verified_corrections.json \
--hotwords-file data/verified_hotwords.txt \
--output data/channel_vocab.json
历史字幕里自动推断出的专有词和混淆对只在显式 --audit-output 时另存审计文件,不直接进入 runtime。这样不会把“出现频率高”误当成“可以自动改”。
产物与失败语义
交付区是源媒体目录,只放可使用的最终资产:
| 文件 | 用途 |
|---|---|
.final.srt / .final.vtt |
通过 QC 的同文字幕 |
.speaker_labeled.srt/.md |
可选说话人归因稿 |
.highlights.md |
高光、时间戳与剪辑定位 |
.article.md |
指定 surface 的文章 |
.titles.md |
首选与备选标题 × 封面组合、兑现位置,以及可执行的 cold open/补录开头 |
.youtube-description.txt |
已验证的 description 与章节 |
.clean.mp4 |
可选非破坏性清理版;重映射字幕在通过复核与 QC 前仍是 candidate |
工作区默认是 _process/,包含 raw ASR、corrected 字幕、字幕 QC、article brief/context、writing-skill 快照、editorial notes、diarization 数据和标题轮次草稿。
主流程失败会退出非零。诊断文件可能仍然存在,目录里也可能有此前运行的旧产物;以本次退出码、终端摘要和 QC 报告为准,不用“看见文件”代替成功判断。
可选:说话人归因
安装独立环境:
/opt/homebrew/bin/python3.11 -m venv venv-diarization
venv-diarization/bin/pip install -r requirements-diarization.txt
venv-diarization/bin/hf auth login
按 Hugging Face 页面提示接受 pyannote 模型条款。最轻量的 diarization:
venv-diarization/bin/python tools/speaker_attribution.py /path/to/video.mp4 \
--srt /path/to/video.final.srt --num-speakers 2
有单人参考音频时:
venv-diarization/bin/python tools/build_speaker_refs.py /path/to/solo.m4a \
--speaker host --out-dir data/speakers/host/refs --count 3 --clip-seconds 10
venv-diarization/bin/python tools/speaker_attribution.py /path/to/video.mp4 \
--srt /path/to/video.final.srt \
--speaker-ref host=data/speakers/host/refs/host_ref_01_000120s.wav \
--assign-remaining guest --num-speakers 2
参考音频文件名末尾的秒数由 build_speaker_refs.py 自动生成;上面的 000120s 只是示例,实际命令使用脚本刚输出的路径。
声纹是生物识别材料,不提交 GitHub。ASR 负责“说了什么”,diarization 只负责“谁在说”;低置信位置保留 UNKNOWN/MIXED。
高光和文章只会自动采用与当前 final SRT 的 cue 时间轴和去除 speaker 前缀后文字一致的 .speaker_labeled.srt;无法校验或已过期的 sidecar 不会替换本次逐字稿。
可选:口头禅与假启动剪辑
先建立并审核 _process/.filler-cuts.json,然后 dry-run:
venv/bin/python tools/render_filler_cuts.py /path/to/video.mp4 \
/path/to/video_process/video.filler-cuts.json \
--output /path/to/video.clean.mp4 \
--srt-in /path/to/video.final.srt \
--srt-out /path/to/video_process/video.clean.candidate.srt \
--dry-run
确认区间和预计删减时长后去掉 --dry-run。脚本只执行 decision: "cut" 的区间,永不覆盖源视频。字幕会按同一计划重映射时间,但先命名为 .clean.candidate.srt;部分 cue 内的文字不会被猜测性改写,必须对照成片修字,再通过 subtitle_qc.py --promote-srt ... --write-vtt ... 晋升为 .clean.final.srt/.vtt。详细判断与命令见 skill/references/filler-cut-editing.md。
外部制作与发布
- 封标由
skills/video-title-and-cover/SKILL.md主责;完整双平台任务做独立 16:9/3:4,用户只要一个比例就只做该比例。人物选帧、原图要求、排版与实际成图交付见该 skill 的references/cover-production.md;原skill/references/cover-style-guide.md保留为兼容链接。 - 双 WAV、剪前导和社区版压制见
skill/references/longform-community-delivery.md。这些是 recipe,不是主脚本承诺。 - Google Doc、Canva 与平台草稿依赖已安装 connector/浏览器能力。仓库不会自动安装或检测这些外部服务。
- 本地稿与平台 draft 可以直接创建;公开发布、通知、群发或覆盖线上内容前必须展示最终 payload、目的地和受众并取得批准。
开发与验证
python3 -m unittest discover -s tests -p 'test_*.py'
python3 -m compileall -q tools tests
python3 tools/process_video.py --help
单元测试覆盖文件契约、失败语义、字幕重切/QC、模型 CLI 封装与文章 context。它们不替代真实的 ASR 下载、Codex/Claude 登录、pyannote、ffmpeg 全片解码或平台上传测试。
常见问题
ASR 看起来没动? 应使用当前 venv 同目录或 PATH 中的 mlx-qwen3-asr CLI,并保留可见进度。第一次运行还可能在下载模型。
校对显示 0 个修改? 这不是质量证明。结合画面、seeds 和语境抽查专有名词、数字与否定词。
为什么没有 VTT? 查看 _process/.subtitle_qc.md;QC 未通过时不会晋升 VTT。
Codex 不可用? 内容步骤会显式报告并尝试 Claude fallback;两者都不可用时失败,不把旧文件冒充本次结果。Codex 内容模型可用 LIZHENG_CODEX_CONTENT_MODEL(或通用的 LIZHENG_CODEX_MODEL)覆盖,Claude fallback 可用 LIZHENG_CLAUDE_FALLBACK_MODEL(或 LIZHENG_CLAUDE_MODEL)覆盖;不设置时使用各自 CLI 当前默认。
为什么 fresh clone 没有小红书专用 skill 或 Canva? 它们是可选外部能力。核心脚本自包含;外部能力可用时由 lizheng-video-editing 编排,不把个人机器路径写成仓库依赖。
Рекомендуемые инструменты
Попробуйте другой запрос или уберите фильтр.
Установка
npx skillfish add sunyuzheng/lizheng-video-production