风格库 - ZLHad/OpenVideoHarness GitHub Wiki

English · 中文

不加约束的话,AI 做的视频很容易长成一个样子:暗底、发光、玻璃卡片、满屏动态 UI。风格库给 agent 准备了 31 个实打实的其他选择,可以借用。每个预设都从名作里提炼出一套语法(色板、字体、构图、运动、转场、声音),写成 agent 能照着做的说明,并且附一段用本仓库真渲的 5 秒样片,样片带着各自的配乐。它们是参考,不是模板:一支片子的长相从立意推出来,可以借一个预设,可以几个混着借,也可以都不借。31 段样片的内容完全一样,都是标题"每一帧,都是代码。"加上"大纲 → 分镜 → 初版"三个元素,差别只来自风格。

31 种风格的样片,内容完全相同

连着看:styles-gallery.mp4(在 Release media 里),每种约 1.5 秒,带各自的声音,切换处有很短的交叉淡化。每种风格学的是哪些作品、听起来是什么样,完整表格见 styles/README.md。

预设里有什么

每个预设是一个目录 styles/<slug>/:

  • STYLE.md:学习对象;视觉、运动、声音语法;适合与不适合;禁止项;prompt 块;引擎做法;自查重点;
  • tokens.json:机器可读的数值;
  • swatch.js(用 Blender 渲的场景是 swatch.py)、score.json 和 events.json:样片的画面、配乐和音效时间表的源码;
  • media/:swatch.mp4 和封面帧。

六个家族

家族 预设
电影与片头 cutout-jazz 剪纸爵士片头 · scratched-type 刮擦字片头 · monumental-scifi 纪念碑科幻 · symmetry-pastel 对称粉彩绘本 · neon-step-print 霓虹抽帧 · archival-pan-zoom 档案推拉 · clockwork-map 机械钟表地图 · tabletop-miniature 桌面微缩剧场
品牌与发布 product-keynote 产品发布片 · swiss-grid-type 瑞士网格动态字 · brutalist-meme 野兽派梗
数据与讲解 dark-math 暗底数学 · editorial-data 编辑部数据叙事 · bubble-chart-story 气泡图现场讲 · fui-hud 电影界面 HUD · isotype 图形统计 · pastel-ui 浅色界面讲解
插画与印刷 bouncy-flat-2d 弹性扁平 2D · halftone-comic 半调漫画 · risograph 孔版印刷 · silhouette-papercut 剪影剪纸 · watercolor-pastoral 水彩田园
中国美学 ink-wash 水墨 · dunhuang-mural 敦煌 · shadow-puppet 皮影 · guochao-festive 国潮
复古与科技 blueprint 工程蓝图 · crt-terminal CRT 终端 · synthwave-outrun 合成器浪潮 · pixel-16bit 16 位像素 · y2k-chrome Y2K 铬面

学习对象包括 Saul Bass 的片头、《七宗罪》、《银翼杀手 2049》、韦斯·安德森的对称构图、王家卫的抽帧、Aardman 和 Laika 的定格微缩、瑞士网格、3Blue1Brown、《纽约时报》的数据图、纽拉特的图形统计、Material You、《蜘蛛侠:平行宇宙》的网点、超级任天堂的 16 位像素、Wipeout 和 Mac OS X 的 Aqua 界面,以及水墨、敦煌壁画、皮影、国潮。

声音:31 份各不相同的配乐

每个样片都有一份专门写的配乐:自己的体裁、签名乐器、律动和空间,全部由 bin/vh music 用代码合成,没有采样,立体声(只有 crt-terminal 是单声道,对应它那只小小的终端喇叭)。cutout-jazz 是带弱音铜管的摇摆大乐队;scratched-type 是带铁砧的工业噪音;symmetry-pastel 是巴拉莱卡小进行曲;dark-math 是垫在旁白下面的安静毡锤钢琴;ink-wash 是古琴加箫;shadow-puppet 是板胡、梆子和锣鼓经;guochao-festive 是唢呐加 trap 鼓;tabletop-miniature 是一台立式钢琴,角色的每个动作就是一个音。每个 STYLE.md 都写了自己的声音,styles/README.md 里一个风格一行。

它们到底有多不一样?agent 听不了,所以量:7 个音频特征(谱质心、起音率、低中高三段的能量占比、立体声宽度、打击乐占比),再算两两之间的距离。在当时的 28 个样片上量,成对距离的中位数从 2.27 升到 3.71,最近的一对从 0.52 拉开到 1.22,378 对里没有一对小于 1.2;之后加的 3 个样片没有量。这把尺子只有 7 个数:听不出旋律和和声,好不好听还是要人来听(研究笔记 02)。

样片里的转场音效按风格选一个家族(纸、气声、甩、带音高的 swoosh、磁带停转等),按动作塑形,每个事件还有自己的 variant,所以连播版里不再是每段都响同一个 whoosh。音效用 swatch profile 混进去,每个样片的 WAV 和 mp4 都过了 bin/vh qa,响度约 −14 LUFS,AAC 编码之后真峰值仍低于 −1.5 dBTP。渲染在 CPU 上做(Blender 场景用 CPU 上的 Cycles)、编码单线程,所以重复渲染得到的是同样的字节。

在关卡 ① 怎么挑

风格从立意里推出来(playbook/12)。关卡 ① 的每张立意卡都有一行写由它推出的画面:专属的长相,或者这里的一个、几个预设,附上样片;studio 档每张卡还配一段 10–20 秒的草图。你想多看几种长相时,agent 从这里挑两三个彼此差别很大的预设并排给你看(bin/vh style compare a,b,c 就是出这张图的)。你也可以在需求里直接点名一个预设("用水墨风格"),或者说想要哪部片子的感觉,也可以在回复里换掉立意卡上的预设。

可以混搭:这个预设的色板,那个预设的转场。叠两种质感(网点加水墨、扫描线加纸纹)很容易糊,真要叠,先渲一小段看。

预设在项目里是参考,不是模板。项目自己的 STYLE.md 从立意写起;借了什么(色板、字体、转场、声音、质感),在 DECISIONS.md 记一行,和它不一样不用解释。预设里的数字是样片的值,换了场景就按自己的理由重新定。

常用命令

bin/vh style list                                   # 31 个预设、所属家族、有没有样片
bin/vh new promo launch-film --style cutout-jazz    # 预设副本放进 style-refs/,记在 BRIEF 的 Style refs 一行(几个:--style a,b)
bin/vh style compare cutout-jazz,ink-wash,blueprint # 几个预设并排:封面,或加 --frame t 看各样片的同一时刻
bin/vh style apply <slug[,slug]> <项目>             # 给已有的项目挂上预设当参考(同一个再挂一次不会重复)
bin/vh style <slug> --draft                         # 以 draft 画质渲一段样片(不覆盖已发布的正式样片)
bin/vh style check <slug>                           # 确定性检查:不同 worker 数渲出的无损帧必须一致(Blender 场景:在新进程里乱序重渲 12 帧来比)
bin/vh style gallery --mp4                          # 重建 styles/gallery.jpg 和 styles/gallery.mp4

每个预设都守的规矩

  • 学语法,不抄作品:不用原作的角色、logo、镜头和素材;在世导演的名字只出现在"学习对象"一栏,prompt 里不写"模仿某某"。
  • 文化题材要准确:不把不同朝代、不同地区的纹样混成一锅,不堆"东方元素套餐";飞天不长翅膀,中国皮影也不和印尼的 wayang kulit 混为一谈。
  • 声音也是风格的一半:每段样片都有自己的配乐,按该风格的声音语法写、用 bin/vh music 合成,音效落在画面的动作上。风格需要的"静"都做成屏息,底下保留一层垫音,不出现数字静音。
  • 只用本机字体:字体用 @font-face local() 引用,不分发字体文件。本机没有的字会回退,每个 STYLE.md 都注明样片实际用了什么字体。
  • 事实要核实:年份、作者、出处都查过,拿不准的会标出来。

评审现状

所有样片都交给一个没参与制作的"严苛动效导演",按 7 个维度的打分层评过两轮,中间改了三轮。最低分的中位数从约 4.5 升到了 6。到目前为止,还没有一个样片每一项都达到 8 分。 v0.2.1 新加的两个预设,最低分分别是 7(pixel-16bit)和 6(isotype)。第一个用 Blender 渲的样片 tabletop-miniature 过了七轮评审:最低分第一轮是 6,之后每轮都是 7。pastel-ui 和 y2k-chrome 各过了三轮,最后一轮按 8 个维度打,最低分都是 7。这是一个还在打磨的库,不是完工的作品集。

这些评审大多早于新的配乐;新配乐是用测量检查的(见上面),没有再打分。打分层在 2026-10-02 加了第 8 个维度"立意"。路线图里有一项和剩下的事有关:让每个样片每一项都到 8 分(计划在 v0.3)。

加一个新风格

六个步骤写在 styles/README.md 的"加一个新风格"一节:用 playbook/07 拉片拆解 1–3 部作品;照 _TEMPLATE.md 写 STYLE.md,再写 tokens.json;从 _swatch/demo/ 复制 swatch.js(要路径追踪的光和真实景深时,改写成 Blender 场景 swatch.py,样板是 tabletop-miniature),要声音就加 score.json;用 bin/vh style <slug> --draft --hud 反复改,满意后用 bin/vh style <slug> 出正式样片;跑 bin/vh style check <slug>;重建总览,在表里加一行。然后开 PR,见参与贡献。

镜头配方

风格给一支片子上皮肤,配方给一个镜头搭骨架。recipes/ 里有 24 个不依赖引擎的配方,写一个镜头或一个接缝怎么动:分几段、每段多少帧(30 fps),参数表里标出命门,哪里容易翻车,做完看哪一帧,再附一段 canvas 草图,任何预设的 tokens.json 都能给它换皮。八条全片骨架定下整支片子的能量弧、停顿和限额:三条按能量弧排(15 秒发布片、30 秒有旁白的讲解、60 秒产品片),五条从立意出发(时间放大镜、机器视角的肖像、用做法讲做法、吉祥物穿越风格、工作流即故事)。

bin/vh recipes list --intent abundance,process --energy 4 --engine hyperframes   # 按这一镜要说什么、多响来找配方
bin/vh recipes check                                                              # 校验配方:frontmatter、链接、索引、许可声明

agent 把配方 id 写进分镜的"配方"列,写这一镜的代码前先读配方全文。风格和配方冲突时,外观听风格的,配方的命门数值照样要守。配方库有一部分改编自 Apache-2.0 的项目(video-shotcraft、HyperFrames),保留了它们的许可声明(NOTICE.md)。每个配方带一个状态:9 个是 upstream-tested(在来源项目的片子里用过),14 个是 tuned,1 个是 draft,还没有 battle-tested,因为那要求本仓库做过的片子里用过、并且有人看过、给了判定。

其他风格库

这些会拉到 references/repos/ 下,只读:lemo-opuscar 的 43 种风格(MIT)、HyperFrames 创意参考里的设计师风格、OpenMontage 的风格。各自的许可证结论见 references/community-skills.md。

⚠️ **GitHub.com Fallback** ⚠️