Video Reel Studio — 一个总管,多道严管闸门
这个技能 不自己绘制,也不自己剪辑。它是一个位于五个现有技能之上的管理者:
| 技能 | 管理者用它来负责 |
|---|---|
video-ad-editor | 所有脚本(scripts/)、口播短片、字幕、封面 |
montage-video | 无口播片段按节奏剪辑 |
podcast-video | 双摄像头 → 短片或 16:9 完整节目 |
motion-video | 根据文本生成动态电影(motion/ 引擎) |
thumbnail-video | 短片封面和 YouTube 缩略图 |
脚本根目录:.opencode/skills/video-ad-editor/ — 请传递完整路径。
平台:Windows 和 Mac
该技能为在两个平台上运行而编写。区别仅在于 如何调用工具,而非逻辑本身:
| Windows | Mac | |
|---|---|---|
| Python | python | python3 |
.sh 脚本 | & "C:\Program Files\Git\bin\bash.exe" … (⛔ 不是普通 bash = WSL) | bash … |
| Chrome | C:\Program Files\Google\Chrome\Application\chrome.exe | /Applications/Google Chrome.app/Contents/MacOS/Google Chrome |
| 3D | GL=gpu (ANGLE/D3D11) | Metal 自动选择 |
| 路径 | D:/work/x 或 D:\work\x | /Users/you/work/x |
在任何工作之前,每个会话只需要一次:
python scripts/preflight.py # Mac: python3
它会检查:Python、ffmpeg/ffprobe、node、bash、Chrome、numpy/scipy、相关技能、字体以及身份文件夹 —
并为每个系统打印正确的安装命令(Windows 上使用 winget,Mac 上使用 brew)。闸门 G-2。
脚本本身会自动检测平台:_vision.py 在 Mac 上选择苹果工具,在 Windows 上选择开源替代品;
_chrome_flags.js 在 Mac 上选择 Metal,在其他地方选择 SwiftShader;31_device3d.js 和 motion/render.js 会在两个系统的路径中寻找 Chrome。
合同:一句话 → 一个就绪文件
用户给你一个 文件或链接和一句话。你来掌握所有步骤。不要给他们命令,也不要问任何你可以自己检查的事情。只问 一个问题,当决策关乎品味而非技术时(哪个角度,哪个钩子,删除哪句话)。
埃及命令 — 如果他们这么说,那就是这个模式
| 如果他说 | 模式 |
|---|---|
| 「منتج الفيديو ده」·「حوّله لريل」·「اقصّ السكتات」·「هات الكابشن」 | talking-reel |
| 「اعمل مونتاج من المقاطع دي」·「ركّبهم على الأغنية」 | montage |
| 「اعمل ريلات من الحلقة」·「عندي كاميرتين」·「الحلقة كاملة」 | podcast |
| 「اعمل فيديو موشن من النص ده」·「اشرح بالحركة」·「موشن جرافيكس」 | motion |
| 「اشرح الموقع ده بفيديو」·「ديمو للتطبيق」·「اللينك ده」 | web-demo |
| 「اعمل كوفر」·「ثمبنيل يوتيوب」·「صورة مصغرة」 | cover-only |
| 「عايز أعدّل بنفسي」·「اعمله كاب كت」·「افتح الاستوديو」 | 基础模式 + CapCut/工作室 |
不必让他明确说出模式。如果句子中 动词 + 文件,你从上面的表中推断出模式并继续。
快速通道
| # | 阶段 | 输出 | 闸门 |
|---|---|---|---|
| -2 | 环境检查:preflight.py (Windows/Mac) | 工具报告 | G-2 |
| -1 | 身份(可选):先问 — 已保存 / 新建 / 默认 | theme.json + brand.md | G-1 |
| 0 | 读取请求并编写 brief.json | promise + mode + length | G0 |
| 1 | 源:复制,检查帧,检查曝光 | src.mov | G1 |
| 2 | 剪切 + 转录 + 纠正 + 字幕 | cut.json a.json caps.json | G2 · G3 · G3b |
| 3 | 设计:动画、场景、预览 | scenes*.js + sheet.jpg | G4b |
| 4 | 完整渲染 | out/ = 时长×30 | G4 |
| 5 | 编码 + 母版 + 翻译 | ad-master.mp4 .srt | G5 |
| 6 | 封面 + 缩略图 + 手机预览 | cover.jpg … | G6 · G6b |
| 7 | 交付报告 | gates.md | G8 |
详细说明和精确命令 → references/pipeline.md。
角色以及何时移交代理 → references/roles.md。
每个闸门条件及其限制 → references/gates.md。
艺术方向: 在第一个场景之前从 styles/pack.json (10) 中选择一个样式 — python scripts/style_pack.py apply "<work>" <id> — 样式控制动画和纹理,品牌控制颜色 → references/styles-adapted.md。
-1a) 代理和模型 — 在身份之前
ai.json 在任何事情之前写入:代理 从环境可知(你在其中工作),所以不要问。
如果模型不明确,只问 一个问题:
"你要在哪个模型上工作?只需名字 — 以便我调整场景大小和审核方式。"
| 回答 | 即时影响 |
|---|---|
| 模型 强 + vision | 6-8 个场景,深度时刻,由子代理进行视觉审核 |
| 强但无 vision | 4-6 个场景,仅数字审核 + 用户对 sheet.jpg 的肉眼检查 |
| 快/便宜 | 3-5 个来自既定模式的场景,一个预览,每个闸门一次 |
| 上下文小 | 将转录分成窗口,不要一次性读取所有文本 |
- 代理:
opencode·claude-code·codex·cursor·gemini-cli— 并且preflight.py将项目标记与ai.json进行比较。 - 如果能力未知,将其保留为
null→ 技能采取谨慎态度(数字 + 肉眼)。 - 详细信息和完整矩阵 →
references/ai-fit.md。
-1b) 身份 — 可选入职(不要强加)
第一次视频请求时,在任何脚本之前,只问一个问题:
"在我们开始之前:我们要一次性设置你的品牌(5 分钟:颜色、字体、语气、禁止项), 还是使用已保存的品牌,或者继续使用默认品牌并稍后修改?"
| 他的答复 | 你的操作 |
|---|---|
| "有已保存的品牌" | python scripts/onboard.py list ← 列出名称 ← apply <work> <slug> |
| "设置它" | 七个问题 ← new ← card ← 显示品牌卡 ← apply |
| "继续使用默认" | 在同一项目中不要再问;默认 #0B0C0C · #F4F2EE · #19C3AE · Cairo · chunk |
| "没时间" | 开始视频,在首次交付后提供品牌设置 |
- 七个问题(名称、账号、受众、语气、行动号召、颜色、禁止项)→
references/onboarding.md。 - 有图片/标志?用
scripts/00_theme_refs.py提取调色板,而不是猜测。 - G-1: ink/bg ≥ 4.5,acc/bg ≥ 3,onAcc/acc ≥ 4.5 的对比度。
onboard.py new如果失败则拒绝保存。 - 品牌保存在
~/.config/opencode/brands/<slug>.json中,并在每个后续项目中使用。
⛔ 禁止不先询问就开始入职,禁止因为颜色而停止项目,禁止问超过 7 个问题。
G0 — 简报(不要跳过)
在任何脚本之前写入 <work>/brief.json。模板:assets/brief.template.json。
promise= 观众在最初 3 秒内理解的内容。一句话。如果你写不出来,说明你没理解请求。mode来自六个模式。如果请求可能包含两种模式,选择 最接近用户意图的 并告诉他你理解了什么。length_s= 现实范围(短片 45–90 秒;长内容 → 多个短片,不是单个短片)。must_keep= 禁止删除或更改的名称和数字。
闸门 G0:三个都存在?如果没有,问一个问题然后继续。
领导权:谁做决定
你来领导。不要等待每一步的许可,也不要将工作交给一个会指挥你的代理。
- 亲自检查 所有技术细节:时长、帧率、音频、大小、安全区域。
- 只交出判断 当判断需要新鲜上下文时:阿拉伯语审核、图像审核。
- 代理 只读和判断 — 不写也不画。提示模板在
references/roles.md中。
闸门:故障封闭
python scripts/gate_runner.py "<work>" --safe
- 打印一个表格,写入
gates.json+gates.md,如果有阻塞器则退出代码为 1。 - 任何阻塞器未消除就不交付。 没有"我们试试看"。
- 每个闸门最多尝试两次。 第三次 = 原因不明 ← 停止并向用户提供证据(截图 + 闸门文本)。
- 禁止禁用闸门、提高
--maxmb或忽略警告"因为很小"。那是作弊。
严格规则
- 字幕是其话语的忠实副本 — 不要编造,不要无故删除任何单词,纠正时要保持单词数不变。
- 安全区域优先 — 文本不能位于 y 0–150 或 y 1620–1920,也不能位于右侧按钮列中。
- 颜色仅来自
theme.json;未经其同意,不得对他的图像进行任何颜色调整。 - 屏幕上每个数字都来自
facts.md或他的话语 — 没有你自己编的数字。 - 没有发布或排程。 交付文件。
- 封面是强制性的 — 第一帧,且在手机尺寸下可读(
cover_phone.jpg)。 - 大小和响度是质量的一部分: ≤29 MB,-14 LUFS,峰值 ≤ -1.0 dBTP。
运行模式
- 口播短片(默认):
talking-reel— 完整视频全屏,图形在上方或后面条带中。 - 无口播短片:
montage— 需要 10–20 个片段 + 音频轨道。不重复镜头。 - 播客:
podcast— 双摄像头。必须包含钩子文本。 - 动态电影:
motion— 默认无旁白(audio.py --no-bed --lufs -20)。3D 需要GL=gpu。 - 网站/应用:
web-demo—27_web_capture.js然后30_demo.js(或31_device3d.js)。 - 仅封面:
cover-only。
交付报告
两行,然后一个短表格:
时长 · 剪辑数量 · 大小 · 响度 · 峰值
闸门 7/7 ✅(或可接受警告 + 原因)
文件:mp4 · srt · txt · cover.jpg
没有发布任何内容。
Token 经济
- 每个阶段一条命令,而不是 41 条分散的命令。
- 一张预览图(
sheet.jpg)而不是 6 张图片。 - 不要读取整个文件:使用
grep -n查找函数,tail -5查看日志。 - 只在需要时引用 — 此文件 + 一个与当前阶段相关的引用。
- 不要展示图像,除非有一个视觉问题没有其他方式回答。
预期失败(不要惊讶)
| 症状 | 原因 | 解决方案 |
|---|---|---|
UnicodeEncodeError | 在 Windows 上未使用 utf-8 写入 | 设置 PYTHONUTF8=1(脚本已修复,但不要依赖) |
| 3D 卡死 | Chrome 路径/工作路径 | 确保 CHROME 正确 + GL=gpu(已在 31_device3d 中修复) |
| 字幕延迟/截断 | 剪辑在字幕之后更改 | 重新运行 02_captions.py 然后 G3 |
| 压缩后峰值高 | AAC 提高峰值 | 在封面路径中使用 alimiter 或 06c_loudfix.sh |
| 转录混乱 | 方言/英语术语 | 运行 02a_whisper_check.py --fix 然后用固定字数纠正 |