Communitygithub.com

aly shadotmd/视频字幕

为竖屏(9:16)人物讲话视频添加硬编码字幕:精确的单词时间码,每次一个单词或按语义分组的短句,白色描边的 Figtree Bold 字体,可选高亮当前单词,并放置在安全区域内,避开人脸和钩子标题。专为 Claude Code 和 Runneth 构建。在完成画面裁剪和标题之后,当有人要求添加字幕、副标题或屏幕文字时使用。

视频字幕 是什么?

该技能用于为竖屏(9:16)人物讲话视频自动生成并烧录内嵌字幕。它使用 faster-whisper 进行高精度逐词时间戳转录,并依据语义将字幕切分为 1-5 个单词的短句,确保每个视觉片段都是完整的意义单元。字幕样式采用 Figtree Bold 字体,白色描边,无背景框或阴影,视觉简洁。技能支持两种显示模式:逐词显示或短语批次显示,后者还可选“卡拉OK”式高亮当前朗读单词。字幕自动居中放置在视频的安全区域(x 100-880, y 290-1340)内,且始终低于讲话者下巴、避开钩子标题,并通过人脸检测确保不遮挡五官。最终使用 ASS 字幕格式和 FFmpeg 高画质编码(x264, crf 14-18)一次合成输出。该技能专为 Claude Code 和 Runneth 平台设计,依赖 video-editing-setup 安装的视频工具链,并能在编辑过程中根据操作者反馈动态维护字幕规则集。

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

在你喜欢的 AI 中提问

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

文档

字幕

目标:让观众毫不费力地阅读的字幕。每一条字幕都是一个简短、完整的语义单元,与精确的单词时间码对齐,并在整个视频中始终显示在同一个位置。

这是编辑顺序的第5步:A卷剪辑、B卷、画面裁剪、标题、字幕。它在完成画面裁剪和标题后的视频上运行,以便字幕不干扰标题。

此技能专为 Claude Code 和 Runneth 构建。

开始之前:工具

在 Runneth 中,所有工具都已安装:跳过此部分。

在 Claude Code 中,此技能需要 video-editing-setup 技能安装的免费视频工具。请静默检查 ~/.video-editing-tools/bin/ffmpeg -version 是否能运行。如果能运行,请在本技能中使用 ~/.video-editing-tools/bin 目录下的工具(ffmpeg、ffprobe、python)来代替 ffmpeg、ffprobe 或 python3,然后继续。如果不能运行,请先按照 video-editing-setup 技能进行操作,然后再回到此处。

字体: Figtree Bold,此技能唯一使用的字体。它是一种免费的 Google 字体。请静默检查该字体是否已安装在计算机上或项目旁边的 fonts 文件夹中。如果没有,请询问:“这里使用的 Figtree 是一种免费的 Google 字体。需要我为您下载吗?”如果回答是,请从 Google Fonts(fonts.google.com/specimen/Figtree)下载 Figtree Bold 文件到项目旁边的 fonts 文件夹中,然后继续。此检查同样适用于 Runneth。

需要的内容

  • 已裁剪好并带有标题(或其时间码)的视频。
  • 脚本(如果有),以确保名称和产品单词拼写正确。
  • 标题在屏幕上的显示时间及其位置。

第 0 步:先询问样式

逐个询问以下问题,每次等待回答:

  1. “您希望字幕每次显示一个单词,还是每次显示几个单词?”
  2. 仅当选择“每次几个单词”时:“您希望正在说的单词以不同颜色高亮显示吗?”
  3. 仅当回答“是”时:“使用哪种颜色?”建议使用亮黄色 (#FFFF3A) 作为默认颜色,或使用其品牌色。

第 1 步:获取每个单词及其时间码

  1. 使用 faster-whisper base 模型(word_timestamps=True、vad_filter=False)转录视频自身的声音并获取单词时间码。时间码必须来自当前这个确切的视频,因为每次剪辑都会改变它们。
  2. 使用脚本中的拼写来校正名称、品牌和产品词汇,同时保留转录的时间码。
  3. 每个说出的单词都应有对应的字幕。未说出的内容不应添加字幕。

第 2 步:按语义拆分为短语(仅适用于“每次几个单词”模式)

  1. 通常每个短语 1 到 3 个单词,最多约 5 个,以便在保持短语完整性的同时适应宽度。
  2. 保持以下内容在一起: 名词及其修饰词(“a sleep drink”)、名称(“Claude skill”)、动词及其附属词(“go to bed”)以及短小的完整想法(“but that's how I felt”)。
  3. 每个短语以承载意义的单词结尾。 小词(the、a、of、to、and、because、that、I)应放在下一个短语的开头。
  4. 每个短语从其第一个单词开始显示,直到下一个短语开始,确保屏幕在句子中间不会出现空白闪烁。
  5. 通读整个列表(像观众一样),修复任何读起来拗口的断句位置。

第 3 步:外观

每条字幕均使用 Figtree Bold 字体,白色,带黑色描边。无背景框、无阴影、无弹出或弹跳动画:字幕只是简单地出现。大部分使用小写字母,仅 I、名称和品牌首字母大写,并且末尾不加句号或逗号。

  • 每次一个单词: 约 140px,6px 描边,屏幕上一次显示一个单词。每个单词保持显示直到下一个单词开始。长单词将缩小以适合约 720px 宽度。跳过第 2 步中的短语拆分过程。
  • 每次几个单词: 约 60px,3px 描边,使用第 2 步中生成的短语。
    • 单词高亮模式: 在短语内部,正在说的单词会变为所选颜色,卡拉 OK 风格。
    • 非高亮模式: 整个短语保持白色。

第 4 步:放置位置

  1. 居中,位于胸部高度,在 1080x1920 视频中大约 y 1260 到 1305 的位置:在下巴下方,在应用程序的字幕和按钮上方。
  2. 在安全区域内: 安全区域来自 post-preview 技能:在 1080x1920 帧上,将所有内容保持在 x 100 到 880,y 290 到 1340 范围内(这个框同时适用于 Reels、Stories、Feed、TikTok 和 Facebook)。当某些内容靠近边缘时,请参考 post-preview 以了解特定位置的确切覆盖区域。因此,居中的字幕(包括每个字母的描边)应保持在 x 200 到 880(约 680px 宽)以及 y 1340 以内。测量每个短语的宽度;过宽的短语将被拆分开。
  3. 避开标题。 当标题在屏幕上显示时,字幕应位于其下方并保持明显间距;当标题位置较低时,字幕应在安全区域内向下移动,而不是与标题重叠。
  4. 在整个视频中保持同一个位置,以便观众的眼睛始终知道在哪里寻找。
  5. 字幕位于嘴巴下方,切勿覆盖脸部。 每条字幕必须避开眼睛、鼻子和嘴巴。如果脸部位置过低,导致字幕放置区域会覆盖脸部,则说明是画面裁剪有问题:将其退回裁剪步骤进行修复(或在修复期间将字幕在安全区域内向下移动)。

第 5 步:构建与烧录

  1. 将字幕编写为 ASS 字幕文件。在单词高亮模式下,为每个单词使用一个事件,以便颜色随语音移动。字母间距使用内联的 \fsp 标签设置。
  2. 将渲染器指向仅包含 Figtree Bold 文件的 fonts 文件夹,以确保使用正确的字重:ass=captions.ass:fontsdir=fonts。
  3. 从全质量视频一次完成烧录(x264、slow 预设、crf 14 到 18),音频原样复制不做处理。

第 6 步:在公开前检查

  1. 每个单词出现一次,且时间准确: 逐字比对字幕列表与转录稿。
  2. 每个短语截图一帧检查: 确保在安全区域内,无内容截断,不与标题重叠,并且整个字幕位于嘴巴下方。使用人脸检测器或逐帧检查;任何覆盖脸部部分区域的字幕均视为检查不通过。
  3. 在单词高亮模式下,颜色应准确地落在正在说的单词上,在视频的几个时间点进行检查。

第 7 步:从编辑者那里学习

当编辑者更改了短语拆分、某个单词或外观时,请询问原因(除非他们主动说明)。将理由作为一条规则写入下方的“来自编辑者的字幕规则”中,使用应成立的描述方式。由你自己得出的原因应标记为“(AI)”,并且绝不更改已有规则。

来自编辑者的字幕规则

(初始为空。每次编辑者给出规则时添加。)

Individual skills in this repo

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

alyshadotmd/video-editing

Turn raw talking-head footage full of repeated takes (one long recording, or several recordings of the same script) into a tight rough cut. Find every take of every line, judge each take on its words, sound and picture, pick the keeper for each line, and either show the editor the picks first or go straight to the cut. The cut is checked so no word is chopped and no pause is left in before anyone sees it. Built for Claude Code and Runneth. Use when someone uploads raw talking-head footage and asks to find the takes, pick the best ones, make a cut list or rough cut it. Triggers: "process my a-roll", "find my takes", "pick the best takes", "rough cut this", "cut list", "edit my talking head", "which take is best

alyshadotmd/video-editing

Turn raw b-roll footage into a tagged, searchable library of short clips. Watch each b-roll video once, tag every useful moment with timestamps, pick the moments worth keeping (the editor picks, or the AI picks on its own if the editor says so), cut only those picks with a 1-second buffer, and learn the editor's taste from their reasons. Use when someone uploads b-roll, asks to tag, bank or label b-roll, or asks to find a kind of shot ("find me unboxing b-roll"). Triggers: "process my b-roll", "tag this b-roll", "bank this b-roll", "b-roll library", "find me unboxing b-roll", "do we have b-roll of", "label my b-roll

alyshadotmd/video-editing

Plan and place b-roll on a video from its first cut: go through the cut line by line, decide which lines get b-roll and what kind of shot, pull the best matching moments from a tagged b-roll library, list what still needs filming, and place the b-roll once the editor approves. Use after a first cut exists and someone wants b-roll added, asks what b-roll a video needs, or asks for a b-roll shot list. Triggers: "add b-roll", "what b-roll do I need", "b-roll plan", "place the b-roll", "b-roll for this cut", "what should I film for b-roll", "shot list for this edit

相关技能