diff --git a/AGENTS.md b/AGENTS.md index ce6256c..11d90e8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -41,7 +41,7 @@ | 立意 | 自己想 3 个一句话点子,挑 1 个,写一行理由 | 关卡 ① 给 2–3 张立意卡,每张配一帧画面 | 同左,每张配一段 10–20 s 的草图(look-dev) | | 风格 | 从立意推出来,可以借 `styles/` 的 1 个预设,写明理由 | 写在每张立意卡的"画面"一行(专属,或借一个预设);选卡就一起定了,人可以在回复里换 | 同左;每张卡的草图就是那种风格的小样,借来的预设人想看时在 E0 补小样 | | 分镜 | 简表:镜头、时长、reads | 完整 STORYBOARD + 分镜预览图 | 同左 + animatic | -| 自查 | 整片一张联系表,20 条清单速查一遍 | 每个场景:联系表、关键动作 strip、局部 crop;20 条清单 | 同左,再加手机尺寸测试、循环接缝、无损帧确定性、静默故障扫描 | +| 自查 | 整片一张联系表、一张手机联系表、前 2 s 的 strip,20 条清单速查一遍 | 每个场景:联系表、关键动作 strip、局部 crop;20 条清单 | 同左,再加手机尺寸测试、循环接缝、无损帧确定性、静默故障扫描 | | 独立评审(打分层) | 不做 | 1 轮:全新上下文的 reviewer 打 8 项分(含立意),修最差的 3 处 | ≥ 3 轮,8 项都 ≥ 8 才出片;达不到就带着分数进关卡 ③ | | 声音 | 可以没有,或一段配乐 / 配音加基础混音 | 配乐或配音 + 关键动作音效 + 按视频类型的混音 profile(`bin/vh mix … profile=`)+ `bin/vh qa` | 同左 + 每个动作的拟音和声像 + 最终混音 cue check + 混音报告(`bin/vh qa mix`)没有硬失败 | | 渲染与交付 | draft 画质即可,一个 mp4 | 正式画质 mp4 + 联系表 | 同左 + 网页版、GIF、封面,按需出 9:16 | @@ -55,7 +55,7 @@ **任何档位都不降的底线**: - 硬规则 1(每一帧是 t 的纯函数)、5(事实照抄原文)、7(不在文件里写 key); -- 片中不出现数字静音; +- 片中不出现数字静音(管有声片;用户要的无声片不带音轨,不适用); - 全屏闪白每秒不超过 3 次; - 字号不低于清单下限; - 素材许可要记清; @@ -88,7 +88,7 @@ effort 管 agent 自己查得多细,导演模式管人拍板哪些事,两个 2. **建项目和立意**:`bin/vh new --effort quick`。先写 3 个一句话立意,挑一个(`playbook/12-ideation.md` 第 7 节最后一条),再读 BRIEF 末尾的 TYPE 块,决定留哪些默认。风格从立意推出来,合适的话借一个预设:`bin/vh style apply `(`bin/vh style list` 挑),它的 `STYLE_PRESET.md` 会带进项目,写代码前读一遍。立意和风格各写一行理由进 `DECISIONS.md`;改了哪些口味默认,交付时一并列出。 3. **写**:补齐 BRIEF;分镜只写简表(镜头、时长、reads);然后写场景代码。HyperFrames 写完一段,用 `npx hyperframes snapshot --at <秒> --describe false` 看几个关键时刻。 4. **出片**:HyperFrames 先 `export HYPERFRAMES_SKIP_SKILLS=1 DO_NOT_TRACK=1`,再 `npx hyperframes render --quality draft --output out/draft.mp4`;手绘类用 `node render.mjs --clip --out=out/draft.mp4`。 -5. **自查一遍**:`bin/vh sheet out/draft.mp4` 看整片联系表,对着 `TASTE_CHECKLIST.md` 的 20 条速查;有字就跑 `bin/vh readcheck`。 +5. **自查一遍**:`bin/vh sheet out/draft.mp4` 看整片联系表,对着 `TASTE_CHECKLIST.md` 的 20 条速查;有字就跑 `bin/vh readcheck`。再看两样(命令见 `playbook/02-verification.md` 的"手机测试"):一张手机尺寸的联系表,必读字在手机上读不读得出(横屏片的 44 px 在 360 px 宽的联系表上只有约 8 px,读数、标签别贴着下限);前 2 s 的逐帧 strip,开头是不是第 0 帧就在动、有没有让人停下来的东西。`quick` 没有 reviewer,这两样最容易漏(`docs/research/06-concept-first-ab.md`)。 6. **声音**(要的话):`bin/vh music` 或 `bin/vh tts`,再 `bin/vh mix`、`bin/vh qa`、`bin/vh mux`。 7. **交付**:`bin/vh check` 必跑;交 mp4 路径、联系表,以及自己最不满意的 1–2 处。 diff --git a/CHANGELOG.md b/CHANGELOG.md index e824725..dd18f20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +**Research note 06: concept-first against floors only, and two self-checks for quick** +- `docs/research/06-concept-first-ab.md` (and `en/`): two arms, two requests (a 30 s Milky Way explainer, a 20 s bakery opening, both silent), four films by the same model, scored blind by a fresh reviewer on the eight dimensions. Both times the reviewer found the workflow's film more original (concept 7 vs 6, 8 vs 7) and chose the floors-only film to post; the means differ by 0.3 and 0.7, likely within run-to-run noise, so the pairwise choices are what the note reads. Its reasons: labels sitting exactly at the 44 px floor, about 8 px on a phone, and a key transformation done as a dissolve. Slowness does not explain it: measured the same way (frame differences), both arms are about as still (opposite ways in the two pairs); arm B's stillness starts at the very beginning, but the hook scores do not tie that to the result. In one pair (Milky Way, 8/10 similar) the model reached much the same idea without the workflow. All four hooks scored 3–5; time and tokens about equal. Figure: five frames per film. +- Changes it led to: the quick card's self-check (and `playbook/02`'s effort note) adds a phone-size contact sheet and a first-2 s strip, with the strip command and what 44 px becomes on a phone; `playbook/12-ideation.md` §6 says readouts people must read should not sit at the floor; the digital-silence floor says it applies to films with sound (CLAUDE.md, playbook 12, TASTE_CHECKLIST #18), which both workflow agents had to reason out; type 02's caption weight falls back to the local font's heaviest; type 03's checks add searching a fictional brand name for a real one (one film named its bakery 一条, a known brand). Open: whether the 44 px floor, written for 1080 wide, should scale for landscape. + **Five full-film skeletons that start from a concept** - Why: playbook 12 asks for the concept first; the five concepts in `cases/oneshot-five.md` are worth having as ready skeletons, next to the three energy-arc ones. - `recipes/sequences/`: `time-dilation-replay` (an instant slowed to one or two minutes; the clock and slow-motion factor stay on screen, the factor is the inverse slope of a screen-time → real-time table), `machine-eye-portrait` (150–240 s, a short version keeps the ends and the inference; a narrator who has read all your records speaks to you; quotes with sources, inferences labelled, a paradox at both ends; its fade-through-black and long holds declared as taste overrides; privacy check before publishing), `making-of-self` (each step of how it was made drawn with that step's technique, one object carried through; self-referential numbers must be true), `mascot-style-tour` (one mascot through ten style worlds, presets from `styles/` as the worlds; flash-stitch on the two widest jumps only; the 12 empty black frames before the logo keep a bed instead of the original's digital silence), `workflow-as-story` (one object through the product's real workflow, a pull-back reveal at the end). Each has an energy arc, hold budget, seams by energy (head and tail included), limits and sources; recipes are cited only for what they do, the rest is marked 自创; all `status: draft`, original (`derived_from: []`), not yet tried in a film here. diff --git a/CLAUDE.md b/CLAUDE.md index 75149d0..450d305 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -38,7 +38,7 @@ | 立意 | 自己想 3 个一句话点子,挑 1 个,写一行理由 | 关卡 ① 给 2–3 张立意卡,每张配一帧画面 | 同左,每张配一段 10–20 s 的草图(look-dev) | | 风格 | 从立意推出来,可以借 `styles/` 的 1 个预设,写明理由 | 写在每张立意卡的"画面"一行(专属,或借一个预设);选卡就一起定了,人可以在回复里换 | 同左;每张卡的草图就是那种风格的小样,借来的预设人想看时在 E0 补小样 | | 分镜 | 简表:镜头、时长、reads | 完整 STORYBOARD + 分镜预览图 | 同左 + animatic | -| 自查 | 整片一张联系表,20 条清单速查一遍 | 每个场景:联系表、关键动作 strip、局部 crop;20 条清单 | 同左,再加手机尺寸测试、循环接缝、无损帧确定性、静默故障扫描 | +| 自查 | 整片一张联系表、一张手机联系表、前 2 s 的 strip,20 条清单速查一遍 | 每个场景:联系表、关键动作 strip、局部 crop;20 条清单 | 同左,再加手机尺寸测试、循环接缝、无损帧确定性、静默故障扫描 | | 独立评审(打分层) | 不做 | 1 轮:全新上下文的 reviewer 打 8 项分(含立意),修最差的 3 处 | ≥ 3 轮,8 项都 ≥ 8 才出片;达不到就带着分数进关卡 ③ | | 声音 | 可以没有,或一段配乐 / 配音加基础混音 | 配乐或配音 + 关键动作音效 + 按视频类型的混音 profile(`bin/vh mix … profile=`)+ `bin/vh qa` | 同左 + 每个动作的拟音和声像 + 最终混音 cue check + 混音报告(`bin/vh qa mix`)没有硬失败 | | 渲染与交付 | draft 画质即可,一个 mp4 | 正式画质 mp4 + 联系表 | 同左 + 网页版、GIF、封面,按需出 9:16 | @@ -52,7 +52,7 @@ **任何档位都不降的底线**: - 硬规则 1(每一帧是 t 的纯函数)、5(事实照抄原文)、7(不在文件里写 key); -- 片中不出现数字静音; +- 片中不出现数字静音(管有声片;用户要的无声片不带音轨,不适用); - 全屏闪白每秒不超过 3 次; - 字号不低于清单下限; - 素材许可要记清; @@ -85,7 +85,7 @@ effort 管 agent 自己查得多细,导演模式管人拍板哪些事,两个 2. **建项目和立意**:`bin/vh new --effort quick`。先写 3 个一句话立意,挑一个(`playbook/12-ideation.md` 第 7 节最后一条),再读 BRIEF 末尾的 TYPE 块,决定留哪些默认。风格从立意推出来,合适的话借一个预设:`bin/vh style apply `(`bin/vh style list` 挑),它的 `STYLE_PRESET.md` 会带进项目,写代码前读一遍。立意和风格各写一行理由进 `DECISIONS.md`;改了哪些口味默认,交付时一并列出。 3. **写**:补齐 BRIEF;分镜只写简表(镜头、时长、reads);然后写场景代码。HyperFrames 写完一段,用 `npx hyperframes snapshot --at <秒> --describe false` 看几个关键时刻。 4. **出片**:HyperFrames 先 `export HYPERFRAMES_SKIP_SKILLS=1 DO_NOT_TRACK=1`,再 `npx hyperframes render --quality draft --output out/draft.mp4`;手绘类用 `node render.mjs --clip --out=out/draft.mp4`。 -5. **自查一遍**:`bin/vh sheet out/draft.mp4` 看整片联系表,对着 `TASTE_CHECKLIST.md` 的 20 条速查;有字就跑 `bin/vh readcheck`。 +5. **自查一遍**:`bin/vh sheet out/draft.mp4` 看整片联系表,对着 `TASTE_CHECKLIST.md` 的 20 条速查;有字就跑 `bin/vh readcheck`。再看两样(命令见 `playbook/02-verification.md` 的"手机测试"):一张手机尺寸的联系表,必读字在手机上读不读得出(横屏片的 44 px 在 360 px 宽的联系表上只有约 8 px,读数、标签别贴着下限);前 2 s 的逐帧 strip,开头是不是第 0 帧就在动、有没有让人停下来的东西。`quick` 没有 reviewer,这两样最容易漏(`docs/research/06-concept-first-ab.md`)。 6. **声音**(要的话):`bin/vh music` 或 `bin/vh tts`,再 `bin/vh mix`、`bin/vh qa`、`bin/vh mux`。 7. **交付**:`bin/vh check` 必跑;交 mp4 路径、联系表,以及自己最不满意的 1–2 处。 diff --git a/docs/research/06-concept-first-ab.md b/docs/research/06-concept-first-ab.md new file mode 100644 index 0000000..2c53caa --- /dev/null +++ b/docs/research/06-concept-first-ab.md @@ -0,0 +1,99 @@ +# 06 · 立意先行到底管不管用:同一句需求,只守底线对走流程 + +*记录于 2026-10-02 · 状态:立意先行的流程已合并([#44](https://github.com/ZLHad/OpenVideoHarness/pull/44)、[#45](https://github.com/ZLHad/OpenVideoHarness/pull/45)),这篇笔记带来的几处修改在本笔记的 PR 里;四支片子、两个项目和评审记录是作者本地的文件,没有入库 · [English](en/06-concept-first-ab.md)* + +## 问题 + +[#44](https://github.com/ZLHad/OpenVideoHarness/pull/44) 把流程改成"先想立意,再定风格",把审美规则分成底线和可以被立意改写的默认口味。起因是维护者担心流程把 Opus 5.5 这类模型管得太死(`cases/oneshot-five.md`)。改完以后有两个问题没人量过: + +1. 走流程(立意先行)的片子,点子是不是真的更有意思? +2. 和只守底线、其余全靠模型自己的片子比,做工是好了还是差了? + +## 做法 + +- **需求**:两句,都是用户常发的那种一句话,都要求静音可读、不要配乐(省掉声音这一层,只比画面)。 + - 银河:「做一支 30 秒的横屏短片:为什么住在城市里看不到银河。静音也要看得懂,不用配乐。」 + - 面包店:「给一家只卖一种面包的小面包店做一支 20 秒的开业短片,横屏。静音也要看得懂,不用配乐。」 +- **两个组**,每组每句需求各做一支,共四支。都是同一个模型(Claude Opus 5.5,subagent),都用 HyperFrames 0.8.82、1920×1080、30 fps、draft 画质,都给约 45 分钟。 + - **A 组,只守底线**:不许打开仓库的流程文档(CLAUDE.md、类型文档、playbook、风格库、配方、案例、清单),只能读 `engines/README.md` 的 HyperFrames 一节。只给五条底线:每帧是 t 的纯函数、事实不编、字号和停留时间的下限、闪白频率、规格。 + - **B 组,走流程**:读 #44 定稿的 CLAUDE.md,按 `quick` 档的路径卡走(用户原话"快速出一版,不用问我"),包括立意一步和 `playbook/12-ideation.md`。 +- **盲评**:一个全新上下文的 reviewer(同一个模型,人设是严苛的动效导演),只拿到四支片子的 mp4、每秒一帧的联系表、手机尺寸的联系表和前 2 s 的逐帧 strip,标签是 M-1、M-2、K-1、K-2,不知道哪支是哪个组,也不知道这是 A/B 实验。它按打分层的八个维度打分(1–10,每项 ≥ 8 才算能发),两两比较"哪支更有新意、哪支做得更好、只能发一支发哪支",再给两支同题片子的核心点子打相似度(0–10)。 +- **静止段**:另外用同一个口径量了四支片子:480×270 灰度,相邻两帧的平均差小于 0.3/255 记为静止,只数连续 2 s 以上的段。 + +来源:四个 subagent 的任务说明和交付报告、两个 B 组项目的 `DECISIONS.md`、`NOTES.md` 和 `index.html`、盲评报告;都是作者本地的文件,没有入库。打分维度见 [`templates/TASTE_CHECKLIST.md`](../../templates/TASTE_CHECKLIST.md) 的打分层。 + +## 发现 + +![四支片子各五帧:上两行是银河,下两行是面包店](figs/06-four-films.zh.jpg) + +*图 1 · 每行一支片子,取 5 个时刻。M-1、K-2 是 B 组(走流程),M-2、K-1 是 A 组(只守底线)。* + +**1. 评审两次都觉得走流程的那支更有新意,两次都选了只守底线的那支去发。** + +| 维度 | 银河 · B(M-1) | 银河 · A(M-2) | 面包店 · A(K-1) | 面包店 · B(K-2) | +|---|---|---|---|---| +| 立意 | 7 | 6 | 7 | 8 | +| 钩子 | 4 | 3 | 5 | 5 | +| 手机可读 | 5 | 7 | 7 | 8 | +| 运动质量 | 6 | 6 | 7 | 5 | +| 变化 | 4 | 5 | 7 | 4 | +| 构图与完成度 | 5 | 7 | 7 | 6 | +| 内容准确 | 8 | 7 | 8 | 8 | +| 静音可读 | 7 | 8 | 8 | 6 | +| 平均 | 5.8 | 6.1 | 7.0 | 6.3 | + +四支都没过线:线是每项 ≥ 8,每支都有 3–5 分的项。B 组两支的"立意"各高 1 分。平均分的差,银河只有 0.3,面包店 0.7;一支片子重跑一次,分数大概就会动 1–2 分(没量),所以平均分的差不能当结论,能看的是评审在两两比较里的选择:两次都是"B 更新、A 更好、发 A"。 + +**2. B 组输在哪:评审给的理由是具体的几处,不是"慢"。** +- 银河 B:常驻 HUD(光害等级和两根亮度条)是立意本身,可它的标签字号正好是 44 px 的下限(项目 `index.html` 里的 `.hk`、`.bl`、`.src` 都是 44 px),在 360 px 宽的手机联系表上约 8 px,评审读不出(手机可读 5,A 那支 7);构图也被判不如 A。 +- 面包店 B:全片最关键的"墨变成面团"做成了叠化,评审说"真正的变形没让人看见"(运动质量 5,A 那支 7);中段一根面包浮着、一行字打出来,没有新事件。 +- 评审的"变化"给 B 两支都打了 4,理由是静止段(它自己量的口径更松,报出的段更长,例如银河 B 的 18.5–27 s)。按同一口径重量,两组的静止差不多: + +| | 银河 · B | 银河 · A | 面包店 · A | 面包店 · B | +|---|---|---|---|---| +| 2 s 以上的静止段合计 | 12.8 s | 14.3 s | 9.0 s | 10.2 s | +| 最长的一段 | 4.0 s(0.2–4.2 s) | 5.0 s(25.0–30.0 s) | 4.3 s(15.7–20.0 s) | 3.6 s(16.4–20.0 s) | + +银河那对 A 更多,面包店那对 B 稍多,方向相反。所以"立意选了慢,B 才输"这个解释站不住。看得出的一点不同是静止落在哪:B 两支的第一段静止都从开头就开始(银河 0.2 s、面包店 0.5 s),A 两支要到 2.3 s 和 4.0 s 才开始,最长的一段落在定版上。但钩子分并不支持它是原因:钩子最低的是 A 的银河(3 分),它也在 2.3 s 就停了 3.5 s。这只是一个观察。 + +**3. 没有流程,模型自己也会想到差不多的点子,至少在一对里是这样。** 银河这一对的核心点子相似度 8/10:同样的城市天际线、关灯露出银河、"银河的光不变,背景涨上来"的亮度条,引用的是同一篇论文(Falchi 等,2016)。面包店这一对是 4/10:两支都把"一"字当成核心,A 是"满架面包减到只剩一个,割口变成店名的一",B 是"写下的一横烤成长棍,再变成店招"。在这一对里,B 的点子被判更新。立意先行至少做到了一件事:把模型本来就会走的那一步变成必经的一步,并且留下了记录(B 组每支都写了 3 个立意和否掉另外 2 个的理由,口味覆盖 3–6 条,每条有理由和翻案的代价)。 + +**4. 钩子四支都弱**(3–5 分)。两组都用了慢开场:静止的问题句、空的练字格、满架面包慢慢掉。`quick` 档不出钩子卡,立意卡上的"钩子"一行也没有哪一步去检查。 + +**5. 成本差不多。** + +| | 银河 · A | 银河 · B | 面包店 · A | 面包店 · B | +|---|---|---|---|---| +| 耗时 | 19.6 min | 19.5 min | 16.3 min | 13.1 min | +| token(subagent 合计) | 22.1 万 | 23.9 万 | 18.9 万 | 20.6 万 | +| 工具调用 | 53 | 53 | 42 | 42 | + +**6. 评审顺带发现的两件事。** 面包店 B 给店起名"一条",评审指出这是一个知名的媒体和零售品牌,要先查重名。面包店 A 在定版上写了一个开业日期"10月18日":按 A 组拿到的底线(事实不编)算有争议,B 组则自己选了不写日期;评审给两支的"内容准确"都是 8 分,这一项对这类差别没有区分度。 + +**7. 流程文档里有两处说不清。** 两个 B 组 agent 都花了一段推理去判断"片中不出现数字静音"这条底线管不管一支用户要求的无声片(结论都是不管,但文档没写);类型 02 的 Prompt 块写字幕字重 800,本机的苹方最粗只有 600。 + +来源:盲评报告(打分、两两比较、相似度、品牌名);静止段用上面的口径对四个 mp4 重算;四个 subagent 的交付报告和用量记录(耗时、token、工具调用);两个 B 组项目的 `DECISIONS.md`、`NOTES.md` 和 `index.html`(字号);面包店 A 的 `index.html`(日期)。图 1 由四支片子的 mp4 取帧拼成。 + +## 因此改了什么 + +改在本笔记所在的 PR 里,都是补 `quick` 档缺的检查和说不清的地方,不是给立意加限制: + +- **quick 的自查多两样**(CLAUDE.md 的 quick 路径卡第 5 步、`playbook/02-verification.md` 开头的档位说明):一张手机尺寸的联系表,看必读字在手机上读不读得出(横屏片的 44 px 在 360 px 宽的联系表上只有约 8 px);前 2 s 的逐帧 strip,看开头是不是第 0 帧就在动、有没有让人停下来的东西。`playbook/02` 补了 strip 的命令。 +- **立意卡上的读数别贴着下限**(`playbook/12-ideation.md` 第 6 节):靠常驻读数讲答案的立意,读数里要人读的部分用手机联系表量过。 +- **说清楚两处**:数字静音那条底线只管有声片,用户要的无声片不带音轨就不适用(CLAUDE.md、`playbook/12` 第 6 节、TASTE_CHECKLIST #18);类型 02 的字重写成"800,本机字体没有就用它最粗的一档"。 +- **虚构的品牌名先查重名**(类型 03 的自查重点)。 + +来源:本笔记所在 PR 的改动。 + +## 局限与没解决的 + +- **样本极小**:两句需求,每格一支,一次运行,评审打的分本身就会抖。这里只能看方向,不能当结论。 +- **评审也是模型**:同一个模型扮演的 reviewer,不是人。它对"新意"和"做工"的判断和人一致到什么程度,不知道。 +- **只比了 `quick` 档**:`standard` 和 `studio` 有人工关卡和 reviewer,第 2 点的问题按理会在打分层被抓住,但这次没有跑。 +- **只比了画面**:两句需求都不要声音,声音那一半流程(配乐、拟音、混音)没有进来。 +- **A 组并不"干净"**:subagent 的上下文里可能本来就带着仓库的 CLAUDE.md,只是被要求不看;它们读了 `engines/README.md` 的 HyperFrames 一节,那一节本身带着一些写法上的习惯。 +- **"立意"一项正是要检验的东西**:评审按打分层打分,打分层的第一项"立意"是 #44 加的;B 组在这一项上占便宜,部分可能来自它的点子写得更像打分层要的样子。两两比较"哪支更有新意"不看这一项,结论一致。 +- **字号下限和横屏**:`playbook/03` 第 4 节和 TASTE_CHECKLIST #6 写的是"1080 宽主标题 84px / 辅助 44px"。竖屏 1080 宽时,44 px 在手机上约 15 px;横屏 1920 宽时只有约 8 px。下限要不要按画幅换算,这次没有定,先用手机联系表兜着。 +- **`bin/vh check` 的冻结检测抓不住这类静止**:它用 `freezedetect=d=3`,银河 B 的 NOTES 记了一段命中、判为通过,面包店 B 的 check 没报冻结;而按上面的口径,两支都有 3 s 以上几乎不动的段。所以没有把它当成新的自查项。 + +来源:两个 B 组项目的 `NOTES.md`;[`bin/vh`](../../bin/vh) 的 `check`;[`playbook/03-motion-design.md`](../../playbook/03-motion-design.md) 第 4 节。 diff --git a/docs/research/README.md b/docs/research/README.md index 1ed0bb6..f650914 100644 --- a/docs/research/README.md +++ b/docs/research/README.md @@ -13,6 +13,7 @@ | 03 | [同一份代码,为什么渲出不同的像素](03-render-determinism.md) | GPU 文字光栅、截帧路径和 x264 线程各自让输出不同,x264 再把几个像素放大成整条码流的差别。CPU 光栅加单线程编码之后样片逐字节相同,代价是画面变一次、渲染慢一些。 | | 04 | [画面上的字要停多久](04-readability.md) | 介绍片 v3 的 63 条画面文字只有 5 条停够,引出这次核对的那一段 24 条全不够(读得到的中位数 0.9 s,要求 2.7 s):标签跟着镜头走、被安全框推成半透明、decode 吃掉读的时间。 | | 05 | [配乐的篇章、主题和起伏](05-music-form.md) | 介绍片配乐的响度是一块平台,最响的一段只比第二响高 1.8 LU;三首示范有谷有峰。没人能听时,用响度曲线、音头密度和发声声部数来量篇章和起伏。 | +| 06 | [立意先行到底管不管用](06-concept-first-ab.md) | 同一句需求,只守底线对走流程,各做两支、盲评:评审两次都觉得走流程的那支更有新意,两次都选了只守底线的那支去发(理由是手机上读不出的字、叠化掉的关键变形,不是"慢":按同一口径量,两组静止差不多)。两对里有一对,模型不走流程也想到了差不多的点子。因此给 `quick` 加了手机联系表和前 2 s 的 strip。 | ## 图 @@ -25,6 +26,7 @@ | ![介绍片配乐与三首示范的响度曲线](figs/05-loudness-arcs.png)
图 5.1 · 05:介绍片现有配乐对三首示范的响度曲线 | ![示范 1 的响度曲线、动机入口和音头密度](figs/05-product-arc.png)
图 5.2 · 05:示范 1 的响度、动机入口和音头密度 | | ![02 doppler 的 A 与 C:中文旁白每句的 VMR](figs/01-doppler-ac.png)
图 1.3 · 01:中文旁白的 A 对 C | ![四个重写后样片的频谱图](figs/02-spectrograms.png)
图 2.3 · 02:四个重写后样片的频谱图 | | ![同一帧 GPU 渲的、CPU 渲的和放大 8 倍的差](figs/03-gpu-cpu-diff.png)
图 3.3 · 03:同一帧 GPU 与 CPU 渲的差别(放大 8 倍) | ![v4 原型在 42.93 s 的一帧](figs/04-v4-prototype.jpg)
图 4.3 · 04:v4 原型的一帧:回环标签挪进环内 | +| ![四支片子各五帧:只守底线对走流程](figs/06-four-films.zh.jpg)
图 6.1 · 06:四支片子各五帧,A 只守底线、B 走流程 | | ## 怎么读 diff --git a/docs/research/en/06-concept-first-ab.md b/docs/research/en/06-concept-first-ab.md new file mode 100644 index 0000000..be8acf0 --- /dev/null +++ b/docs/research/en/06-concept-first-ab.md @@ -0,0 +1,99 @@ +# 06 · Does concept-first pay off? One request, floors only against the workflow + +*Written 2026-10-02 · Status: the concept-first workflow is merged ([#44](https://github.com/ZLHad/OpenVideoHarness/pull/44), [#45](https://github.com/ZLHad/OpenVideoHarness/pull/45)); the changes this note led to are in this note's PR; the four films, the two projects and the review are the author's local files, not in the repo · [中文](../06-concept-first-ab.md)* + +## Question + +[#44](https://github.com/ZLHad/OpenVideoHarness/pull/44) changed the workflow to "concept first, then style" and split the taste rules into floors and defaults a concept may override. It came from the maintainer's worry that the workflow held Opus 5.5-class models too tight (`cases/oneshot-five.md`). Two questions were left unmeasured: + +1. Do films made through the workflow (concept first) have more interesting ideas? +2. Against films that keep only the floors and leave the rest to the model, is the craft better or worse? + +## Method + +- **Requests**: two, both the one-line kind users send, both silent with no music (no sound layer, so only the picture is compared). + - Milky Way: 「做一支 30 秒的横屏短片:为什么住在城市里看不到银河。静音也要看得懂,不用配乐。」 (a 30 s landscape short: why you can't see the Milky Way from a city; readable with the sound off, no music) + - Bakery: 「给一家只卖一种面包的小面包店做一支 20 秒的开业短片,横屏。静音也要看得懂,不用配乐。」 (a 20 s landscape opening film for a small bakery that sells only one bread; readable with the sound off, no music) +- **Two arms**, one film per request each, four films in all. Same model (Claude Opus 5.5, as subagents), HyperFrames 0.8.82, 1920×1080, 30 fps, draft quality, about 45 minutes each. + - **Arm A, floors only**: not allowed to open the repo's workflow docs (CLAUDE.md, type docs, playbooks, style library, recipes, cases, checklists); only the HyperFrames section of `engines/README.md`. Five floors given: every frame a pure function of t, no invented facts, minimum text size and hold, flash rate, the spec. + - **Arm B, the workflow**: read CLAUDE.md as finalised in #44 and follow the `quick` path card (the user's words: "快速出一版,不用问我", a quick draft, don't ask me), including the concept step and `playbook/12-ideation.md`. +- **Blind review**: a fresh-context reviewer (the same model, briefed as a harsh motion director) got only the four mp4s, a 1 fps contact sheet, a phone-size contact sheet and a frame-by-frame strip of the first 2 s for each, labelled M-1, M-2, K-1, K-2, without knowing which arm made which or that this was an A/B test. It scored the eight dimensions of the scoring layer (1–10; every dimension ≥ 8 means ready to post), compared each pair (more original, better made, which one to post), and rated how similar the two films' core ideas were (0–10). +- **Static stretches**: measured the same way for all four films: 480×270 greyscale, a frame counts as still when its mean difference from the next frame is under 0.3/255, and only runs of 2 s or more count. + +Sources: the four subagents' briefs and delivery reports, the two arm-B projects' `DECISIONS.md`, `NOTES.md` and `index.html`, the blind review; all the author's local files, not in the repo. The scoring dimensions are the scoring layer of [`templates/TASTE_CHECKLIST.md`](../../../templates/TASTE_CHECKLIST.md). + +## Findings + +![Five frames from each of the four films: Milky Way in the top two rows, bakery in the bottom two](../figs/06-four-films.jpg) + +*Figure 1 · One film per row, five moments each. M-1 and K-2 are arm B (the workflow), M-2 and K-1 arm A (floors only).* + +**1. Both times the reviewer found the workflow's film more original, and both times it chose the floors-only film to post.** + +| Dimension | Milky Way · B (M-1) | Milky Way · A (M-2) | Bakery · A (K-1) | Bakery · B (K-2) | +|---|---|---|---|---| +| Concept | 7 | 6 | 7 | 8 | +| Hook | 4 | 3 | 5 | 5 | +| Phone readability | 5 | 7 | 7 | 8 | +| Motion | 6 | 6 | 7 | 5 | +| Variety | 4 | 5 | 7 | 4 | +| Composition and finish | 5 | 7 | 7 | 6 | +| Accuracy | 8 | 7 | 8 | 8 | +| Silent clarity | 7 | 8 | 8 | 6 | +| Mean | 5.8 | 6.1 | 7.0 | 6.3 | + +None of the four passes: the bar is ≥ 8 on every dimension, and each film has a dimension at 3–5. Both arm-B films score 1 higher on concept. The mean differs by only 0.3 for the Milky Way pair and 0.7 for the bakery pair; one film's scores probably move 1–2 points between runs (not measured), so the means are not a result. What can be read is the reviewer's pairwise choice, the same both times: B newer, A better made, post A. + +**2. Where arm B lost: the reviewer gave specific reasons, and "slowness" is not one that holds up.** +- Milky Way B: the permanent HUD (light-pollution level, two brightness bars) is the concept itself, but its labels sit exactly at the 44 px floor (`.hk`, `.bl` and `.src` in the project's `index.html` are all 44 px), about 8 px on a 360 px phone sheet, which the reviewer could not read (phone readability 5, against 7 for A); its composition was also judged weaker than A's. +- Bakery B: the key moment, ink becoming dough, is a dissolve, so "the actual transformation is never seen" (motion 5, against 7 for A); in the middle a baguette floats while a line of text types on, with no new event. +- The reviewer gave both arm-B films 4 on variety, citing static stretches (its own measure was looser and reported longer stretches, such as 18.5–27 s in Milky Way B). Measured again the same way for all four, the two arms are about as still: + +| | Milky Way · B | Milky Way · A | Bakery · A | Bakery · B | +|---|---|---|---|---| +| Static stretches ≥ 2 s, total | 12.8 s | 14.3 s | 9.0 s | 10.2 s | +| Longest | 4.0 s (0.2–4.2 s) | 5.0 s (25.0–30.0 s) | 4.3 s (15.7–20.0 s) | 3.6 s (16.4–20.0 s) | + +A is stiller in the Milky Way pair and B slightly stiller in the bakery pair, opposite ways. So "the concept chose slowness and that is why B lost" does not hold up. One visible difference is where the stillness falls: both arm-B films go still from the start (Milky Way 0.2 s, bakery 0.5 s), while arm A's first still stretch starts at 2.3 s and 4.0 s, and its longest falls on the end card. The hook scores do not support it as a cause, though: the lowest hook is arm A's Milky Way (3), which also stops for 3.5 s from 2.3 s. It is only an observation. + +**3. Without the workflow, the model comes up with much the same idea, at least in one pair.** The Milky Way pair's core ideas rate 8/10 similar: the same city skyline, the lights going off to reveal the Milky Way, a "Milky Way light constant, background rising" bar, and the same paper (Falchi et al., 2016). The bakery pair rates 4/10: both make the character 一 ("one") the core, but arm A goes "a full shelf down to one loaf, whose score line becomes the 一 of the name" and arm B "a written stroke bakes into a baguette, then becomes the shop sign"; in this pair B's idea was judged newer. Concept-first at least did one thing: it made a step the model would take anyway a required one, and left a record (each arm-B film wrote 3 concepts and the reasons for rejecting 2, and 3–6 taste overrides, each with a reason and the cost of reverting). + +**4. All four hooks are weak** (3–5). Both arms opened slowly: a static question, an empty practice grid, a full shelf slowly emptying. `quick` makes no hook cards, and nothing checks the "hook" line on the concept card. + +**5. The cost is about the same.** + +| | Milky Way · A | Milky Way · B | Bakery · A | Bakery · B | +|---|---|---|---|---| +| Time | 19.6 min | 19.5 min | 16.3 min | 13.1 min | +| Tokens (subagent total) | 221k | 239k | 189k | 206k | +| Tool calls | 53 | 53 | 42 | 42 | + +**6. Two things the reviewer noticed along the way.** Bakery B named the shop 一条, which the reviewer pointed out is a well-known media and retail brand, so the name needs checking first. Bakery A put an opening date, 10月18日 (18 October), on its end card: against the floor arm A was given (no invented facts) that is debatable, and arm B chose not to write a date; the reviewer gave both films 8 on accuracy, so that dimension does not separate this kind of difference. + +**7. Two places in the docs were unclear.** Both arm-B agents spent some reasoning on whether the floor "no digital silence mid-film" applies to a silent film the user asked for (both concluded it does not, but the docs did not say); type 02's prompt block asks for caption weight 800, and the local PingFang's heaviest is 600. + +Sources: the blind review (scores, pairs, similarity, the brand name); static stretches recomputed from the four mp4s as described above; the four subagents' delivery reports and usage records (time, tokens, tool calls); the two arm-B projects' `DECISIONS.md`, `NOTES.md` and `index.html` (text sizes); bakery A's `index.html` (the date). Figure 1 is frames taken from the four mp4s. + +## What changed because of it + +In this note's PR. They fill checks `quick` was missing and clear up the unclear places; none of them limits concepts: + +- **Two more self-checks in quick** (CLAUDE.md, the quick card's step 5; the effort note at the top of `playbook/02-verification.md`): a phone-size contact sheet for whether required text reads on a phone (44 px in a landscape film is about 8 px on a 360 px sheet), and a frame-by-frame strip of the first 2 s for whether the opening moves from frame 0 and has something that stops the thumb. `playbook/02` gains the strip command. +- **Readouts on a concept card should not sit at the floor** (`playbook/12-ideation.md` §6): a concept that tells its answer through permanent readouts checks the parts people must read on the phone sheet. +- **Two clarifications**: the digital-silence floor applies to films with sound; a silent film the user asked for, with no audio track, is outside it (CLAUDE.md, `playbook/12` §6, TASTE_CHECKLIST #18); type 02's weight reads "800, or the heaviest the local font has". +- **A fictional brand name is checked against real ones** (type 03's checks). + +Sources: the changes in this note's PR. + +## Limitations and open questions + +- **A tiny sample**: two requests, one film per cell, one run, and the reviewer's scores move too. This shows a direction, not a conclusion. +- **The reviewer is a model too**: the same model briefed as a reviewer, not people. How well its judgement of "original" and "well made" matches a human's is unknown. +- **Only `quick` was compared**: `standard` and `studio` have human gates and a reviewer that should catch finding 2 in the scoring layer, but they were not run. +- **Only the picture was compared**: both requests asked for no sound, so the sound half of the workflow (score, foley, mix) is not in it. +- **Arm A is not "clean"**: the subagents may have had the repo's CLAUDE.md in their context and were only told not to follow it; they read the HyperFrames section of `engines/README.md`, which carries some habits of its own. +- **"Concept" is the thing under test**: the reviewer scored with the scoring layer, whose first dimension, concept, #44 added; part of arm B's edge there may come from writing ideas the way the scoring layer asks for. The pairwise "more original" judgement does not use that dimension and agrees. +- **The size floor and landscape**: `playbook/03` §4 and TASTE_CHECKLIST #6 say "at 1080 wide, headline 84 px / secondary 44 px". At 1080 wide (vertical), 44 px is about 15 px on a phone; at 1920 wide (landscape), about 8 px. Whether the floor should scale with the frame was not settled here; the phone sheet covers it for now. +- **`bin/vh check`'s freeze detection misses this kind of stillness**: it uses `freezedetect=d=3`; Milky Way B's NOTES logged one hit and passed it, and bakery B's check reported no freeze, yet by the measure above both have stretches of over 3 s that barely move. So it was not made a new self-check. + +Sources: the two arm-B projects' `NOTES.md`; `check` in [`bin/vh`](../../../bin/vh); [`playbook/03-motion-design.md`](../../../playbook/03-motion-design.md) §4. diff --git a/docs/research/en/README.md b/docs/research/en/README.md index 3e5ccd8..241fa07 100644 --- a/docs/research/en/README.md +++ b/docs/research/en/README.md @@ -13,6 +13,7 @@ Some things we measured while making video with code, and what we changed in the | 03 | [Same code, different pixels](03-render-determinism.md) | GPU text rasterisation, the capture path and x264 threads each made the output differ, and x264 amplified a few pixels into a different stream. CPU rasterisation plus single-threaded encoding made the swatches byte-identical, at the cost of a one-time picture change and slower renders. | | 04 | [How long text has to stay on screen](04-readability.md) | Only 5 of the intro film v3's 63 on-screen texts stay long enough, and none of the 24 in the stretch that prompted the review (median readable 0.9 s, 2.7 s required): labels follow the camera, are pushed to half transparency by the safe frame, and decoding eats the reading time. | | 05 | [Chapters, motif and dynamic arc](05-music-form.md) | The intro film's score is a loudness plateau, its loudest section only 1.8 LU above the second; the three demos have a valley and a peak. With nobody able to listen, loudness curves, note density and parts sounding measure chapters and arc. | +| 06 | [Does concept-first pay off?](06-concept-first-ab.md) | One request, floors only against the workflow, two films each, blind review: both times the reviewer found the workflow's film more original and chose the floors-only film to post (for text unreadable on a phone and a key transformation lost in a dissolve, not slowness: measured the same way, both arms are about as still). In one of the two pairs the model reached much the same idea without the workflow. So `quick` gets a phone sheet and a first-2 s strip. | ## Figures @@ -25,6 +26,7 @@ Some things we measured while making video with code, and what we changed in the | ![Loudness curves of the intro film's score and three demos](../figs/05-loudness-arcs.png)
Figure 5.1 · 05: the intro film's current score against three demos | ![Demo 1: loudness curve, motif entrances and note density](../figs/05-product-arc.png)
Figure 5.2 · 05: demo 1, loudness, motif entrances and note density | | ![Film 02 doppler, versions A and C: VMR per line of the Chinese narration](../figs/01-doppler-ac.png)
Figure 1.3 · 01: A against C for the Chinese narration | ![Spectrograms of four re-scored swatches](../figs/02-spectrograms.png)
Figure 2.3 · 02: spectrograms of four re-scored swatches | | ![The same frame rendered on the GPU and on the CPU, and their difference times 8](../figs/03-gpu-cpu-diff.png)
Figure 3.3 · 03: the same frame on GPU and CPU, and the difference ×8 | ![A frame of the v4 prototype at 42.93 s](../figs/04-v4-prototype.jpg)
Figure 4.3 · 04: a v4 prototype frame: the loop label moved inside the ring | +| ![Five frames from each of four films: floors only against the workflow](../figs/06-four-films.jpg)
Figure 6.1 · 06: five frames from each of the four films, A floors only, B the workflow | | ## How to read them diff --git a/docs/research/figs/06-four-films.jpg b/docs/research/figs/06-four-films.jpg new file mode 100644 index 0000000..4bb9b27 Binary files /dev/null and b/docs/research/figs/06-four-films.jpg differ diff --git a/docs/research/figs/06-four-films.zh.jpg b/docs/research/figs/06-four-films.zh.jpg new file mode 100644 index 0000000..95bb05a Binary files /dev/null and b/docs/research/figs/06-four-films.zh.jpg differ diff --git a/playbook/02-verification.md b/playbook/02-verification.md index 06a8f06..69ebbe4 100644 --- a/playbook/02-verification.md +++ b/playbook/02-verification.md @@ -5,9 +5,9 @@ ## 七层检查 做到第几层,按努力程度定(CLAUDE.md"努力程度"): -- `quick`:第 1、2 层,加上整片一张联系表,出片前跑 `bin/vh check`; +- `quick`:第 1、2 层,加上整片一张联系表、一张手机联系表和前 2 s 的逐帧 strip(命令见下文"手机测试"),出片前跑 `bin/vh check`; - `standard`:七层都做,第 5 层的独立评审做 1 轮; -- `studio`:七层都做,第 5 层至少 3 轮,外加下文的手机测试、循环接缝、无损确定性和音频 QA。 +- `studio`:七层都做,第 5 层至少 3 轮,外加下文的循环接缝、无损确定性和音频 QA(手机测试每一档都做)。 1. **能不能跑**:lint、编译、dry-run。Manim 的报错按 ScopeRefine 的顺序修:先改出错行前后 ±1 行,不行就改整个代码块,再不行就重写整个场景。 2. **不看图的结构检查**(确定性检验:从中间抽几帧单独渲染,和整片里的同一帧比对,要逐像素相同,或者 PSNR ≥ 45 dB;比的是无损 PNG 帧,不是编码后的 mp4,原因见下文"确定性";`ffmpeg -i a.png -i b.png -lavfi psnr -f null -`): @@ -100,6 +100,15 @@ ffmpeg -i out.mp4 -vf "fps=1/2,scale=360:-1:flags=area,tile=3x4" out/check/phone 整张图的长边控制在约 1500 px 以内。图太大时,读图会把它再缩一次,测出来就不准了。 +字号下限换到手机上是多大:竖屏 1080 宽时,44 px 在 360 px 的格子里约 15 px;横屏 1920 宽时只有约 8 px,贴着下限的标签在手机上读不出(`docs/research/06-concept-first-ab.md`)。 + +**开头 2 秒**:钩子要在第 0 帧就开始。把前 60 帧(30 fps 的 2 s)逐帧拼成一张,看画面是不是一开始就在动、有没有让人停下来的东西: + +```bash +# 30 fps 取前 60 帧;每格 150 px 宽,整张 1500 px 宽(长边规则同上) +ffmpeg -i out/draft.mp4 -vf "select='lt(n,60)',scale=150:-1,tile=10x6" -vsync vfr -frames:v 1 out/check/first2s.png +``` + **循环接缝**:GIF、网页背景、平台自动循环这类交付物,末帧后面紧跟着首帧。把末 6 帧和首 6 帧拼成一条,像观众那样连着读: ```bash diff --git a/playbook/12-ideation.md b/playbook/12-ideation.md index 6440cbc..ebcca96 100644 --- a/playbook/12-ideation.md +++ b/playbook/12-ideation.md @@ -108,7 +108,7 @@ ## 6. 立意和规则:底线不动,口味可以改 -**底线**在任何立意、任何档位下都不动:每一帧是 t 的纯函数,事实照抄原文,字号和阅读时间的下限,片中不出现数字静音,闪白频率,素材许可,不在文件里写 key。`TASTE_CHECKLIST.md` 里标了【底线】的条目也属于这一层。 +**底线**在任何立意、任何档位下都不动:每一帧是 t 的纯函数,事实照抄原文,字号和阅读时间的下限,片中不出现数字静音(有声片;用户要的无声片不带音轨,不适用),闪白频率,素材许可,不在文件里写 key。`TASTE_CHECKLIST.md` 里标了【底线】的条目也属于这一层。 **口味默认**是没有立意时的稳妥做法,立意需要时可以反着来: @@ -129,6 +129,8 @@ - 公司 showreel 用霓虹、铬面和多个饱和色:混搭本身就是要证明的"什么都能做"; - 常驻的 HUD 读数(3 秒钟那支的计时和慢放倍数):每个读数都在变、都承载信息,不是 #20 说的装饰。 +**读数别贴着下限**:靠常驻读数讲答案的立意(HUD、仪表、标签),读数里要人读的部分用手机联系表量过。`docs/research/06-concept-first-ab.md` 里一支片子的标签正好是 44 px 的下限,横屏下在手机上约 8 px,评审读不出;只要求"看得出在走"的跑动数字不算。 + FunTech 在终场前用了约 1 s 真静音。这碰的是底线,不在可改之列:要那种效果,做成"屏息":留一层低音垫,镜头慢漂,不要声画一起停死(`playbook/04-audio.md`、TASTE_CHECKLIST #18)。 ## 7. 在关卡 ① 怎么摆 diff --git a/templates/TASTE_CHECKLIST.md b/templates/TASTE_CHECKLIST.md index 48bc435..35508fe 100644 --- a/templates/TASTE_CHECKLIST.md +++ b/templates/TASTE_CHECKLIST.md @@ -54,7 +54,7 @@ ffmpeg -i out.mp4 -vf "blackdetect=d=0.3,freezedetect=d=1.5" -af silencedetect=d **节奏** 17. 【底线】某个 read 少于 12 帧(0.5s)就被下一件事盖掉?两个重要 reads 重叠?换字时新旧两句同屏(旧句还没退完,新句已经进来)? -18. 超过 3s(短视频)或 8s(讲解)什么都没发生?停拍时声音和镜头同时停死(观众会以为播放卡住了;#16 的停顿要像屏息:低音垫着、镜头慢漂)?【底线】分镜里声明的卡点没对准节拍(±1 帧)?片中(首尾之外)出现数字静音或近乎静音? +18. 超过 3s(短视频)或 8s(讲解)什么都没发生?停拍时声音和镜头同时停死(观众会以为播放卡住了;#16 的停顿要像屏息:低音垫着、镜头慢漂)?【底线】分镜里声明的卡点没对准节拍(±1 帧)?片中(首尾之外)出现数字静音或近乎静音(有声片才查;用户要的无声片不带音轨)? **内容** 19. 第 1 秒看不出这是什么、为什么要看?【底线】有占位文字、编造的数字?把不存在的界面当成真实产品的界面展示(立意本身就是一个明显虚构的界面时不算,例如把讲解装进一个仿真的 app)? diff --git a/video-types/02-knowledge-short.md b/video-types/02-knowledge-short.md index b8df215..6f93a68 100644 --- a/video-types/02-knowledge-short.md +++ b/video-types/02-knowledge-short.md @@ -124,7 +124,7 @@ Style: {follows from the concept (playbook/12-ideation.md) | default: "Kurzgesag 0–1s: the counterintuitive claim/number as a full-bleed visual (no logo, no greeting). By 3s: what the viewer will learn; by 6s: a first payoff that proves it. Hook (gate 1): each concept card carries one hook, typed from {question | counterintuitive | result-first | conflict | curiosity-gap}, optionally with a pattern interrupt: its first frame, first caption (<=11 CJK chars/line), the promise, the payoff time (first micro-payoff <=6s), and the fact source in NOTES.md. Three hook cards of different types only when hook=own, after the concept is picked. A new visual payoff every 3–5s; one idea per shot; cut on narration phrase boundaries. -Captions: one line, <=11 CJK chars at 72px (<=9 at 90px; the vertical safe box is 810px wide), 72–90px, weight 800, #F5EFE6 with 3px dark stroke; accent on 1–2 key words max; split at pauses >=250ms; drop filler words. Hook text 140px. +Captions: one line, <=11 CJK chars at 72px (<=9 at 90px; the vertical safe box is 810px wide), 72–90px, weight 800 (or the heaviest weight the local font has, e.g. PingFang SC 600), #F5EFE6 with 3px dark stroke; accent on 1–2 key words max; split at pauses >=250ms; drop filler words. Hook text 140px. Caption style: {sentence | keyword emphasis | word highlight (<=2% of runtime) | big-type for the hook}; silent-readable, sound-on better. Safe box x 90–900, y 330–1520 (platform UI zones stay clear). End on the payoff visual, not a subscribe card. Loop: {soft callback (default for explainers) | hard loop: last frame == first frame | none}. diff --git a/video-types/03-product-promo.md b/video-types/03-product-promo.md index c9b788e..041d0f6 100644 --- a/video-types/03-product-promo.md +++ b/video-types/03-product-promo.md @@ -92,6 +92,7 @@ Show the product itself: {architecture | workflow | features | case studies} as - 画面里的每个 UI 元素,在真实产品里都存在吗?素材台账里能找到对应的文件吗? - 数字有出处吗? +- 产品、店铺是虚构的时候,名字先搜一下有没有同名的真实品牌(实验里一支面包店片子起名"一条",撞了一个知名的媒体和零售品牌,见 `docs/research/06-concept-first-ab.md` 的盲评)。 - 片子展示了产品本身(架构、工作流、特色、案例)吗,还是只讲了理念? - 每个功能拍能在 1 秒内看懂吗? - 镜头运动是否都是"先动后停"?一直漂移会让 DOM 文字出现亚像素闪烁。3D 一镜到底例外:停站时镜头保留慢推和低幅手持漂移,不要停死(见 08 篇)。