extreme-motion-design
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseMotion Design
Motion Design
Produz vídeo de motion design por código, com áudio e verificação. O agente não enxerga o vídeo enquanto escreve código: por isso o fluxo mede antes de renderizar (), obriga a olhar frames renderizados e só entrega depois de um gate numérico ().
lint.pyqa.pyCaminhos são relativos à pasta desta skill (). Scripts com dependências declaram tudo inline (PEP 723): rode com . , e usam só a biblioteca padrão e rodam com ; roda com na pasta do projeto.
<skill>uv run <skill>/scripts/x.pyvoice.pylint.pygl.pypython3stills.cjsnode通过代码制作 motion design 视频,并加入音频与验证。Agent 在编写代码时无法直接看到视频:因此,该流程会先执行测量再渲染(),要求检查已渲染的 frames,并且只有在通过数值 gate()后才交付。
lint.pyqa.py以下路径均相对于此 skill 所在的文件夹()。依赖项通过 inline 声明(PEP 723)的脚本应使用 运行。、 和 仅使用标准库,可通过 运行; 在项目目录下通过 运行。
<skill>uv run <skill>/scripts/x.pyvoice.pylint.pygl.pypython3stills.cjsnodeFluxo obrigatório
强制流程
- Brief em 5 linhas: objetivo, público, formato (16:9, 9:16, 1:1), duração, tom e marca (cores, fonte). Se faltar formato ou duração, assuma 16:9, 30 fps, 15 a 30 s, e diga o que assumiu.
- Pergunta de voz (sempre): rode e faça ao usuário a pergunta que ele imprime, com as três opções: sem voz, voz com ElevenLabs (o script traz o passo a passo da chave) ou voz local (o script recomenda o modelo que cabe no hardware medido). Use a ferramenta de pergunta do agente quando existir, senão pergunte em texto, e espere a resposta. Não escolha pelo usuário. Só dispense quando o pedido já respondeu com todas as letras. Detalhes de cada caminho em
python3 <skill>/scripts/voice.py.references/narration.md - Projeto: copie para a pasta do vídeo, renomeie
<skill>/assets/template/paragitignore(é ele que mantém o.gitignorefora do git) e rode.env. Mapa das primitivas emnpm install.references/template.md - Roteiro e voz primeiro (se houver voz): escreva o roteiro, gere o áudio pelo caminho escolhido e use os tempos reais das palavras. O áudio é o relógio; o visual se ajusta a ele, nunca o contrário.
- Partitura: preencha (duração, cenas, narração, trilha, eventos de SFX, loudness). Fronteiras de cena saem do início das frases. Vídeo, mixagem, lint e QA leem este mesmo arquivo.
public/timeline.json - Trilha e SFX: (Incompetech, depois Openverse, depois geração local) e eventos de SFX na partitura. Todo arquivo baixado entra em
music.py. Detalhes emcredits.json. Aprovação do áudio (com voz): rodereferences/audio.mde entreguemix.pypara o usuário ouvir antes do render final. Pedido que muda só a voz refaz voz, partitura e mix e volta para o usuário ouvir, sem render e sem folha de contato, até a voz ser aprovada.public/audio/mix.wav - Direção antes de animar: leia e a doutrina (
references/direction.md). Faça 3 a 5 styleframes comreferences/doctrine.mde olhe cada um antes de animar.stills.cjs --times - Cenas: construa com as primitivas do template. Leia só a referência da técnica que for usar (roteador abaixo).
- Lint (antes de todo render): na pasta do projeto. Corrija todo FAIL; avalie cada WARN.
python3 <skill>/scripts/lint.py - Dailies: gera os frames de início, meio e fim de cada cena em um processo só, e
node <skill>/scripts/stills.cjs <Composição>monta a folha sem precisar de MP4. OLHE a imagem, revise com o checklist decontact_sheet.py --stills out/stills, corrija e repita até não haver FIX. Para ver vários frames nunca chamereferences/qa.mdem laço: cada chamada refaz o bundle e abre outro browser.remotion still - Mixagem, render, entrega e gate:
bash
uv run <skill>/scripts/mix.py public/timeline.json npx remotion render Showcase out/render.mp4 --codec=h264 --audio-codec=aac --color-space=bt709 $(python3 <skill>/scripts/gl.py Showcase) uv run <skill>/scripts/deliver.py out/render.mp4 -o out/final.mp4 uv run <skill>/scripts/qa.py out/final.mp4 --profile youtube --timeline public/timeline.json --words public/audio/narration.words.json --stills out/stills uv run <skill>/scripts/contact_sheet.py out/final.mp4 --timeline public/timeline.json -o out/sheet.pngmede uma vez por projeto qual backend gráfico renderiza mais rápido com a mesma imagem e devolve a flag (ou nada).gl.pycopia o vídeo sem reencode quando o render já está certo.deliver.pyfaz o--stillsreprovar MP4 com contraste diferente dos stills. Só entregue comqa.pysem FAIL. Entregue o MP4, a folha de contato e o texto de créditos, e diga o que ficou em WARN.qa.py
- Brief(5 行):目标、受众、格式(16:9、9:16、1:1)、时长、基调和品牌(颜色、字体)。如果缺少格式或时长,则假设为 16:9、30 fps、15 至 30 秒,并说明所作的假设。
- 语音问题(始终必问):运行 ,并向用户提出它输出的问题,同时提供三个选项:无语音、使用 ElevenLabs 配音(脚本会提供 API key 的配置步骤)或本地语音(脚本会根据检测到的硬件推荐合适的模型)。如果 Agent 具备问题工具,应使用该工具,否则以文本方式提问,并等待用户回复。不得代替用户选择。只有当请求中已经明确回答所有选项时,才可省略此步骤。各路径的详细信息见
python3 <skill>/scripts/voice.py。references/narration.md - 项目:将 复制到视频文件夹中,将
<skill>/assets/template/重命名为gitignore(该文件用于确保.gitignore不会进入 git),然后运行.env。Primitives 映射见npm install。references/template.md - 先写脚本和配音(如有配音):编写脚本,通过所选路径生成音频,并使用单词的实际时间数据。音频是时钟;视觉内容必须适应音频,而不能反过来。
- 编排表:填写 (时长、场景、narration、配乐、SFX 事件、loudness)。场景边界从短句开头划分。视频、混音、lint 和 QA 均读取此文件。
public/timeline.json - 配乐和 SFX:使用 (先使用 Incompetech,再使用 Openverse,最后使用本地生成),并在编排表中填写 SFX 事件。每个下载的文件都应记录到
music.py中。详细信息见credits.json。 音频审批(使用配音时):运行references/audio.md,并将mix.py交付给用户试听,确认后才能进行最终渲染。如果请求只修改语音,则重新生成语音、编排表和混音,并再次交给用户试听;在语音获得批准前,不进行渲染,也不生成 contact sheet。public/audio/mix.wav - 先导演,后动画:阅读 和运动准则(
references/direction.md)。使用references/doctrine.md制作 3 至 5 个 styleframes,并在制作动画前逐一查看。stills.cjs --times - 场景:使用模板中的 primitives 构建场景。仅阅读将要使用的技术所对应的参考文档(见下方路由表)。
- Lint(每次渲染前):在项目文件夹中运行 。修复所有 FAIL,并评估每个 WARN。
python3 <skill>/scripts/lint.py - Dailies:运行 ,在同一个进程中生成每个场景的开头、中间和结尾 frames;然后运行
node <skill>/scripts/stills.cjs <Composição>,无需生成 MP4 即可制作 contact sheet。务必查看图像,使用contact_sheet.py --stills out/stills中的 checklist 进行审查,修正问题并重复此过程,直到不再存在 FIX。需要查看多个 frames 时,绝不要循环调用references/qa.md:每次调用都会重新打包 bundle 并打开另一个 browser。remotion still - 混音、渲染、交付与 gate:
bash
uv run <skill>/scripts/mix.py public/timeline.json npx remotion render Showcase out/render.mp4 --codec=h264 --audio-codec=aac --color-space=bt709 $(python3 <skill>/scripts/gl.py Showcase) uv run <skill>/scripts/deliver.py out/render.mp4 -o out/final.mp4 uv run <skill>/scripts/qa.py out/final.mp4 --profile youtube --timeline public/timeline.json --words public/audio/narration.words.json --stills out/stills uv run <skill>/scripts/contact_sheet.py out/final.mp4 --timeline public/timeline.json -o out/sheet.png每个项目测量一次在生成相同图像时哪个图形 backend 渲染速度更快,并返回相应的 flag(或不返回 flag)。如果渲染结果已经正确,gl.py会在不重新编码的情况下复制视频。deliver.py会使--stills在 MP4 的对比度与 stills 不一致时判定失败。只有当qa.py没有 FAIL 时才能交付。最终应交付 MP4、contact sheet 和 credits 文本,并说明仍处于 WARN 状态的项目。qa.py
Regras inegociáveis
不可妥协的规则
- Todo estado visual deriva de . Proibido: transição ou animação CSS, classes
useCurrentFrame(),animate-*,setTimeout,Date.now()(useMath.random()),random(seed)do React Three Fiber. Senão o render pisca ou diverge do preview.useFrame()reprova.lint.py - Curvas e springs só dos tokens de : entrada
src/lib/motion.tsouenter, saídasharp, mudança de posição ou formaexit, zoom out e revealmove, herói da cenasettle,easeX.emphasizedsó para rotação contínua e loops. Nuncalinearoubounce. Overshoot é um só (elasticoueaseX.overshoot) e só no elemento em foco.springs.snappy - Uma ação primária por vez; secundárias de até 30% da amplitude e ambiente de até 5%. Stagger total até 500 ms. Saída dura cerca de 75% da entrada. Primeira animação começa 0,1 a 0,3 s depois do corte. Depois de cada chegada, hold de 0,4 a 0,8 s; pausa de 0,3 a 0,75 s antes do clímax.
- Texto fica na tela pelo menos 1,5 s + 0,3 s por palavra e no máximo 17 caracteres por segundo em pt-BR. No máximo 2 linhas de 32 a 42 caracteres.
- Safe area: ação dentro de 90% do quadro, texto dentro de 80%. Em 9:16 (1080x1920), texto entre y 360 e 1420.
- Motion blur só em 1 a 3 batidas rápidas por vídeo, nunca em texto que precisa ser lido.
- Nada com cara de gerado por IA: sem gradiente roxo de tela cheia, sem tudo entrando com fade, sem glow genérico, sem emoji, sem tudo centralizado. Uma cor de acento, contraste WCAG AA.
- Nenhum número, logo ou fato inventado na tela. Dado do usuário ou com fonte.
- Trilha só com licença ,
cc0oupdm(ou gerada). Nuncaby,nd,sa, sampling+ ou licença desconhecida.nc - Chave de API nunca entra no chat, em comando, em log ou em arquivo versionado. O usuário grava no do projeto.
.env
- 所有视觉状态都必须派生自 。禁止使用:CSS transition 或 animation、
useCurrentFrame()classes、animate-*、setTimeout、Date.now()(应使用Math.random())以及 React Three Fiber 的random(seed)。否则,渲染结果会闪烁或与 preview 不一致。useFrame()会判定失败。lint.py - 曲线和 springs 只能使用 中的 tokens:入场使用
src/lib/motion.ts或enter,退场使用sharp,位置或形状变化使用exit,zoom out 和 reveal 使用move,场景 hero 使用settle;easeX.emphasized仅用于持续旋转和 loops。绝不使用linear或bounce。Overshoot 只能使用一种(elastic或easeX.overshoot),并且只能应用于焦点元素。springs.snappy - 每次只执行一个主要动作;次要动作的幅度最多为 30%,环境元素的幅度最多为 5%。总 Stagger 不得超过 500 ms。退场时长约为入场时长的 75%。首个动画应在剪切后 0.1 至 0.3 秒开始。每次元素到位后,应保持 0.4 至 0.8 秒;在 clímax 前停顿 0.3 至 0.75 秒。
- 文本在屏幕上的停留时间至少为 1.5 秒加每个单词 0.3 秒,在 pt-BR 中每秒最多显示 17 个字符。最多 2 行,每行 32 至 42 个字符。
- Safe area:动作必须位于画面的 90% 区域内,文本必须位于 80% 区域内。在 9:16(1080x1920)格式中,文本应位于 y 360 至 y 1420 之间。
- Motion blur 每个视频只能用于 1 至 3 个快速节拍,绝不能用于需要阅读的文本。
- 不得呈现明显的 AI 生成风格:禁止全屏紫色渐变、禁止所有元素都以 fade 入场、禁止通用 glow、禁止 emoji,也禁止将所有元素居中。使用一种 accent color,并达到 WCAG AA 对比度。
- 屏幕上不得出现任何虚构的数字、logo 或事实。所有信息必须来自用户或注明来源。
- 配乐只能使用 、
cc0或pdm授权,或由本地生成。绝不使用by、nd、sa、nc或授权不明的音乐。sampling+ - API key 绝不能出现在聊天内容、命令、日志或已纳入版本控制的文件中。API key 应由用户保存在项目的 中。
.env
Roteador de técnicas
技术路由表
| Técnica | Referência | Primitiva ou script |
|---|---|---|
| Keyframing, motion smooth, easing, springs | | |
| Zoom in, zoom out, push-in, pan, whip pan, parallax, câmera na mão | | |
| Motion graphics (formas, linhas, dados, logo) | | |
| Kinetic typography | | |
| Morphing | | |
| Seamless loop | | |
| UX/UI motion e microinterações | | |
| Antecipação, overshoot, follow-through, squash e stretch, smear | | |
| Cascata, speed ramp, time remap, curva de velocidade | | |
| Match cut, morph cut, corte invisível, J-cut e L-cut, íris, transição por forma e líquida | | |
| Mattes, trim paths, repeater, baseline reveal, contador, eco, shine, look de lente | | |
| Frame a frame, cel animation, stop motion | | |
| Rigging, IK, lip sync | | |
| Motion 3D | | |
| Compositing | | blend modes, máscaras, |
| Motion tracking | | |
| Match moving | | |
| Rotoscopia | | |
Direção e estrutura de batidas (), voz (), áudio (), QA e entrega (), doutrina de movimento (), mapa do template ().
references/direction.mdreferences/narration.mdreferences/audio.mdreferences/qa.mdreferences/doctrine.mdreferences/template.md| 技术 | 参考文档 | Primitive 或脚本 |
|---|---|---|
| Keyframing、motion smooth、easing、springs | | |
| Zoom in、zoom out、push-in、pan、whip pan、parallax、手持镜头 | | |
| Motion graphics(形状、线条、数据、logo) | | |
| Kinetic typography(动态排版) | | |
| Morphing | | |
| Seamless loop(无缝循环) | | |
| UX/UI motion 与 microinteractions | | |
| Anticipation、overshoot、follow-through、squash and stretch、smear | | |
| Cascade(级联)、speed ramp、time remap、速度曲线 | | |
| Match cut、morph cut、无痕剪切、J-cut 和 L-cut、iris、shape transition 和 liquid transition | | |
| Mattes、trim paths、repeater、baseline reveal、counter、echo、shine、镜头质感 | | |
| Frame a frame、cel animation、stop motion | | |
| Rigging、IK、lip sync | | |
| Motion 3D | | |
| Compositing | | blend modes、masks、 |
| Motion tracking | | |
| Match moving | | |
| Rotoscopia | | |
导演与节拍结构()、语音()、音频()、QA 与交付()、运动准则()以及模板映射()。
references/direction.mdreferences/narration.mdreferences/audio.mdreferences/qa.mdreferences/doctrine.mdreferences/template.mdComandos de voz e áudio
语音与音频命令
bash
python3 <skill>/scripts/voice.py # mede o hardware e monta a pergunta de voz
python3 <skill>/scripts/voice.py --check-key # valida a chave da ElevenLabs sem gastar
python3 <skill>/scripts/voice.py --audition "Primeira frase." -o out/vozes # mesma frase em cada voz local
uv run <skill>/scripts/tts.py roteiro.txt -o public/audio/narration --voice pf_dora --speed 0.92 # Kokoro local
uv run <skill>/scripts/tts.py roteiro.txt -o public/audio/narration --provider elevenlabs --voice <voice_id>
uv run <skill>/scripts/align.py public/audio/narration.wav roteiro.txt # tempos por palavra para qualquer WAV
uv run <skill>/scripts/tts.py --normalize-only "Plano de R$ 49,90 às 14h30 com IA" # confira a pronúncia
uv run <skill>/scripts/music.py incompetech --feel calm --bpm 70-110 --min-sec 60 -o public/audio/music.mp3
uv run <skill>/scripts/music.py generate --sec 30 --bpm 84 --mood calm -o public/audio/music.wav # offline
uv run <skill>/scripts/beats.py public/audio/music.mp3 --fps 30 # cortes na batida
uv run <skill>/scripts/sfx.py --all public/audio/sfx # whoosh, pop, click...bash
python3 <skill>/scripts/voice.py # mede o hardware e monta a pergunta de voz
python3 <skill>/scripts/voice.py --check-key # valida a chave da ElevenLabs sem gastar
python3 <skill>/scripts/voice.py --audition "Primeira frase." -o out/vozes # mesma frase em cada voz local
uv run <skill>/scripts/tts.py roteiro.txt -o public/audio/narration --voice pf_dora --speed 0.92 # Kokoro local
uv run <skill>/scripts/tts.py roteiro.txt -o public/audio/narration --provider elevenlabs --voice <voice_id>
uv run <skill>/scripts/align.py public/audio/narration.wav roteiro.txt # tempos por palavra para qualquer WAV
uv run <skill>/scripts/tts.py --normalize-only "Plano de R$ 49,90 às 14h30 com IA" # confira a pronúncia
uv run <skill>/scripts/music.py incompetech --feel calm --bpm 70-110 --min-sec 60 -o public/audio/music.mp3
uv run <skill>/scripts/music.py generate --sec 30 --bpm 84 --mood calm -o public/audio/music.wav # offline
uv run <skill>/scripts/beats.py public/audio/music.mp3 --fps 30 # cortes na batida
uv run <skill>/scripts/sfx.py --all public/audio/sfx # whoosh, pop, click...Quando parar e perguntar
何时停止并询问
- A pergunta de voz do passo 2.
- Logo, marca, número ou depoimento que o usuário não forneceu.
- Antes de gastar em API paga (voz, música): diga o tamanho do roteiro em caracteres e espere o sim.
- Trilha com licença diferente de cc0, pdm ou by.
- Empresa do usuário com mais de 3 pessoas usando Remotion: avise da Company License.
- 第 2 步中的语音问题。
- 用户未提供的 logo、品牌、数字或证言。
- 在产生付费 API 费用(语音、音乐)之前:告知脚本的字符数并等待用户确认。
- 配乐授权不属于 、
cc0或pdm。by - 用户所在公司有超过 3 人使用 Remotion:提醒其注意 Company License。