Claude AutoCut
基于字级转录的本地视频编辑。所有操作均在用户机器上运行:Whisper (faster-whisper) 进行语音识别,FFmpeg 处理媒体,Pillow 处理字幕,仅卡通模式需 HyperFrames (Node.js) 渲染动画。无需 API 密钥,无需付费服务,没有内容上传。
命令行工具是此技能文件夹内的 scripts/autocut.py。使用已安装依赖的 Python 运行(参见“设置”):
python "<skill-dir>/scripts/autocut.py" <command> ...
<skill-dir> 是该技能的基础目录(技能加载时显示)。
选择模式
| 用户需求 | 模式 | 命令 |
|---|---|---|
| “编辑这个视频”、“剪切停顿”、“去除‘嗯’”、“清理我的重拍” | 自动编辑 | edit VIDEO -o PROJECT |
| 为视频添加字幕/标题但不剪辑 | 字幕 | captions VIDEO -o FOLDER |
| 在演讲者上方添加动画场景,保留完整录音 | 全动画 | cartoon init VIDEO -o PROJECT,故事板,cartoon render |
| 先编辑,再为编辑后的视频添加动画 | 完整 | complete VIDEO -o FOLDER,故事板,cartoon render |
| “卡通”、“动画播客”,未说明是否剪辑 | 询问一次:保留全部(全动画)还是先剪辑(完整)? |
如果请求模糊,用一个简短问题询问推荐哪种模式。在此之前,在会话中运行一次 doctor:它会显示这台机器上哪些模式可用。
设置(每台机器一次)
python -m venv .venv并激活,然后pip install -r "<skill-dir>/requirements.txt"。- 确保
ffmpeg和ffprobe在 PATH 中。 - 仅限卡通模式:Node.js 18+(npx 和 npm)。HyperFrames 0.8.79 首次使用时由 npx 获取,且不会自动更新;每个卡通项目用 npm 安装 GSAP。
python "<skill-dir>/scripts/autocut.py" doctor
首次转录会下载 Whisper 模型(--model tiny 约 75 MB,small 约 480 MB,默认)。当语言已知时使用 --language;对于困难的音频使用 --model medium 或 large-v3。
自动编辑
python "<skill-dir>/scripts/autocut.py" edit input.mp4 -o edits/my-video [--language en] [--model small]
步骤:转录 → 分析 → 规划 → 渲染 → 验证(再次转录编辑后的视频并比较)→ 字幕 → REPORT.md。输出在项目文件夹中:renders/cut_vN.mp4(纯净编辑)、
renders/final_vN.mp4(含嵌入字幕)、captions_vN.srt、decisions.md(每个移除的片段及其类型和原因)、analysis.md、verify_vN.json。永远不会覆盖:每次渲染都是新版本。源视频只读。
自动规划执行的操作(保守设计):
- 修剪第一个词之前和最后一个词之后的静音;
- 缩短超过 0.7 秒的停顿,但绝不完全移除;句子结尾后的停顿保留更多(可能的强调停顿);
- 移除填充音和紧接着被重做的未完成片段;
- 对于同一句子的两个完整片段,根据证据保留更清晰的一个,绝不选择“最后一个”或“最短的”;如果证据相当,则两者都保留,并将该案例列入“待审核”;
- 保留转录未捕捉到的可听声音,并丢弃 Whisper 在静音中虚构的文字。
高影响剪辑
移除在其他地方未出现的词(包括否定词)的剪辑称为高影响剪辑。自动规划永远不会做出这样的剪辑;它们仅来自 overrides.json(根据用户请求添加的剪辑)。渲染会停止,直到每个高影响剪辑获得批准。要批准,请向用户展示 decisions.md 中的确切片段和词语,获得明确同意,然后:
python "<skill-dir>/scripts/autocut.py" approve PROJECT --start 12.0 --end 18.5 --by "user" --reason "asked to drop the tangent"
python "<skill-dir>/scripts/autocut.py" edit input.mp4 -o PROJECT # 转录会重复使用,渲染新版本
切勿记录用户未给出的批准。plan PROJECT 会重新运行分析和规划,但不进行渲染。
overrides.json(位于项目文件夹中)
{"cuts": [{"start": 12.0, "end": 18.5, "reason": "off-topic tangent"}],
"keep": [{"start": 3.0, "end": 4.2, "reason": "the filler is part of the joke"}],
"pauses": {"p04": {"action": "keep"}, "p07": {"keep_s": 0.8}}}
停顿 ID(p04)来自 analysis.md。请阅读 references/editing.md 了解如何分类决策。
向用户报告
阅读 REPORT.md 和 decisions.md,并简短告知用户:编辑前后的时长、移除了什么及其原因、“待审核”的内容、是否通过验证(缺失的词、保留的否定词)。说明你无法听到或观看视频:节奏和品味应由用户自行判断。
纯字幕
python "<skill-dir>/scripts/autocut.py" captions input.mp4 -o captions/my-video [--no-burn] [--caption-y 0.75]
生成 captions.srt、captions.json 和 captioned.mp4。竖版视频在高度 70% 处使用大号大写字幕;横版视频则靠近底部。每个口语词出现一次,按顺序。
卡通(全动画和完整)
cartoon init VIDEO -o PROJECT(完整模式会先执行edit,然后在编辑结果上创建卡通项目)。- 读取
PROJECT/speech.md(含时间戳的语音块)并编写PROJECT/storyboard.json:覆盖整个视频且无空隙的场景,每个场景包含情景、主持人的姿势和面部表情、对象和屏幕文字。架构、目录(情景、姿势、面部表情、对象、转场)和布局规则在references/cartoon.md中。在编写第一个故事板之前请阅读它。 cartoon check PROJECT直到报告无错误。屏幕文字只能使用口语中出现的词。cartoon snapshot PROJECT --at 1.5,8,20并查看reviews/中的帧。cartoon render PROJECT(或--range 0-6快速测试)。输出:renders/cartoon_vN.mp4,源音频原样复制;renders/cartoon_vN.qc.json检查时长和音频。
动画仅通过你编写的故事板理解语音的含义:代码本身不理解语音。
规则
- 切勿修改或删除源视频或早期渲染。
- 切勿添加改变语音含义的剪辑;切勿替用户批准高影响剪辑。
- 屏幕文字和字幕仅使用口语中出现的词。
- 一次只运行一个渲染;卡通渲染较为繁重(参见
references/troubleshooting.md)。 - 不要声称结果“听起来不错”:你无法听到它。报告测量到的内容。
失败处理
参见 references/troubleshooting.md(缺少 FFmpeg、模型下载、Node/npx、HyperFrames、内存、错误语言、转录质量差)。