三提示词出三条片:onetake 30 秒发布片的"零剪辑"工作流,照着跑一遍
【免费下载链接】onetakeMotion films that never cut to the next slide: every beat grows out of the one before, one continuous camera, continuity measured by an oracle. Product launch films and feature demos, made with a coding agent.项目地址: https://gitcode.com/gh_mirrors/on/onetake
2025 年底,onetake 用一条 30 秒的片子给自己做了发布片。这条片子里,一个终端风格的提示词栏被输入了三次——先是一整句话,再缩成四个词,最后只剩下一个词——每一次回车,输入框都"长成"一部全新的产品成片,三部成片分别有自己的配色和动效语言,却共享同一个桌面、同一条从未剪断的镜头。发布片自己就是工作流最好的演示:三个提示词,三条影片,一条镜头,零剪辑。
这不是演示视频的修辞,而是 onetake 这个 Claude Agent Skill 的核心协议:它把产品发布片、预告片、功能演示片从"一张张 PPT 拼起来"改写成"一条连续的电影合成(composition)",并且把"连贯"做成可测量的指标,在任何人眼看之前先交给一个自动化 oracle 验收。本文照着发布片自己演示的路径走一遍:装好 Skill、看懂提示词栏这条"脊柱"、跑通三次发送三条影片的流程,最后用仓库自带的验收脚本检查你自己的成片是否成立。
准备:拉仓库、装 Skill、看懂"提示词栏 = 脊柱"
安装只有一条命令。README.md 给出两种 Agent 的落点:Claude Code 克隆到~/.claude/skills/onetake,Codex 等按 skills 读取的 Agent 克隆到~/.agents/skills/onetake。依赖是 python3(playwright + chromium、numpy、scipy、Pillow、matplotlib,分析参考片需要 opencv-python)、ffmpeg、node;配音另加 faster-whisper 与 Kokoro TTS。装好后直接说「给我的 App 做个 15 秒发布视频」即可。
装好后值得先读两样东西:SKILL.md 的 8 步协议,和 cases/onetake-launch-30s/README.md 的节拍表。前者告诉你"先测量、再创作"的顺序不可跳过,后者就是发布片的工作台账。
"提示词栏作为脊柱"(the prompt bar is the spine)是发布片的概念句,写在合成文件头部的 CONCEPT 里:提示词栏被输入三次,一次比一次短——一句话 → 四个词 → 一个词——每次输入都看得见地变成一部成品 mini-film,服务于一个新的虚构产品,各自拥有独立的配色与动作语汇。条 1 展开成 Mac 窗口,条 2 展开成 Hush 耳机框,条 3 压成一条线射过桌面、展开成 LED 屏幕。三条影片坐在同一张暖色纸质桌面上,镜头从不剪断,最后拉远,三条影片同时播放,提示词栏的块状光标一笔写出 "onetake" 的名字。
值得注意的是 v8 的修订记录:v7 被评审驳回,理由是"看起来只有一个 prompt"。v8 的修法不是加素材,而是让镜头落在每一条提示词栏上,让每一次发送都成为对应影片的诞生时刻——衔接是设计出来的,不是堆出来的。这正对应当前仓库 SKILL.md 里的硬规则之一:"Never replace a beat — carry it"(永远不要替换一个节拍,要接住它)。
这条脊柱在代码层面也有对应物。templates/comp.html 是合成骨架,它的核心契约是一行注释:window.__seek(t) → Promise,即整个画面是时间 t 的纯函数——跳到任意时间,得到的都是同一帧。打字的速度、光标的闪烁、卡片的弹簧入场、复选框的打勾,全部由 lib/motion.js 提供的纯函数驱动:OM.typeOn(t, t0, text, {cps, blink})返回当前已打出的字符串和光标状态,OM.wordRise(t, t0)返回一个词的弹跳位移和缩放,OM.press(t, tc)返回按钮的按压、回弹与状态翻转。动作库本身约 39 个动作,全部是"数字进、数字出"的纯函数,不碰 DOM、不依赖构建,<script src="motion.js"></script>即得window.OM。
<!-- templates/comp.html:提示词打字 + 光标,两行代码 --> const ty = OM.typeOn(t, TYPE0, PROMPT_TEXT, {cps: TYPE_CPS}); $('ptxt').textContent = ty.str; $('caret').style.opacity = ty.caret;跑通三次发送、三条影片、零剪辑的完整流程
发布片自己演示了"跑通"的样子。把 cases/onetake-launch-30s/README.md 的节拍表摊开,三次发送的骨架一目了然:
| t | 节拍 | 镜头 | 什么活下来进入下一拍 |
|---|---|---|---|
| 0.00–4.40 | 提示词 1(无音乐) | 微距,两段死静,一次滑移 | 提示词栏 |
| 4.40 | ENTER → 音乐起 | 拉出 2.25× → 0.93× | 提示词栏展开成 Mac 窗口 |
| 5.10–9.50 | Dayline 影片 | 推、倾、俯冲、拉 + 荷兰角 | 窗口重排成手机 |
| 9.52–10.40 | 点击:Launch day 以 sheet 展开 | 定在手机上,文字,死静 | — |
| 10.95–11.30 | 回到提示词栏 2 | 右移,落在 1.4× | 提示词栏 |
| 11.30–12.03 | "concept ad — Hush earbuds" | 死静 | — |
| 12.08–12.75 | 提示词栏展开成 Hush 框 | 拉到 1.2 | "Hush" 飞到角落 |
| 12.75–16.14 | 城市噪音堆叠 → 耳塞落下、噪音泄掉、充电盒合盖 | 手持蠕动 | — |
| 16.00–16.92 | "Hush." 提示词栏 3:"event" | 拉回 Hush + 提示词栏 3,死静 | 提示词栏 |
| 16.92 | DROP:提示词栏 3 → 一条线 → LED 屏 | 沿线甩镜 | 这条线是宣传片的第一根网格线 |
| 17.28–23.18 | FRAME/26 宣传片(含循环一次) | 沿海报下移,回抹到第一帧 | — |
| 23.30–25.90 | 三条影片聚成一排 | 越过一排拉远 | 提示词栏 |
| 26.835 | 一切冻结 | — | — |
| 27.357–28.45 | 块状光标写出 onetake | 推近,跟笔 | — |
| 28.55 | GitHub 标记 · 开源 | 死静至片尾 | — |
注意这张表的两件事。第一,节奏有形状:0.4 秒的单词、2 秒的静置、0.7 秒的甩镜、0.22 秒的节拍交替出现,长短相差 4 倍以上,还有大段死静——这正是 references/rhythm.md 里从 motion-web 三版被拒剪辑中提炼出的规则(镜头长度变异系数 ≥ 0.25,至少 25% 的帧是死静的,至少一段 ≥ 1 秒的安静)。第二,每一处交接都写明了"谁活下来":提示词栏 → Mac 窗口 → 手机 → 提示词栏 → Hush 框 → LED 屏的第一根网格线 → 三条影片聚拢 → 块状光标写出名字。没有一处是"换一张卡"。
音乐对位也写进了节拍表:Dorothy & IamDayLight 的 Thief(instrumental)115 BPM,小节 2.087 秒,片内 4.40 秒对齐音轨第 33.657 秒的重拍;46.179 秒的 drop 正好落在提示词栏 3 压成线、射向 LED 屏的瞬间。音画是对位出来的,不是随缘配上的。
如果换成你自己做一条片子,SKILL.md 的 8 步协议就是"照跑一遍"的路线图,顺序不可跳过:
- 先把参考片拆成数字:
python3 scripts/analyze_ref.py ref.mp4 --out ana/,输出能量图、剪辑点、静止占比、接触表和运动线(t80 与 smear)。参考片 34% 死静、7 个硬切分两段爆发、元素小、留白多——这些一遍看不出来,不测量就写的片子会两次掉进均匀节奏的坑。 - 出三个概念,选一个:每个概念是一句关于画面的话("一个点变成一切""一个镜头穿过所有尺度"),不是同一套卡片换三种讲法;同时选好 look(
python3 scripts/look.py list/from-shot)。发布片的概念是"提示词栏作为脊柱",它也不是模板里的默认故事。 - 写节拍表,节奏和衔接都要写:镜头长短差 ≥ 4 倍,每个交接处写明什么活下来。发布片的节拍表就是上面的例子。
- 取材:真实页面用 scripts/record_footage.py 按真实时间驱动录制,输入开始瞬间注入洋红标记以便后续定位;或按截图用 HTML 复刻 UI(不录屏),见 references/product-demo.md。
- 合成:
mkdir -p cases/my-film && cp templates/comp.html lib/motion.js cases/my-film/,在动作库上写一个 HTML 文件,每个值都是f(t);物理模拟在__ready里以 240 Hz 预模拟一次再按时间采样,渲染路径上不允许Math.random()(用OM.rng(seed))。 - 渲染:草稿 1080p30(
python3 scripts/render.py comp.html --out draft.mp4),带 180° 快门的真实运动模糊——每个运动帧是快门张开期间的多次采样、在线性光下平均,快动作拖出残影而不是一格一格闪;只有剪辑通过验收后才允许--final出 4K60。 - 配声:六个合成材料放进同一个混响房间(T60 1.1 秒),时间与声像直接从合成导出的事件与速度曲线取,峰值 −8 dBFS 给音乐留位,打点处音乐自动让位。
- 先过验收,再给人看——这就是下一节。
验收:用自带 oracle 检查自己的成片是否成立
发布片在给人看之前,先过的是仓库里的自动化"神谕"(oracle)。入口是 scripts/verify_promo.py:
python3 scripts/verify_promo.py draft.mp4 --comp comp.html --ref ref.mp4 --shots 0,1.6,3.0,4.8,7.0,9.6,12.1,13.25,14.3这条命令跑一组"腿"(leg),只有 FAIL 才让整体 VERDICT 判为 FAIL。每一条腿都是一条被真实拒稿喂出来的规则:
- cadence:镜头长度变异系数 CV ≥ 0.25,等长镜头就是节拍器,就是 PPT;
- rest:≥ 25% 的帧死静(320px 下平均绝对差 < 0.5),且至少有一段 ≥ 1.0 秒的安静——停顿让动作落得下来;
- burst:1.5 秒内 ≥ 3 次大变动的爆发窗口;只有参考片有爆发而你没有时才判 FAIL,否则是 WARN——无爆发的概念(一个元素持续变形、一条镜头穿过尺度)不是缺陷;
- audio:峰值 ≤ −3 dBFS、零削波、≥ 15% 的时间帧安静——音频爆音或从未安静都会被拒;
- continuity:这是唯一一条把被拒与通过的剪辑分开的腿。它调用 scripts/probe.py 读合成:probe 在每一帧记录画面上有什么(DOM 元素、canvas 绘制、文本、色块),找出 0.4 秒内的交接窗,判断有没有东西活着穿过交接并看得见地移动或缩放——carried(有承载者)、anchored(只有大块不变的锚)、bare(什么都没有)。carry score 低于 0.5 判 FAIL,低于 0.7 给 WARN。历史数据摆在脚本 docstring 和 references/rhythm.md 里:
| 片子 | 结果 | carry score |
|---|---|---|
| 更早的发布片 v1:节奏完美,仍然像 PPT | 被否 | 0.00 |
| 同一条 v2 | 被否 | 0.40 |
| v3:每个画面从上一个里长出来 | 通过 | 0.75 |
| onetake 发布片 | 通过 | 0.83 |
| motion-web 第三版 | 通过 | 0.56(WARN 边缘) |
节奏各腿对四部片子全部通过,唯独 continuity 分开了裁决——"连贯是量出来的,不是靠感觉"这句话的字面意思。
- curves:任意元素(含镜头)单帧位移超过 80 px/frame(按 1920 宽归一)而影片又没渲染快门模糊,判 FAIL——这是渲染缺陷,不是设计选择;
- framing:声明在
window.__meta.inFrame里的 id 在对应时间窗内完全出画(或标记'whole'的未完整入画)即 FAIL。one-dot 影片的第一个镜头渲染就是被这一腿抓住的:那颗点被弹簧追不上的甩镜甩出了画,除此之外没有任何人发现。
所以"照着跑一遍"的最后一步其实很简单:跑完verify_promo.py,看 VERDICT 是 PASS 还是 FAIL。PASS 不代表它就是好电影,但 FAIL 一定意味着它还是幻灯片——无论单帧多漂亮。这是 onetake 最反直觉也最值得带走的设计:把"像不像 PPT"从审美判断改写成可执行、可复现、有历史判例的工程检查,让 Agent 在浪费 4K60 渲染和人类观众的耐心之前,先在一堆数字面前栽跟头。
三条提示词、三条影片、一条镜头。现在你可以克隆仓库,把发布片的节拍表当作工作台账,把verify_promo.py当作审片人,试着给你的产品也写一句概念、排一张节拍表、敲一次回车。
【免费下载链接】onetakeMotion films that never cut to the next slide: every beat grows out of the one before, one continuous camera, continuity measured by an oracle. Product launch films and feature demos, made with a coding agent.项目地址: https://gitcode.com/gh_mirrors/on/onetake
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考