视频剪辑
此技能将面对镜头讲话的原始素材剪辑成成品视频、匹配的 SRT 字幕文件和封面,使用基于 ffmpeg、Whisper 和 Playwright 的命令行工具 vedit.py。它拥有剪辑的完全控制权:选择干净的镜头、进行干净剪辑、确保镜头多样性、图形和 B-roll 放置、字幕、响度、封面以及最终的 QA 检查。它依赖 video-scripting 技能提供脚本和编辑说明,依赖 brand/brand-profile.md 提供颜色、字体和合规行,依赖 image-generation 技能提供静态图片,依赖 review-loop 技能进行独立检查,依赖 scheduling 技能进行发布。从此处不会发布或安排任何内容。
权限顺序:brand-profile.md 在品牌常量与合规措辞上优先;此技能拥有方法的所有权。
开始之前
- 找到营销工作区(默认为
marketing/)。如果不存在,用一行说明并提供brand-setup技能;该工具在默认外观下仍可工作。 - 找到内容文件夹
content/<yyyy-mm-dd>-<slug>/。其中应包含script.txt(每行一句口语;[括号内的注释]和[CHAPTER N • Title]标记绝不念出),理想情况下还有edit-notes.txt(包含HOOK ON SCREEN:、COVER:、OUTCOME:等行)和sources.txt(屏幕上仅允许出现的数字)。如果录像是无脚本的,则先转写,并将清理后的转写文本视为脚本。 - 阅读品牌配置文件中的
## 视觉标识、## 合规、## 边界和## CTA 与联系方式,以及brand/voice-learnings.md中关于图形和封面的措辞。 - 检查工具是否就绪:
python3 <skill>/vedit.py doctor。如果有任何缺失,运行bash <skill>/setup.sh一次(安装 ffmpeg、Node、Python venv、Whisper、Playwright、字体)。Whisper 的 large 模型约 3 GB,在笔记本电脑 CPU 上转写速度约为片长的 1 到 2 倍,因此请将长时间步骤置于后台运行。
标准
- 每句只保留一次干净朗读。 成品视频中每句脚本只保留一次干净的朗读:无重录、无“the, the”、无废弃 take 的半句话、无单词结尾被裁剪。这是硬性要求,不是锦上添花。可以保留一个自然的“um”(人应该听起来像他们自己),但绝不能出现在开头句,也不能在一句中出现两次。
- 跟随口语表达,而非书面脚本。 人们在说话时会改进台词。口语改写会在 take 查找器中表现为缺失或低覆盖率的行;这不是废话。保留他们的版本,仅裁剪真正的口吃和重演,并根据实际所说的话修正任何基于脚本编写的图形或钩子卡片。
- 保留能带来收益的节拍。 如果脚本开头有“我是谁”这样的行或结尾有号召行动,它们应保持在原位。
- 绝不出现单一固定镜头。 每次剪辑交替使用全景和特写,在长时间朗读中重新构图,切至 B-roll,通过动态图形推进故事。头部特写是主干,而非全部内容。
- 字幕来源于最终音频,并与脚本核对,确保与听到的内容完全一致。短视频烧录为硬字幕;长视频仅提供 SRT 文件。
- 响度标准化至 -14 LUFS,真峰值 -1.5 dB,确保在所有平台上音量正常。
- 真实帧封面,标题位于网格安全方框内,提供一个或两个变体。
- QA 关卡通过后才能交付任何内容。 它会重新转写渲染结果,独立检查每个剪辑点,并检查每个剪辑点是否落在安静处。
deliver命令在没有通过 QA 时会拒绝执行。 - 坦诚对待听觉局限性。 Claude 无法听到声音。QA 关卡只检查词语和能量,不检查语气、词语下的咳嗽声或糟糕的环境音拼接。每次交接时都要说明这一点。
方法
所有命令格式为 python3 <skill>/vedit.py <command> <slug>。手动编辑 project.json 前请阅读 references/project-config.md。
- 先收集所有素材。 列出批次中的所有素材片段。通过声音配对双机位(
scripts/sync_cams.py;真正的匹配得分约为 0.4 到 0.55,不匹配则约为 0.03),对无声相机(如无人机)则通过运动和时间戳进行匹配(scripts/sync_cams_visual.py)。为每张照片和短片段生成联系表,并记录哪些可作为 B-roll 使用,如果拍摄者提到的任何摄像机不在文件夹中,立即询问。详情请参阅references/multicam-and-long-form.md。 - 初始化。
vedit.py init <slug> --raw <cameraA clip> --pack <content folder> [--long] [--cam B=<clip>]。它会复制脚本,读取编辑说明,并将品牌配置中的调色板和字体映射到project.json中。然后,用脚本中的所有专有名词(包括演示者自己的名字)填充vocab。 - 预处理(慢,后台运行):
vedit.py prep <slug>。以相机原始帧率生成直立主视频、16 kHz 音频、同步额外机位、并生成两份转写文本(large-v3 逐字版和 medium.en 版)。遇到 HDR 素材、形状错误的素材以及蓝牙麦克风的通话级音频时会停止;references/audio-and-sync.md中有补救方法。 - 镜头选取。
vedit.py takes <slug>将语音与脚本对齐,类似提词器:反向跳转意味着重新开始,因此每句脚本的每次尝试都变成一个带分数的 take。第二次监听会独立回听每个 take 以找出填充词、重复和双读。请阅读picker/takes_report.txt。然后在信任之前进行验证:打开references/whisper-pitfalls.md,因为 Whisper 会丢弃重复的假开头、编造结束词并分割不熟悉的术语。除非能量图显示没有第二次爆发性语音,否则建议的重录修剪应保留。 - 挑选。 要么用户通过浏览器挑选(后台运行
vedit.py picker <slug>,然后打开http://localhost:8765),要么,如果他们要求 Claude 挑选,自己编写picker/picks.json,并在每次更改机器选择时添加note注释。告诉他们哪些行是红色或琥珀色的以及原因。优先选择与相邻行来自同一录制运行的朗读:它们可以无缝剪辑。永远不要交付机器选择的结果。 - 编排(设计工作,先阅读
references/style-notes.md)。根据脚本、sources.txt和素材中的内容:在帧 0 处添加钩子卡片(来自edit_notes.hook_on_screen,3 到 5 个词,一个承诺而非答案);为需要它们的节拍编写graphics.json卡片,仅使用sources.txt中的数字;cues锚定到行或口语单词,从不使用固定时间;合理的 B-roll 切出(在它们所说明的单词上,或在说话人的表情或手势之后);framing.face_x/eye_y在一帧上测量;exit_tail用于走出镜头的部分。使用vedit.py mg-preview <slug>预览图形静态图。 - 构建。
vedit.py build <slug> plan即时运行并打印剪辑摘要;build cues列出任何无法放置的 cue(修复它,绝不忽略)。迭代执行build cut和scripts/cut_check.py,直到干净为止,制作封面(步骤 9)以使海报帧嵌入,然后执行build all。构建应用的规则见references/edit-rules.md。 - QA 关卡。
vedit.py gate <slug>。它会因以下原因失败:一行被朗读两次、存在口吃或废弃的开头、有语音能量但没有词(隐藏的重读)、在任何剪辑点出现重复或跳过(两个模型独立听到)、遗漏的废弃 take 中的单词出现在剪辑点处、剪辑点落在有声音的位置、以及(多机位时,如果存在gaze.json)使用了错误的机位。修复原因,重新构建,再次通过 QA。然后进行人工代理检查:观看渲染结果的联系表,阅读每条字幕(vedit.py captions <slug>),对于你更改的每一行,记录之前的内容和保留的内容。 - 封面。 使用
vedit.py frames <slug> --every 5生成联系表;选择一帧有眼神接触、表情温暖(非说话中)、对焦清晰、包含能说明故事的物体的帧。设置cover.frame和一个或两个variants(2 到 4 个词,大字,一个高亮词,简洁真实),然后执行vedit.py cover <slug>。它会检查每个文本框是否位于网格安全方框和脸部之外,并生成grid_tiles.jpg以显示在个人主页网格中的效果。 - 审查。 将渲染结果的联系表、封面、SRT 和剪辑列表交给
review-loop技能。屏幕上的数字需与sources.txt核对,不能只看表面。 - 交付与发布。
vedit.py deliver <slug>将视频、SRT、封面、剪辑列表(每行:take、源范围、修剪、每次更改及原因)、QA 报告以及(对于长视频)youtube-chapters.txt写入content/<date>-<slug>/video/。vedit.py release <slug> --to <folder>将视频、SRT 和 JPG 缩略图以同一文件名复制到目标文件夹,这是调度工具和 YouTube 所期望的格式。
交付前的检查
交付给用户时始终包含:
- QA 通过,且时间最新(晚于渲染时间)。
- 唇形同步测量:对最终渲染的两个或三个面部特写片段运行
scripts/lipsync.py build/final.mp4 <t0> <t1>,确保每段在 ±40 ms 内。 - 字幕检查阅读(
vedit.py captions <slug>,输出为vN-caption-check.txt):FIX 看起来合理,每个 CHECK 都标注为让用户去听的行。 - 注明时长和响度。
- 对他们选择的每项更改都说明原因,并列出值得听的行。
- 封面 A 与 B 的对比,以及网格预览。
- “没有任何内容被发布或安排。”
- “我无法听到内容:请在发布前自行听取。”
适配调整
- 没有脚本? 先进行转写(
prep会生成两份转写文本),将转写结果清理为每行一句,保存为script.txt,然后运行takes。 - 不同外观: 所有视觉元素从
project.json的brand(颜色、字体)和cover.wordmark(可选的小名称标签)读取。在那里更改,不要改到脚本中。 - 不同拼写:
captions.locale设置为en-GB(默认)或en-US。 - 较慢的机器: 在
project.json中设置"whisper": {"large": "small.en", "medium": "base.en"}以牺牲准确性换取速度;QA 关卡仍会运行。 - 监管行业: 将
## Compliance中要求的屏幕措辞放入图形或结尾卡片,并确保屏幕上所有数字均来自sources.txt。 - 新图形模板: 将它们添加到
scripts/mg/kit.html,并在references/project-config.md中记录。 - 学习改进: 当用户报告 QA 遗漏的跳过或重复时,在修复视频前记录案例,并将你学到的关于他们剪辑偏好的知识添加到
brand/performance-learnings.md。SRT 是从他们自己的语音中转写的,因此voice-loop技能可以从中学习。
已知不足
- take 查找器可能会错过措辞变化较大的重录;QA 关卡的重读规则是最后防线。在更改
nin或修剪后,请阅读build/edl.json并检查你接触过的每个接缝。 - 残留词检查按文本匹配保留的 take 的边缘词,因此废弃 take 中听起来像保留 take 第一个词的那个词可能会以“即兴”注释的形式通过。需要手动通过
build/edl.json将每个此类注释映射到源时间。 - QA 关卡中没有自动唇形同步检查:对每个最终渲染运行
lipsync.py。 - 多机位拍摄的机位选择由人工完成(在 picks 中设置
"cam"),除非你提供gaze.json;详情请参阅references/multicam-and-long-form.md。 - 未内置逐字“卡拉 OK”字幕;可以作为想法提供,但切勿在未询问的情况下更改字幕样式。
此技能中的文件
| 文件 | 何时打开 |
|---|---|
references/project-config.md | 编辑 project.json、graphics.json、cues、封面变体或 picks 时 |
references/edit-rules.md | 评估剪辑、字幕、图形或封面时 |
references/whisper-pitfalls.md | 验证 takes、修剪和 QA 注释时 |
references/style-notes.md | 编排剪辑(镜头多样性、切出、钩子卡片、封面)时 |
references/multicam-and-long-form.md | 处理第二个机位、无人机、16:9 长视频、章节时 |
references/audio-and-sync.md | 处理差劲的音频、延迟的音频、背景噪声、响度时 |
references/project-template.json | 查看起始的 project.json 时 |
setup.sh、vedit.py doctor | 首次在一台机器上运行时 |
了解更多
含有示例的更详细指南位于 https://builtnotboosted.com/skills/video-editing