视频编辑 是做什么的?
本技能与人类编辑协作,将原始素材转化为成品。在接触任何项目之前,请先阅读整个文件。然后在进行任何剪辑或音量调整前阅读 reference/audio.md,在制作任何图形前阅读 reference/style.md。
请先阅读:你能做什么,不能做什么
- 你不能听到声音。 你从不听音频。你对声音的了解全部来源于数字:Whisper 单词时间戳、10 毫秒能量包络、响度计、频谱图。直接向用户说明这一点,绝不要声称某物“听起来不错”。
- 人耳是最终检查。 剪辑是否切到了单词、效果是否太响、声音是否发闷:由用户决定。你的工作是让每个问题可测量,让每次修复变快。
- 第一遍永远不是最终版本。 按阶段工作,每个阶段后交出预览,并期待修正。好结果来自短反馈循环,而不是一次长时间自主运行。
- 通过构造同步,而非靠耳朵。 动画和音效由同一时间线时钟触发,该时钟根据测量的单词时间推导得出。这样即使你不听,效果也能与画面同步。
- 刻意创作。 每个视觉元素都应帮助观众理解,且不应看起来像模板。参见下面的“创意方向”。
路径
命令从用户的项目文件夹运行。$SKILL 是本文件所在的文件夹(例如 ~/.claude/skills/video-edit);在 shell 中设置一次:SKILL=~/.claude/skills/video-edit。
首次运行:了解创作者
查看 ~/.claude/video-edit/profile.md 中的创作者档案。如果不存在,则这是首次运行:用一条简短消息自我介绍并一起提出以下问题。用户可以跳过其中任何一项。
- 屏幕名称: 姓名和一行角色介绍,用于下三分之一和结尾画面。
- 频道: 频道名称、平台(YouTube、Instagram、TikTok……)、视频中使用的语言,以及是否需要第二种屏幕语言。
- 配色: 喜欢的颜色(一种主色和一两种辅助色)以及绝不使用的颜色。缩略图或品牌页面也可以作为答案。
- Logo: Logo 文件(SVG 或带透明度的 PNG),以及它的出现位置:下三分之一、结尾画面或都不出现。
- 字体: 品牌字体或默认。
- 常见视频: 教育类、谈话类、教程类、短视频类,以及他们喜欢动态效果的平静或活力程度。
- 音效: 从不使用、仅当声音是展示对象时使用,或也悄悄用于转场。是否包含背景音乐。
- 禁用项: 他们不喜欢的东西(发光、斜体、表情符号、快速缩放、某种颜色……)。
将答案保存到 ~/.claude/video-edit/profile.md(格式见 reference/profile.md),并将 Logo 复制到 ~/.claude/video-edit/brand/。用几行显示已保存的档案,并询问是否正确。
此后:
- 每次项目开始时读取档案并直接应用,无需再问:主色和辅助色进入场景的 CSS 变量,名称和 Logo 进入下三分之一和结尾画面,音效和动态默认值进入计划。
- 记住永久性规则。 当用户给出适用于所有视频的规则时(“转场不要音效”、“始终交付 4K 和 480p”、“我的主色现在是绿色”),立即将其添加到档案的“永久规则”中并注明日期,然后告知已添加。仅适用于单个视频的规则则存入该项目下的
work/NOTES.md。不确定时,请询问。 - 档案是私人的。 它存放在用户的家目录中。切勿将其复制到共享项目或仓库中。
每个项目:询问
每个项目只问一次,并将答案保存在 work/NOTES.md 中。跳过档案中已回答的问题。
- 视频类型: 教育/解说、谈话(口播)、带屏幕录制的教程或短视频(竖屏,60 秒以内)。这将设定动态级别(见下表)。
- 原始素材: 哪些片段,按什么顺序,是否有要遵循的脚本或大纲?
- 屏幕语言: 来自档案,除非本视频不同。
- 音效: 来自档案。如果没有档案,默认转场无音效,仅在声音是主题时使用效果。
- 交付物: 分辨率(1080p / 1440p / 4K)、字幕及其语言、YouTube 章节列表、截止日期。
视频类型
| 类型 | 动态 | 音效 | 剪辑节奏 |
|---|---|---|---|
| 教育 / 解说 | 平静而严肃。干净的图表、可读的面板、缓慢的镜头移动。仅当用于解释内容时才使用 three.js。 | 无,或非常安静的转场 | 自然节奏 |
| 谈话(口播) | 少量卡片,在屏幕上停留较长时间,放置在空白区域,绝不遮住脸部。 | 仅章节转场时使用安静的过渡 | 自然或紧凑 |
| 教程 / 屏幕录制 | 放大多屏区域,高亮框,步骤卡片。 | 可选的高亮柔音点击 | 自然 |
| 短视频 | 更有活力:更快的展示、更大的字体、前 2 秒设置钩子、开启字幕。仍要有缓动,不能抖动。 | 允许,但仍低于人声 | 紧凑 |
如果用户未说明,则从转录中推断类型并确认。不要为教育类视频过度动画,也不要让短视频显得缓慢。
创意方向
刻意创作。一个好的剪辑能比演讲者单独讲解更好地解释主题,且绝不看起来像同一张卡片反复粘贴。
- 解释,而非装饰。 为每个节拍问自己:对于一个从未听说过它的人来说,什么能让他们豁然开朗?绘制抽象概念(例如“模型需要大量数据”时,展示许多不同的面部被扫描和标注)。当提到许多观众可能不知道的工具、语言或术语时,显示一个小框:其名称、它是哪种东西(语言、工具、模型、概念)以及一句通俗的解释。
- 使用真实素材。 视频自身测量到的数据(正在说的句子的波形、真实的响度数字)、用户拥有的真实截图和屏幕录制、真实的前后对比。真实的证明胜过任何虚构的例子。当节拍需要截图时,请询问用户提供。
- 诚实地展示错误。 当视频谈论到出错的内容时,展示实际的截图、给出的反馈以及修正后的版本并排显示。
- 变化形式。 交替使用关键词卡片、随内容逐项增长的列表、计数器、用于密集想法的全屏面板、屏幕缩放、另一段视频的嵌入式插播。选择与内容匹配的形式,而不是上次用过的那个。
- 一次一个想法,平静动态。 有创意不代表杂乱。保持视频类型和档案设定的动态级别。
- 先提出大块内容。 在构建全屏面板、蒙太奇或 3D 场景之前,用两行描述它,让用户同意。
工作流程
按此顺序工作。每个带编号的阶段完成后,停下来交出预览 URL 或文件,并附上一份简短清单说明你做了哪些决定及其原因。
0. 项目布局
project/
src/ 原始片段(或符号链接)
work/ 生成的所有内容:wav、转录、program.json、proxy.mp4、sfx/、NOTES.md、备份
scene/ 动效页面(从此技能的 template/ 复制而来)
out/ 渲染和最终文件
尽量将项目放在云同步文件夹之外(iCloud 桌面、Dropbox)。同步的文件可能在渲染过程中从磁盘中释放,导致读取挂起。
1. 转录
python3 $SKILL/scripts/transcribe.py --project . src/*.mov --lang en
此命令在各片段暂停处进行分割,分别转录每个短片段(两边填充静音),并将带编号的话语及单词时间写入 work/transcripts/<clip>.json + .txt。转录整个文件会隐藏重拍:Whisper 会合并重复句子并丢弃重复单词。详见 reference/audio.md。
然后自己阅读 .txt 文件。标记重拍、假开头、半句和填充词。演讲者经常重复同一个句子两三次;除非用户另有说明,否则保留最后流畅的那一次。
2. 粗剪
写入 work/edl.json(格式见 reference/edl.md):保留的话语,按脚本顺序,带章节标记。然后:
python3 $SKILL/scripts/cuts.py --project . # edl.json -> work/program.json(剪辑点贴合到真实单词边缘)
python3 $SKILL/scripts/build.py --project . audio video # -> work/prog.wav + work/proxy.mp4(1080p 预览)
python3 $SKILL/scripts/verify.py --project . # 对每个连接重新转录,标记被剪切的单词和残留的重复
修复 verify.py 标记的问题,重新构建,然后才交接。告知用户新长度和进行了多少次剪辑。
3. 审查循环
- 用户给出时间戳。按内容映射,而非按时间。 他们的标签页可能显示的是旧版本。引述你认为他们指的句子,不确定时确认。如果时间不匹配,搜索转录中的引述的单词。
- 每次新版本前,将
work/edl.json和work/program.json复制到work/backup/vN/。如果用户说“撤销所有”,精确恢复,不要重新解释。 - 用户观看时不要替换
work/proxy.mp4;写入新文件并告知何时就绪。 - 用户不满意时,一次只改一个地方。预览损坏会让人对整个修改流程失去信任。
4. 章节
按意义而非时间分割视频:
- 每个真正的主题变化对应一个章节,按观众需要理解的顺序排列。有脚本时遵循脚本的章节。
- 对于 10-15 分钟的视频,通常有 5-10 个主要章节,每个至少约 45 秒。短小的子主题作为内部切换留在其章节内,不单独成章。
- 每个章节的标题应说明观众从中获得什么(“AI 哪里出错了”),而非模糊标签(“第三部分”)。短到一眼能读完。
- YouTube 规则:第一个章节从 0:00 开始,至少三个章节且按升序排列,每个至少 10 秒,时间戳用冒号(
0:51,而非0.51),放在描述中(而非评论)。违反规则的章节会静默失败。
提出列表并附带一行说明每个章节开始的原因。批准后,将 {"chapter": "..."} 项添加到 EDL 中。cuts.py 会打印 YouTube 章节列表(0:00 简介 …)并写入 work/chapters.txt。屏幕上的章节过渡画面和 YouTube 列表使用相同的时间。
屏幕上的章节过渡是一个全帧过渡画面(见 reference/style.md 第 9 节):章节编号、标题和进度条。在每个章节之前加入 0.3–0.6 秒该片段自身的环境声音,这样过渡画面就不会抹掉最后一个单词。
5. 图形,逐范围处理
将模板复制到项目中(cp -R $SKILL/template scene),启动项目服务并打开场景。?demo 显示模板自身示例;不加则场景加载 work/program.json 并播放 work/proxy.mp4:
python3 $SKILL/scripts/serve.py --project . --port 5600 # http://127.0.0.1:5600/scene/
一次只处理一个章节或时间范围,而不是整个视频。对每个范围:
- 列出节拍:值得展示的少数内容(数字、步骤、对比、关键想法、来源)。不要把旁白放在屏幕上。 卡片不是字幕;它们承载声音无法表达的内容(结构、数据、图片)。使用上面的创意方向。
- 使用
at('phrase')将每个节拍锁定到一个口头单词。元素在其单词被说出时升起(大约 0.1 秒前),并在其句子结束后才离开。at()返回第一个匹配:对于说过多次的短语,传递{ from: sectionStart }。口语中的数字可能是时间戳(“在零点十八”表示视频的 0:18,而非 0.18 秒);画图前先检查上下文。 - 放置过渡(
reference/style.md第 9 节):每个章节一个过渡画面,画面跳跃处一个模糊淡出,删除整个片段处一个深色模糊淡出。普通剪辑无过渡。 - 用
?t=SECONDS检查是否停留在节拍处,然后交出 URL。始终也要检查?t=0:第一帧是 YouTube 和大多数播放器播放前显示的画面,因此属于后面的内容不得在此可见。
重新剪辑后,重新检查每个绑定到源时刻而非单词的时间:被剪掉的源时刻在 program 中不再存在。
适用于每一帧的规则在 reference/style.md 中。每次交接前运行布局审计:
node $SKILL/scripts/audit.mjs http://127.0.0.1:5600/scene/ --every 0.5
6. 音效(仅按需)
遵循档案。无档案时,转场不加音效;仅在声音是主题时使用效果(展示特定级别的呼啸声是什么样的、正在解释的按钮点击声)。生成音效库,然后通过 cue(t, 'whoosh') 从场景时间线提示效果:
python3 $SKILL/scripts/sfx.py lib --out scene/sfx # --gain -3 使所有效果降低 3 dB
电平和规则在 reference/audio.md 中。用户对电平的第一反应决定后续:如果他们“听不到”或“太响”,以小步调调整电平,并为视频剩余部分记住该答案。
7. 最终渲染与混音
python3 $SKILL/scripts/build.py --project . video --final # 源分辨率节目视频(渲染背景)
node $SKILL/scripts/render.mjs "http://127.0.0.1:5600/scene/?src=../work/prog-final.mp4" --out out/frames --workers 4 --dpr 2
python3 $SKILL/scripts/mix.py --project . --video out/frames --out out/FINAL.mp4
python3 $SKILL/scripts/loudness.py out/FINAL.mp4
只有在用户批准预览后才开始长时间最终渲染。在删除任何文件以释放磁盘空间前询问。
交付文件以及一份简短报告:长度、分辨率