Communitygithub.com

zaddy99999/captions

本地语音转录并生成带单词级时间戳的字幕(使用 faster-whisper,无需 API 密钥),支持将带高亮效果的样式化字幕烧录到视频中,或导出为 SRT 格式。适用于用户需要视频字幕、带单词时间轴的转录稿,或确保剪切点不会落在单词内部的情况。

captions 是什么?

该技能提供了一整套本地化的语音转录与字幕生成流水线,专为需要高质量、单词级时间戳的开发者和视频创作者设计。它利用 faster-whisper 进行离线转录,无需依赖外部 API,首次运行会从 Hugging Face 下载模型,若下载失败则以预期方式退出而非生成虚假转录。脚本集成了制作 ASS(高级字幕格式,支持当前单词高亮)和 SRT 字幕文件的功能,并使用 libass 滤镜将字幕烧录到视频中。此外,它还包含一个“snap-to-words”工具,可将剪切点自动对齐到单词间隙,避免切断单词。该技能支持自定义字幕样式(如字号、边距、轮廓和高亮色),并提供了从转录、制作字幕、烧录到验证的完整工作流程。适用于 Mac、Windows、Linux 等支持 Python 和 Node.js 的平台。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/zaddy99999/video-editing-skills/tree/main/skills/captions

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

captions 是做什么的?

本地单词级转录、短视频字幕样式设计与烧录。

脚本位于 scripts/ 目录:

脚本功能
transcribe.py使用 faster-whisper(启用 word_timestamps=True)生成 words.json(缓存结果)
make-captions.mjs将 words.json 转换为 ASS(支持当前单词高亮)和 SRT 格式
burn.mjs使用 libass 的 ass / subtitles 滤镜烧录 ASS/SRT 字幕
snap-to-words.mjs将剪切点移动到最近的单词间隙

工作流程

  1. 转录(每个源文件只需执行一次,结果会缓存):
    pip install faster-whisper            # 只需执行一次
    python3 scripts/transcribe.py --input clip.mp4 --out edit/clip.words.json --model small --language en
    
    首次运行会从 Hugging Face 下载模型。如果下载被阻止,脚本会以退出码 4 和一条 JSON fix 消息退出,而不会抛出堆栈跟踪,并且永远不会写入虚假转录。将 --model 指向本地的 CTranslate2 模型文件夹即可离线工作。
  2. 生成字幕:
    node scripts/make-captions.mjs --words edit/clip.words.json --out-ass edit/clip.ass --out-srt edit/clip.srt
    
    样式来自品牌包(captions 块:字号、边距、轮廓、高亮;colors.accent 是当前单词的颜色)。
  3. 烧录作为视觉处理的最后一步:
    node scripts/burn.mjs --input edit/clip-hook.mp4 --subs edit/clip.ass --out edit/clip-captioned.mp4
    
    当字幕字体是一个文件而非已安装字体时,使用 --fonts-dir。
  4. 验证:使用 render-qc 校对样片:确保字幕可读、在安全区域内、不覆盖钩板。

规则

  • 切勿在单词内部进行剪切。在分割语音之前,先将剪切点对齐到单词间隙: node scripts/snap-to-words.mjs --words edit/clip.words.json --markers edit/cuts.json --out edit/cuts.json
  • 字幕放在最后处理:在剪切、叠加和色彩调整之后。如果在转录后对剪辑进行了修剪,请向 make-captions.mjs 传递 --offset -<修剪的秒数>。
  • 对于短视频,每个字幕块包含 1 到 3 个单词(由 maxWords、maxChars 控制)。字幕块会在标点符号和停顿处断开。
  • 保持字幕不进入底部约 15% 的区域(平台 UI)并远离钩板:调整 captions.marginV。
  • 转录结果会被缓存:只有当音频发生变化时才使用 --force 重新运行。
  • 逐一检查单词是否与音频匹配;whisper 可能会听错名字和专业术语。如有需要,手动修正 words.json。

没有 ffmpeg libass 的情况

如果 burn.mjs 报告没有 ass 滤镜,说明 ffmpeg 构建缺少 libass。请安装一个完整构建版本(大多数包管理器都提供),或者将 SRT 作为单独的字幕轨上传而不要烧录进去。

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相关技能