通过代码生成动态图形的宣传视频
完全由代码生成的15-30秒视频:2D Canvas → 帧 → FFmpeg,音频由numpy合成。无需视频模板、After Effects或第三方音乐。涵盖三种场景:
- 个人或个人品牌(16:9);
- 少量产品(9:16);
- 整个商店的商品目录(9:16,数十或数百个视频)。
指导原则:不编造任何内容。 视频中展示的每个数字、价格、颜色或特性都来自经过验证的来源:网站、商店API、产品页面或项目文档。如果无法确认,则标记为待定并明确说明。
此包在 ${CLAUDE_SKILL_DIR}/templates/ 中提供了三个完整模板(在claude.ai上聊天时:templates/,位于此文件旁边)。将最接近的模板复制到用户的项目中并适配它,而不是重建引擎(参见第4节)。templates/README.md 列出了每个模板需要修改的内容。
所有屏幕文字以品牌受众的语言编写,并用用户的语言回复用户。固定的界面字符串(“from”、“colors”、“NOT HIM”……)通过模板的 textos 块覆盖,切勿直接编辑引擎。在 no_es 中匹配人物的性别。
0. 选择场景
| 场景 | 模板 | 格式 | 时长 | 噱头单元 |
|---|---|---|---|---|
| 个人或个人品牌 | persona-16x9 | 1920×1080 | 27秒 | 一个,手写 |
| 网站或服务 | persona-16x9,适配版 | 16:9或9:16 | 20–30秒 | 一个,手写 |
| 少量产品(≤10) | producto-9x16 | 1080×1920 | 15.5秒 | 每个产品一个,手写 |
| 商品目录(数十至数百个) | catalogo-9x16 | 1080×1920 | 15.5秒 | 每个类别一个,模板短语根据每个产品数据填充 |
如果用户未指定,则对产品使用9:16,并在一行中说明。
1. 研究(在写任何一行脚本之前)
数据来源,按顺序:
- 项目文件夹(如果有)。 阅读
CLAUDE.md、AGENTS.md、决策日志、报告和社交媒体计划。品牌和文案规则(例如“禁止第三方品牌名称”、“非正式语气”、“禁止空洞的夸张”)以及设计令牌、审核规则和法律声明(AI标注)都在其中。这些规则优先于任何创意想法。 - 官方网站。 主打内容、服务、数据、方法、技术栈、资质。对于JS繁重的网站,使用浏览器逐部分读取
document.body.innerText。 - 在线商店:
- WooCommerce:
/wp-json/wc/store/v1/products?per_page=100&page=N和/products/<id>。价格以分为单位。prices.price_range中min ≠ max → “from”;on_sale+regular_price→ 划掉的价格;attributes(颜色、尺寸、尺寸);description(通常带有结构化要点列表);permalink。 - Shopify:
/products.json和/products/<handle>.json。 - 切勿猜测slugs或URL: 从
permalink中读取。
- WooCommerce:
- 网络搜索。 对个人有用,但常见姓名会返回同名者。如果发生这种情况,将其转化为脚本素材(参见第2节),而不是隐藏它。
- 照片: 优先使用本地项目文件。云沙箱通常无法从商店下载图片;不要反复重试。要么使用本地照片,要么用代码绘制产品(条纹、缎面波浪和简单形状的效果比你预期的要好)。
记录读取数据的日期:价格会过时。
2. 概念:噱头
噱头是产品或人物的一个真实属性,被转化为视频本身所做的事情。 它不是附加在上面的笑话。以下示例机制,全部在模板中实现(噱头ID在代码中为西班牙语):
| 机制 | 真实属性 | 视频作用 |
|---|---|---|
invisible | 透明、隐藏、低调 | 一个空帧:“这里有一个盒子。看不见?当然看不见,它是透明的。”然后屏幕像拉链一样拉开。 |
contador(计数器) | 大量(米、小时、单位) | “这个卷轴持续15秒。这个卷,50米。你来不及用完它。”计数器运行。 |
diagonal | 斜裁、条纹或斜线设计 | 文本倾斜45°,条纹穿过屏幕。 |
brillo(光泽) | 光泽或缎面处理 | “这个文本是哑光的。/这个发光的。”(带有光泽) |
cortar(切割) | 无鞋带、无线缆、无系带 | 两根线拉起文本,被切断,文本保持原位。 |
elevar(提升) | 平台、推高、高度 | 文本在“垫子”上升起。 |
secuencia(序列) | 多种尺寸、宽度或变体 | 真实变体一个接一个切换:“这里是E到H。” |
quitar(移除) | “无X” | 绘制两个环并飞走:“消失。” |
ritmo(节奏) | 运动、活动 | 词语卡在节拍上。 |
reordenar(重新排列) | 多用途、可转换 | 两行文字交换位置:平行、交叉、V形。 |
patron(图案) | 刺绣、印花、蕾丝 | 装饰性图案自行绘制。 |
calma(平静) | 敏感类别(健康、术后、孕产…) | 无噱头、无音效冲击、无打击乐:宁静的音调。 |
homonimos(同名者,人物) | Google上的常见姓名 | investigar("Name") 显示被划掉同名者并标注“不是他们”,然后“已找到来源”。 |
规则:
- 一个真实、可验证的属性。
- 三行:设定、转折、点睛句(点睛句用斜体或强调色)。
- 点睛句不能是假的。 如果产品页面没有说明,就不要声称。条件短语(配置中的
si/sino)允许只有在描述支持时才显示点睛句。 - 一个固定自指的元素贯穿整个视频,与行业相关:带时间码和帧计数器的HUD(科技)、带针脚计数器的缝线(手工艺、纺织品)、测量“卷轴”的卷尺(时尚、尺码)。在片尾兑现(“这个卷轴测量15.5秒。一个尺码适合所有人。”)。
- 切勿拿身体开玩笑。 敏感类别使用
calma。同时确保没有抽象图形可能被解读为身体轮廓。 - 无空洞的夸张,无与竞争对手的比较。
3. 结构
9:16 产品(15.5秒,30 fps = 465帧)
| 场景 | 时间 | 内容 |
|---|---|---|
| 钩子 | 0–3.0 | 噱头 |
| 产品 | 3.0–5.6/5.8 | 名称 + 带弹跳效果的照片(或程序化绘制,或占位卡) |
| 范围 | ~2.8秒 | 实际颜色数量或范围(尺码)、变体和颜色及其名称 |
| 事实 | ~2.6秒 | 来自产品页面的三个事实,带有动画复选标记 |
| 价格 | ~1.8秒 | 实际价格,“from”或促销价,适用时的税费说明 |
| 片尾 | 13.2–15.5 | 徽标或品牌、药丸形状的网站、配送或行动号召,以及结尾的俏皮话 |
16:9 个人或品牌(27秒): 终端 → 同名者被划掉并带有毛刺效果 → 下落(找到来源 + 标题) → 带计数器的数据 → 分阶段的方法 → 工具栈跑马灯(停留在一个自指项目上:“↑ 那是我”) → “此视频:0个模板 · N行代码”(实际数量) → 人物引言 → 带有字母组合、姓名和行动号召的片尾。
4. 引擎
<project>/<reels-folder>/
├── METODO.md 方法、规则和检查清单(供人类使用)
├── CLAUDE.md 状态和待办事项(供下次会话使用)
├── config.json (目录)商店、属性、标签、调色板和类别 → 噱头 + 短语
├── productos.json 品牌 + 每个产品一个块
├── motor.html 1080×1920或1920×1080画布;window.renderFrame(f) 是**确定性**的
├── render.js puppeteer-core → 每帧一个JPEG → ffmpeg image2pipe;然后音频和复用
├── audio.py numpy/scipy合成,使用与motor.html相同的提示表
├── catalogo.js (目录)API → 产品表:噱头、短语、事实、品牌剥离
├── extraer.js (目录)使用浏览器UA下载目录和照片并暂停;REVISAR.md
├── fonts/ 本地woff2及其许可证(fontsource:`npm pack @fontsource/<family>@<version>`)
├── img/ 本地照片
└── out/ 最终视频
技术要点:
- 确定性: 每帧从
t = f/FPS计算。无requestAnimationFrame,无未种子化的随机数(使用hash(n))。 - 辅助函数:
clamp、P(t,a,b)(进度)、缓动函数(带弹跳的eOC、eIOC、eOX、eIX、eOB)、带字间距和alpha的T_()文本函数、使文本缩小到适合的fit()、圆角矩形rr()。 - 场景是接收本地时间
u = t - T.scene的函数。转场是每次切换时 ±0.16秒的背景色擦除。 render.js:page.evaluateOnNewDocument(spec => window.SPEC = spec),等待window.READY(字体和图片加载完毕),然后canvas.toDataURL('image/jpeg', .93)→ 输入到ffmpeg -f image2pipe -c:v mjpeg -i - -c:v libx264 -preset veryfast -crf 18 -pix_fmt yuv420p。- 启动Chrome时加上
--allow-file-access-from-files;否则本地图片会污染画布。 - 在标准路径或
CHROME_PATH中查找Chrome或Edge。 - 保留
--stills t1,t2,…模式用于审查。
- 启动Chrome时加上
- 复用:
-af loudnorm=I=-14:TP=-1:LRA=11 -c:a aac -movflags +faststart -shortest。 - 音频:与品牌基调匹配的四和弦进行(科技:128 BPM带底鼓、贝斯和弹拨音;手工艺:112 BPM拨弦和木琴;优雅:96 BPM钢琴和弦乐)。
- 每个噱头的效果:拉链 = 加速的咔哒声爆发;机器 = 咔哒声列车+嗡嗡声;剪刀 = 两次咬合声;光泽 = 高音琶音。
- 共享效果:切换时的风声、计数器上的滴答声、价格上的铃声。
- 底鼓下的轻侧链压缩、
tanh限制、然后归一化。
- 在Windows上,脚本调用
python;在Linux和macOS上,调用python3。
5. 不编造任何内容的目录数据(catalogo.js + config.json)
- 显示名称: 产品名称,去除
marcas_a_quitar(要剥离的品牌,如果文案规则要求)和palabras_tipo(通用类型词,如“Sneaker”或“Boot”)。如果只剩下代码,请使用不带品牌名称的名称。 - 事实: 描述中
titulo_datos下的要点,不包括构成。如果没有,则取短描述中按“.”和“:”分割的短语。第三个事实是材质属性中的构成,保留像EVA这样的缩写词。 - 修剪: 将短语修剪至约54个字符。优先在逗号处修剪;否则在最后一个从句之前(“with”、“for”、“that”、“and”处)。切勿以介词或冠词结尾。
- 颜色: 名称 →
motor.html中的十六进制表。双色颜色(“Black/White”)会得到分开的色样。未知颜色以中性灰色渲染,并显示其真实名称。 - 手动编辑: 产品上的
"manual": true可保护其在下一次提取时不被覆盖。 REVISAR.md(审查列表):敏感基调、无要点的页面、无照片或属性的产品。- 在实际目录上测试转换,方法是在信任提取器之前,将函数粘贴到商店的浏览器控制台中。如果无法测试下载步骤,请说明。
6. 质量控制(交付前必须执行)
- 渲染每个场景的静态帧,使用PIL构建联系表(不要用带多输入的
xstack:ffmpeg可能崩溃),然后查看它。检查:- 重叠文本或被截断的短语;
- 大标题上的重音符号与上一行碰撞;
- 元素侵占另一行;
- 字母在过度的白色光泽下消失;
- 属性缺失时出现空的“—”块;
- 竖屏格式中下半部分为空。
- 9:16安全区域:大约250像素(Reels界面)以上或最后约320像素(字幕)以内不要放置重要内容。只有装饰元素可以放在下方。
- 数据:当前价格、有范围时使用“from”、可能过期的促销、未确认的单位(标记)、已验证的URL。
- 法律与审核:
- 包含AI生成或AI修改人物的照片 → 视频中需有可见标签(欧盟AI法案,第50条;配置中的
ia.mostrar_si_foto)。发布时也需披露。 - 产品在身体上展示:完整照片、目录风格、无激进裁剪、较少屏幕时间。
- 绝不承诺不适用退货或保修。
- 包含AI生成或AI修改人物的照片 → 视频中需有可见标签(欧盟AI法案,第50条;配置中的
- 音频:
ffmpeg -af ebur128→ 约 −14 LUFS。使用ffprobe检查时长和分辨率。
7. 交付
- 在用户机器上工作时,将所有内容写入项目子文件夹,并保持所编辑文件的换行符。不要触碰现有的
CLAUDE.md文件或文档: 在子文件夹内创建自己的文件。 METODO.md:包含哪些内容、如何运行、每条数据的来源、应用的品牌规则、如何添加产品或噱头、发布前检查清单以及已知限制。- 子文件夹的
CLAUDE.md:状态、待办事项和不可协商的规则,用几行说明。 - 展示视频并总结:噱头(每行一个)、所有文件位置、重新生成的命令以及任何仍需确认的数据。
常见错误(避免)
- 猜测产品slugs。从
permalink中读取。 - 旋转文字的噱头覆盖后续行:在文字旋转时重新定位这些行。
- 过于白色的缎面光泽会吞没字母。使用品牌的浅色调,而不是纯白色。
- 色样渐变的色标崩溃会留下对角条纹。使用单独裁剪的光泽层来代替。
- 对有价格范围的产品显示划掉的价格:使用“from”加促销徽章,不带划线。
- 产品页面上缺少单位(例如尺寸没有“cm”):省略或标记以待确认。
- 抽象形状组合起来可能暗示身体轮廓:用明确的图形替换它们。