SuperAPI AI 工具集

video-transcribe

写作与研究

查看项目

更新于 10-16 07:49

技能介绍

用途

video-transcribe 用于获取视频中最忠实的带时间戳文字稿,并明确告知该文字稿是否可信。它支持 YouTube URL、演讲视频或本地视频文件。当用户想要视频里的原话时使用,例如“转写这个”“给我文字稿”“他们说了什么”“抓取字幕”。

不适用场景:用户想要书面笔记或摘要(应使用 video-notes),或想要画面与屏幕文字(应使用 video-keyframes)。如果用户要的是笔记,video-notes 会自行调用本技能,不要直接运行本技能。

主要能力

  • 按优先级逐级获取文字稿:创作者手动字幕 → 视频自身语言的自动字幕 → 本地 ASR(Apple Silicon 上使用带 Metal 的 whisper.cpp,否则使用 faster-whisper)。
  • 从不使用自动翻译字幕。YouTube 将翻译字幕命名为 <目标语言>-<源语言>(如 en-de 表示“来自德语的英语”),机器翻译叠加机器转写会放大两种错误率。脚本会先解析视频自身语言;当 yt-dlp 报告 language: NA(常见情况)时,回退到翻译列表的共享源语言子标签。
  • 输出 transcript.json(毫秒级时间片段)和 metadata.json。
  • 给出质量判定:pass、warning 或 fail,并附带原因代码。
  • 采集与质量判定完全确定性,不涉及模型。

使用方式

运行提取脚本:

python3 "${CLAUDE_SKILL_DIR}/scripts/fetch_transcript.py" "<url-or-file>" --out <workdir>

常用参数:

  • --lang de:视频未声明语言时的首选语言。
  • --asr-model medium:音频较难时使用。
  • --no-asr:失败而非转写。
  • --force:覆盖已有输出。
  • --cookies-from-browser chrome 和 --sleep-requests 2:应对 IP 被限流或触发机器人检查,作用于每一次 yt-dlp 调用。

在用户期望输出位置旁创建 <workdir>,并在创建时写入包含 * 的 .gitignore,避免污染其仓库。

脚本会打印 JSON 摘要;失败时以非零退出码结束,并在 stderr 输出 {"error","message","fix"}。请按 fix 操作,不要自行发挥。

使用前先读质量判定

quality 字段为 pass、warning 或 fail:

  • pass:直接使用。
  • warning:可以使用,但在回答中向用户复述原因代码。
  • fail:退出码为 1。不要在其上构建任何内容,说明原因并提供修复方案。

原因代码包括:empty_transcript、suspiciously_short、short_for_duration、low_characters_per_minute、highly_repetitive、repetitive、very_low_timed_coverage、low_timed_coverage、large_segment_gap。

highly_repetitive 几乎总意味着两种情况之一:Whisper 在静音处循环,或滚动字幕未去重。两者都会使文字稿无法用于引用。可用 --asr-model medium 重试,或直接报告。

报告结果

告知用户文字稿来自哪一级——manual、auto 或 asr——以及语言。手动字幕是创作者自己的文本;asr 文字稿是猜测。这一区别影响用户对引用的信任程度。

字幕优先级阶梯及顺序原因

  1. 手动/创作者字幕:有真实标点、大小写和说话人标签。
  2. 视频自身语言的自动字幕:无标点,但时间对齐。
  3. 本地 ASR(Apple Silicon 上使用带 Metal 的 whisper.cpp,否则使用 faster-whisper)。

详细选择规则见 references/caption-ladder.md。

输出

<workdir>/
├── transcript.json   # {kind, track, quality:{status,reasons,metrics}, segments:[{start_ms,end_ms,text}]}
└── metadata.json     # {source, video_id, title, channel, url, duration_s, upload_date, language, chapters, ...}

时间戳为整数毫秒。面向人类时渲染为 HH:MM:SS;不要把格式化字符串作为事实来源存储,也不要自行计算时间戳——使用文件中的值。

失败模式

  • missing_dependency:缺少 yt-dlp / ffmpeg。运行修复命令,不要继续。
  • bot_check:YouTube 返回机器人挑战。执行 yt-dlp -U,然后使用 --cookies-from-browser chrome;数据中心 IP 无解。
  • rate_limited:字幕请求返回 HTTP 429。实测重试、更换客户端和 cookies 均无效。需更换网络或等待数小时。ASR 仍可用。
  • restricted:私有/仅会员/年龄限制。需要浏览器 cookies,或改用本地文件。
  • no_asr_backend:无字幕且无 Whisper。按 fix 安装后端,或接受无文字稿。
  • transcript_quality_fail:质量门禁拒绝。报告原因代码,不要在其上构建。

另外两点:

  • yt-dlp 需要 JS 运行时。近期版本警告无 JS 运行时的提取已弃用,且部分格式会缺失。若提取质量下降,可安装 deno。
  • 零字节字幕文件不是文字稿。脚本会删除空产物,而不是将其解析为看似成功的空结果。

适用场景与限制

适用于用户可访问内容的个人笔记。从 YouTube 下载与其服务条款冲突,字幕可能受版权保护。不要用它整体重新发布文字稿。