Communitygithub.com

Zman2087/faceless-studio

使用 Remotion 制作动画动态图形短视频——无脸讲解、动态文字钩子、短信故事、对比、图表和计数器,或 AI 角色剪辑间的动画场景。当用户要求制作“动画视频”、“动态图形”、“讲解”、“无脸视频”、“动态文字”、“短信故事”、“让数字动起来”,或者帖子格式为“故事”或“讲解”时使用。也可用于向引擎添加新的场景类型。

faceless-studio 是什么?

faceless-studio 是一个基于 Remotion 的 AI 代理技能,专门用于生成零成本的动画动态图形短视频。它提供两层工作流:第一层通过组合内置场景(如动态文字、数字计数器、条形图、聊天模拟等)快速制作视频,无需编写代码;第二层允许在现有场景无法表达创意时,通过 TypeScript 和 React 向引擎添加新的可复用场景类型。该技能支持多种视频格式,包括无脸讲解、短信故事、数据对比和 AI 角色剪辑间的动画插入,并内置了样式规则(如每行文字 ≤7 词、每栏 ≤4 项)和验证流程。渲染时依赖 Remotion 的确定性动画(使用 spring/interpolate),确保每次输出一致,且所有资源消耗为零(仅需本地计算)。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Zman2087/faceless-studio/tree/HEAD/.claude/skills/animated-video

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

动画视频

此部分所有内容均在 remotion/ 目录下渲染,零成本。包含两个层级——始终先尝试第一层:

  1. 组合内置场景 通过规范文件(几分钟内完成,无需代码)。
  2. 向引擎添加新的场景类型 当某个创意确实需要时(编写代码、测试,然后所有代理均可复用)。

本地渲染前:如果 remotion/node_modules 缺失,请运行 cd remotion && npm ci (首次渲染还会下载 Remotion 的无头 Chrome,约 170 MB,仅一次)。

第一层——场景工具包

场景 (shots[].type)最佳用途关键字段
kinetic钩子、点睛之笔text、highlight、per_word (0.18)——单词逐个弹出
title单行加粗标题text ≤ 6 个词、highlight
number一个醒目的数字value、prefix、suffix、decimals、caption、color——从 0 开始计数
bars比较大小title、unit、items[{label,value,color}]
compare他们 vs 你、神话 vs 事实、之前/之后title、left{label,items,color}、right{…}
list“三件事”、做/不做items、style(勾选/叉号/数字)
timeline事件如何发生items[{year,text}]
chat用短信讲述的故事title(联系人)、messages[{from: me/them, text, at}]
quote引用他人话语text、by
mediaB-roll、照片、AI 片段src、kenburns、headline、fit

每个场景都可以使用 label(引导标签)、stamp(印章数字)、bg(背景图片/视频,含 credit)和 transition(默认 fade,可选 cut、slide、zoom、wipe)。覆盖层(headline、textover、lowerthird、stamp)可置于任意场景之上。完整参考:remotion/SPEC.md。每个新场景的示例:remotion/examples/animated.json。

常用配方

  • 无脸讲解(20~40 秒):kinetic 钩子 → number → bars/compare → list → title 呼应钩子的收尾。旁白作为 audio,字幕来自 words,背景音乐 music 音量 0.08~0.12。
  • 短信故事:kinetic 钩子(“她凌晨 3 点回复了”)→ 每次对话一个 chat 场景(at 间隔 0.8~1.4 秒,与旁白同步)→ title 反转。每条气泡 ≤ 10 个词。
  • 口播视频中的动画插入:CLIP_1 … number 或 compare(持续 2~3 秒,配合关键句)→ transition: "zoom" → 回到 CLIP_1,start 设置为片段恢复的位置。
  • 神话 vs 事实:compare,left.color: "danger"、right.color: "good",然后在下一个 title 场景上叠加 stamp "FALSE"。

使用 video-script(tools/beats.mjs 可将场景与旁白时间点对齐)规划节奏,然后运行:

cd remotion
node render.mjs job/spec.json --validate
node render.mjs job/spec.json job/final.mp4 --preview job/check.jpg --at 0.1,<每个场景的中间时间>,<结束前1秒>

交付前务必检查预览截图:确保 0.1 秒时钩子已完全绘制、没有内容被裁剪、文字无重叠、强调色清晰可读、AI 生成标签和水印正常显示。

样式规则

  • 品牌色来自 settings.brand(规范中的 theme):使用一种强调色,用于每个场景中最重要的元素。
  • 每行标题 ≤ 7 个词,每个覆盖文本 ≤ 12 个词,每列表格/对比栏 ≤ 4 项(手机屏幕较小)。
  • 每个场景至少停留 1.5 秒(按其中每行文字计算)。
  • 数字必须与 citations 匹配;切勿动画化未注明来源的数据。
  • 不得使用品牌徽标、真人照片或真实聊天截图。

第二层——添加新的场景类型

仅当上述所有场景组合都无法展示创意时使用(例如:地图路线、进度环、分屏反应)。

  1. src/types.ts:添加 XShot = ShotBase & { type: "x"; … } 并将其加入 Shot 联合类型。
  2. src/shots/Shots.tsx:编写组件,放在其他组件旁边——使用 useCurrentFrame() 配合 spring/interpolate 进行动画(禁止使用 CSS 动画或 Math.random:渲染必须确定性);使用 t.font、t.accent、tone(t, color),画面尺寸为 1080×1920;然后在 ShotView 中添加一行 if (s.type === "x") body = …。如果场景在 0 秒时已出现(base === 0),则需完全绘制,无需入场动画。
  3. render.mjs:将 "x" 加入 types 并添加对应必填字段的验证(检查代理依赖这些错误信息)。
  4. SPEC.md 及上表:记录该场景。将其加入 examples/animated.json。
  5. 测试:运行 npx tsc --noEmit -p .、node render.mjs examples/animated.json out/animated.mp4 --preview out/animated.jpg --at … 并查看结果。

相关技能