JZSub:丢给 Codex 一个视频链接,自动生成双语字幕成片
https://github.com/pengchujin/jzsub
前两天刚写了 BaoCut,今天又看到一个处理视频字幕的 Skill:JZSub。
它们看起来有点像,侧重点其实不同。BaoCut 更接近一套由 Agent 操作的字幕和口播剪辑工具,JZSub 则把任务收得很窄:给它一个视频链接,自动下载视频、取得原始字幕、翻译成双语字幕,再烧录成 MP4。
如果只是想把一段 YouTube 外语视频保存下来,做成可以直接观看和分享的中外双语字幕版,这条流水线挺省事。
它不是视频 App,而是一条 Codex 流水线
JZSub 是一个开源 Codex Skill,底层主要调用 yt-dlp、FFmpeg 和当前会话里的大模型。它本身没有单独的翻译 API,也没有桌面界面。
开始任务后,它会先用 yt-dlp 选择可用的最佳视频和音频,尽量保留源素材质量;格式兼容时直接封装为 MP4,同时下载平台封面和字幕。项目列出的常用平台包括 YouTube、Bilibili、Vimeo、Twitch、Dailymotion 和 TikTok,其他站点取决于 yt-dlp 的实际支持情况。
拿到字幕以后,JZSub 不会把整份字幕一次性塞进模型,而是按顺序拆成紧凑的小批次。每一批会带上前后文,方便模型判断人名、代词和术语,翻译结果再按句子边界重新整理。原始字幕文件会保留,不会被翻译流程改写。
最后一步交给带 libass 的 FFmpeg,把原文和译文上下堆叠烧进视频。横屏和竖屏使用不同的字号与底部安全距离,竖屏短视频不会简单照搬横屏字幕布局。
让我觉得实用的几个细节
第一,翻译直接使用当前正在工作的 Codex 模型。你不必再准备另一套翻译服务和 API Key,模型也能根据相邻字幕保持上下文连贯。
第二,它不要求每次都跑完整流程。除了默认的双语字幕成片,还可以只下载视频和封面、只取原始字幕,或者只生成双语 SRT/ASS 字幕文件。临时需要素材时,不必为了拿一份字幕把视频重新烧录一遍。
第三,Skill 对“任务完成”管得比较严。下载结束不等于交付完成,完整模式还要继续检查翻译、字幕渲染和最终 MP4;验证脚本通过后,才算真正做完。这一点很适合 Agent 工作流,否则 AI 很容易跑完第一条命令就停下来汇报成功。
需要登录的视频,JZSub 可以在必要时读取本机 Chrome 的登录状态。它的规则明确要求 Cookie 只在本地静默使用,不导出、不打印,也不让 Agent 查看具体内容。
安装和使用
项目推荐用下面的命令安装到 Codex:
npx skills add pengchujin/jzsub --skill jzsub -g -a codex -y
安装完成后,在新的 Codex 任务中输入:
$jzsub https://www.youtube.com/watch?v=VIDEO_ID
项目需要 Node.js 18+、Python 3.10+、yt-dlp、Deno 2.3+、带 libass 的 FFmpeg/ffprobe,以及 MiSans Bold 字体。它采用 MIT 许可证。
有一个限制要先说清楚
JZSub 目前依赖平台已有的人工字幕或自动字幕。如果视频没有可用字幕,它可以继续交付视频、封面和 MP4,但不会凭空生成字幕。仓库已经把 Whisper 本地转写列入待办事项,目前还不是默认能力。
各平台能否下载、能拿到什么清晰度和字幕,也会受登录状态、地区、平台规则和 yt-dlp 解析器变化影响。它不会绕过 DRM、付费墙、验证码或平台安全限制,只适合处理自己有权访问和保存的内容。
所以,JZSub 不是万能的视频搬运器。它更适合这样一个具体场景:经常看到值得保存的外语公开视频,希望少做几次复制、翻译、对轴和导出的重复操作,最后直接拿到一份双语字幕成片。
对于已经在用 Codex 的人,这种“一个链接进去,视频、封面、字幕和成片出来”的 Skill,比再开几个网页工具来回倒文件顺手得多。