大头剪贴人物短片(bighead-collage)
每个短语都是一件实物在小舞台上被摆弄:人是大头照片剪纸,数字是举着的牌子,字是贴条、黑板字、路面字,镜头和物件推着它们走——不是一句话配一张图、缓慢推进、字幕浮在画面上。 而且观众每一刻都看得懂:每次换场都有一样东西从上一镜带过来,换场的动作本身讲得通。
这是判断,不是模板。没有可以照抄的场景顺序;每条片的舞台从它自己题目里的物件来。
先看四样东西
anchors/taste_board.jpg:好在哪(参考片 12 个时刻);anchors/own_taste_board.jpg:用这份 skill 做出来的 12 个时刻。anchors/gap_pairs.jpg:不看这份 skill 时最容易做出来的(扁平矢量、放射光底、人缩成角落头像、整句字幕)vs 参考。examples/munger-life/near_misses.jpg:我们自己做《芒格的一生》时差一点就对的几处(像 PPT 的运镜、没有理由的换场、整屏空一下、主角消失),每处一句差在哪。style-card.md:全部判断,15 节,每条带参考片时间点。
开工前(每条片都先过这一步)
- 环境:
python scripts/doctor.py。有 ✗ 的按它给的命令装好再往下;装不上的告诉用户卡在哪。 - 配音和生图怎么来:看
python scripts/config.py。- 没有
config.json(第一次用):问用户两个问题(有 AskUserQuestion 就用它,一次问完;没有就直接列选项问),答案用python scripts/config.py set …写进去,以后不再问:- 配音:① edge-tts(默认、免费、不用注册,音色
zh-CN-YunxiNeural)② 我有录好的整条配音(mp3/wav)③ 接我自己的 TTS(豆包、ElevenLabs、MiniMax、本地模型……,要给一条命令,示例在scripts/tts_examples/)。 - 生图:① codex(本机 codex CLI,走 ChatGPT 订阅额度)② OpenAI 图像接口或兼容服务(要 key,可填 base_url)③ 我自己的生图命令 ④ 手动(只出提示词,我自己拿去生成再放回来)。
- 对应写法:
voice.provider=edge/recording/command;image.provider=codex/openai/command/manual。选了 command 要同时问到那条命令;选了 openai 问模型名和地址(官方就留空)。
- 配音:① edge-tts(默认、免费、不用注册,音色
- 已经有
config.json:一句话告诉用户现在用的是什么("配音 edge-tts、生图 codex"),用户没说要换就照用。 - 选完再跑一次
doctor.py,确认这两项是 ✓。
- 没有
- 还缺什么就问什么:选题和文案(用户只给选题时,按第 0 站写好文案给他确认)、主角的脸参考照(没有就去维基共享资源找 CC BY / 公有领域的,记进
SOURCES.txt)、画幅(默认 9:16)。
流程(每一站都有产物)
| 站 | 做什么 | 产物 |
|---|---|---|
| 0 文案 | 第三人称短句,第一句就是钩子(年份/数字 + 人);不寒暄、不总结。中文 4.5–5 字/秒,30 秒约 130 字;句间停 0.2s,段落之间停 0.35–0.55s | script.json |
| 1 配音 | voice.provider 是 edge / command:python scripts/temp_voice.py script.json,逐句配音 + 每个字的时刻(默认用语音识别对齐到真实发音)。是 recording(用户给了整条配音):python scripts/voice_timeline.py 配音.mp3 | timeline.json、voice/ |
| 2 导演表 | 先写导演表,再写画面(用 video-director,没有就按 examples/munger-life/director.md 的列):每一镜屏上是什么 → 观众多懂了什么 → 读懂+停留 → 凭什么接上一镜。答不出"凭什么接"就不换场。然后每句拆成短语,写"屏上哪件实物、做什么动作"(references/mapping.md)。再定每场的舞台分区(主角位 / 账本位 / 小戏区 / 字位,mapping.md 十三)和角色表(文案里的人都上场,十四)。最后写动作表:每个事件从哪进、走什么路、多久、缓动、过冲、碰到什么、怎么离场(engine.md「动作语法」)。原创没有原片可量,这一步不写,动作就会落回"从零放大弹出来" | director.md |
| 3 素材 | 在 gen/ 里用 python scripts/gen_image.py "名字.png|提示词|参考图"(按 image.provider 生成;manual 模式会写出 PROMPTS.md 等用户放图)。主角照片当参考 → 直接生成大头全身像(白底,一张图,不拼接)→ cutout.py 抠进 img/;底和道具也用生图(白底 → 抠)。要拆、拼、复杂处理才能得到的图,都先试直接生图 | img/、SOURCES.txt |
| 4 画面 | scene.js:一场一个 scene();字用 word()/row();相机用 spline;时间全用 at(句, 词);中文竖屏片加一行 captions() 字幕轨(references/engine.md「字幕」);字幕和关键内容放进平台安全区(references/production.md 第 3 节) | 静帧 → 720 预览 |
| 5 声音 | sfxlist.mjs 从画面导出音效表 → mix.py | mix_master.wav |
| 6 样片前自查 | references/production.md 第 6 节的十项,全过了再给用户看(这就是回归,每条片都跑) | 自查记录 |
| 7 交片 | 合成、verify.py、看这里/、用播放器直接打开给用户 | final.mp4 |
工具、参数和坑:references/production.md(素材、配音、音效、渲染、自查)和 references/engine.md(stage.js)。
用户要"照着参考片整条复刻、看像不像"时(对临):配音用原片人声、时刻和版面按原片逐帧量,做法在 references/production.md 第 8 节。
写每一镜时问自己的八句
- 观众这一镜要看懂什么? 写成一句具体的话。写不出来,这一镜就是为了切换而切换。
- 凭什么从上一镜到这一镜? 带一样东西过去:同一个人走过去、推进同一扇门、同一个世界翻过来、同一块招牌又出现。"明信片放大 → 一张店的图"讲不通;"少年走进明信片里那扇门 → 镜头跟进去 → 门里就是店"讲得通。
- 这个短语里的名词,屏上是哪件实物? 数字 → 牌子/黑板/日历;人 → 大头剪纸;时间 → 一页页翻、一个个数;找不到实物,就把字做成贴条贴在一个实物上。
- 这个短语里的动词,那件实物做了没有? 卖 = 金币飞走;寄 = 目录飞进邮筒;离婚 = 婚戒滚走;走了 = 他起身走出画面。动词没发生,这一镜就是"配图"。
- 这个动作落在哪个字上? 换场、物件动作、镜头到位,都落在新画面要演的那个词上,常在一句话中间;不放在两句之间的停顿里("一句一页"是 PPT 的节奏)。卡的是字,不是配乐的拍子。
- 镜头在做什么动作? 一场 1–2 个宽而果断的推或拉,推完顺势拉,动作之间停一停;转场长在推得、拉得、摇得最快的那一刻。场内微微缓推、转场时突然来一下 = PPT。反过来也不行:讲事的段落里字落下来时镜头要停住,不做 1.0→1.1→1.02 的小抽动——全片的推拉幅度是开头和转场撑起来的。
- 这一刻观众看哪?画面里每样东西凭什么还在? 每场有固定分区:主角位、账本位(会积累的那一排)、小戏区、字位。上一件事的东西要么排进账本位,要么被戏里的人带走;说不出理由的不是删掉,是回去改调度。讲事的段落每 0.5 秒暂停一帧,说出眼睛落在哪:说出来的是"一个动作"而不是"这句话讲的那件事",就是特效盖住了内容。
- 字属于谁? 在人身后、在牌子上、在黑板上、是贴条——不浮在空中。出字方式要轮换,同一种连用三次就是模板。
度(AI 学会一个手法就会滥用)
- 换场的密度看观众:参考片一场 1.2–3s(英文母语、熟悉巴菲特);中文、观众不熟这个人时,一场 2–6s,段落间停 0.35–0.55s。场内的事件密度(0.4–0.6s 一个)不变。
- 主角在场多少看题材:讲一件事(囤现金、发明邮购)→ 人占 30–50% 的时间,另一半交给钞票、计数板、黑板、手;讲一个人的一生 → 人就是贯穿全片的那样东西,可以每场都在,但每场都要有他之外的东西在动(戒指滚走、招牌荡下、日历翻页)。
- 圆圈揭开 / 缩进白圈:段落交界各一次,不是每次换场都用。
- 换色(黑白 + 暗红):只在"处境变坏"那一处。
- 计数、打字、乱码解字、灯泡:一条片里各至多一次。白底贴条一条片 2–4 张。
- 三行堆字压在人身后:人名那一次必用;之后换别的出字方式。
- 大头只给主角(配角至多 1–2 人),姿势每 10 秒至多一个。
- 小舞台从这条片自己的题目里找;参考片的浮空小镇、红白漩涡纸是那两条片的答案,照搬会被一眼认出。
- 音效几乎每个事件一个,但永远比人声低 7 dB 以上。
- 动静按段落分:开头钩子(约前 8 秒:一张脸 + 一个冲突 + 片名卡)可以满——满天飞的复印纸就是在演"全世界都在抄",那里的动静就是内容,不做减法。讲事的段落每一拍只有一个焦点,动作只做两件事:把东西带进来、把这句话的动词演出来;纸片雨、金币雨、扬尘、闪光、震屏不讲内容就不加,推拉不配"呼";繁忙的底(地图、纹理)压暗、降饱和、微糊,人要比纹理大。场内 0.4–0.6 秒一个事件,说的是讲这句话的动作,不是装饰。
- 字幕:中文竖屏片固定一条(
captions()):y≈1400、思源黑体 Bold 62px、白字粗黑描边、按短句换、不做动画,一条不超过 14 字(在语义处断);片名卡、逐词排出来的原话那几秒让位。关键词还是场景里的大字(900 粗体),两者一眼分得开。
完整的度表在 style-card.md 第 10 节。
拒绝
- 一张静止的图撑一句话(整图 + 缓推 > 1.5 秒);场内几乎不动、只在转场处来一下特效。
- 没有理由的换场:前后两镜没有共同的东西、换场动作讲不通。
- 扁平矢量图标、卡通画、放射光底、图表、坐标轴。
- 人缩成角落里的头肩贴纸。
- 字幕抢戏:字幕只能是固定位置、没有动画的一条;关键词仍然在场景里。
- 特效盖住内容:讲事的段落一拍好几样东西在动、字落下来时镜头还在晃、底比人响(用户原话"不是在看内容而是看特效去了")。但开头钩子不在此列。
- 关键内容落在平台界面下面:9:16 片的字幕、数字、主角的脸进了顶部标签栏、右侧按钮列、底部标题区(
scripts/ui_check.py查)。 - 画面里出现网址、水印、署名(参考片里 amazon.com 卡片是穿帮,不要学)。
- 道具"从零放大弹出来"、凭空消失;人物只换姿势图不演;文案里的人拿道具顶替。
- 屏上演出的事实没核过(芒格摘掉左眼后装的是义眼,不戴眼罩;画一块眼罩就是错的)。
作者定过的口味
references/taste.md:作者看样片时说过的话(表里的"用户"指作者)、对应的规则和适用范围(这个风格 / 所有风格)。新做一条片之前读一遍。你的用户看样片时说了新的,就往这张表里加一行,同一个问题不让他说第二次。
文件
style-card.md | 15 节风格卡(判断 + 证据) |
references/mapping.md | 每类话怎么变成实物在动:两两成对的例子、分镜表格式 |
references/engine.md | stage.js:场、三层盒子、相机曲线、字、转场、上下顺序、音效登记;坑 |
references/production.md | 素材、配音、音效、渲染、样片前自查、交片 |
references/taste.md | 用户定过的口味规则(带范围) |
examples/munger-life/ | 《芒格的一生》:导演表、每个换场为什么这样接、成片接触表、近失对。是"怎么做过一次",不是可以抄的画面 |
examples/hardcases-01/ | 《商业狠人图鉴 01》(59s,用户整条配音):动作分镜(动作语法、8 个角色)、舞台调度导演表、注意力层级导演表(特效盖内容 → 一拍一个焦点;开头钩子不减;9:16 安全区;字幕)、第 1/2/3 版和第 3/4.1 版同一时刻的近失对 |
anchors/ | taste_board / gap_pairs / detail:参考片原帧(earn.edits,见 README「引用说明」);own_taste_board:用本 skill 做的片子 |
scripts/ | stage.js(含 captions() 字幕轨)acts.js(动作语法)ui_check.py(平台界面遮挡自查)look.css new_film.py bighead.py cutout.py split_sheet.py(一张图切几件道具)gen_image.py(生图,四种方式)config.py(配音 / 生图设置)doctor.py(环境自检)temp_voice.py voice_timeline.py(整条正式配音 → 时间线)ref_timeline.py sfx.py sfxlist.mjs mix.py frames.mjs verify.py vsr.py(量片子:换场、运镜曲线、平涂占比、帧条);tts_examples/(接豆包 / OpenAI TTS 的示例) |


