Communitygithub.com

orange9angel/dula-flat-cel

Crie curtas de animação flat-color no estilo cartoon de TV, usando um modelo de imagem e scripts Python+ffmpeg, desde o storyboard até o vídeo final com som.

O que é dula-flat-cel?

Esta skill transforma histórias escritas em curtas animados no estilo flat-color (cores chapadas), ideal para animação limitada, diálogos e séries de TV. Ela utiliza apenas Python e ffmpeg, dispensando modelos 3D ou de vídeo. O fluxo de trabalho guia o usuário desde a criação do projeto, design de personagens (com aprovação humana), desenhos de fundo e cenas, geração de variações de boca e piscadas, sincronização labial a partir de áudio, até a renderização final. Suporta múltiplos personagens, ciclos de ação, mudanças de cenário e efeitos como pan, bob e shake. A skill é executada via scripts na pasta `scripts/` e requer revisão manual em cada etapa para garantir consistência visual e evitar artefatos como bocas congeladas ou desenhos pulsando. É particularmente adequada para produções curtas (20-30 segundos) e estilos cartoon simples, mas não recomendada para cenas de ação complexas ou pintura realista.

Funciona com✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/orange9angel/dula-craft/tree/HEAD/skills/dula-flat-cel

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Animação flat-color

Um desenho é segurado por 3–4 quadros, e o desempenho vem da troca de desenhos e formatos de boca. Para designs simples de cartoon de TV, essa é a rota onde os modelos de imagem permanecem mais consistentes. Não precisa de 3D nem de um modelo de vídeo.

Os scripts estão na pasta scripts/ desta skill, com caminhos relativos a este SKILL.md. Abaixo, $S significa essa pasta. Exceto por new_project.py, execute-os a partir da pasta do filme. Para problemas de ambiente, use dula-start.

Fale com a pessoa no idioma dela.

Fluxo de trabalho

python $S/new_project.py my_film && cd my_film

1. História e planos

Escreva story.md, depois config/film.json (veja a referência de film.json). Mantenha o primeiro filme em 20–30 segundos, e uma fala leva cerca de 2–3 segundos, então 15 segundos comportam 3–5 falas. Use apenas personagens originais.

Para cada fala, pense em quem diz, para quem, e quem a câmera mostra. Piadas não devem depender de palavras que o público não entenderá. Causa e efeito precisam de desenhos também (entra correndo → pega → o objeto voa). Não pule com um corte.

2. Designs de personagem (a etapa mais importante)

Coloque cada personagem em config/anchors.tsv (nome<TAB>aparência), depois execute:

python $S/paint.py anchors config/anchors.tsv

Abra e olhe cada imagem você mesmo. Alguns visualizadores mostram uma área transparente como um brilho colorido sobre preto, o que parece um recorte falho. Em caso de dúvida, verifique build/check_alpha.png da etapa 3. Depois, mostre os designs à pessoa e obtenha a aprovação dela antes de continuar. Cada desenho posterior segue estes, então um erro aqui custa mais caro para corrigir. Corrija as proporções em palavras, como "cabeça com um terço da altura total, rosto redondo, olhos pequenos de conta preta, macacão vermelho".

3. Fundos e desenhos

Preencha config/plates.tsv (nome<TAB>descrição) e config/cels.tsv (desenho<TAB>personagem<TAB>pose). Comece os nomes dos desenhos com o nome do personagem, como hero_corre_a.

python $S/paint.py plates config/plates.tsv
python $S/paint.py cels config/cels.tsv
python $S/prep_cels.py --bases-only    # Verifique os recortes em build/check_alpha.png antes de pintar bocas

As imagens levam de 1 a 3 minutos cada, e paint.py relata o progresso conforme avança. Se sua ferramenta interromper comandos longos, execute em segundo plano. Uma reexecução pula imagens já finalizadas. Para refazer uma, use --only <nome> --force.

Para manter desenhos e lugares contínuos, adicione mais uma coluna nomeando o que seguir:

hero_corre_a	heron	Correndo para a direita, pé esquerdo à frente.
hero_corre_b	heron	Correndo para a direita, pé direito à frente.	hero_corre_a
prado	Um prado sob nuvens cinzentas de chuva.
prado_sol	A chuva parou e o sol irrompe.	prado

Regras:

  • Desenhe um personagem por imagem. O design do personagem é sempre a primeira referência. Nunca use uma imagem rejeitada como referência.
  • Decida primeiro para que lado os personagens olham. Imagens geradas uma a uma escolhem uma direção cada, então duas pessoas em uma conversa facilmente ficam de costas uma para a outra. Especifique isso de antemão e use flip para corrigir erros.
  • Cada desenho em um ciclo de ação segue o anterior (a coluna extra acima), para que direção, escala e forma permaneçam constantes. Sem isso, um ciclo vibra.
  • Para uma mudança na hora do dia, repinte o fundo, seguindo a placa original. Multiplicar uma cor não consegue esconder um céu azul.
  • Verifique as proporções de um personagem em cada plano. Uma descrição de pose como "pescoço esticado para cima" pode se transformar em um corpo diferente.

4. Bocas e piscadas

Cada desenho que fala recebe edições locais da mesma imagem. Em config/variants.tsv:

hero_parado_m1	hero_parado	Altere apenas a boca para entreaberta, oval pequeno.
hero_parado_m2	hero_parado	Altere apenas a boca para bem aberta.
hero_parado_piscar	hero_parado	Feche ambos os olhos como linhas curvas simples. Não mude mais nada.

Nomes: <base>_m1 é entreaberta, e <base>_m2 é bem aberta. Com apenas _m1, a boca tem dois estados, aberta e fechada, e isso também funciona. O desenho base em si deve ter a boca fechada. Se foi desenhado com a boca aberta, crie uma variante fechada e defina todos os três estados com talk em film.json.

Cada desenho de um personagem que fala precisa de suas próprias bocas, incluindo cada desenho em um ciclo de caminhada.

python $S/paint.py variants config/variants.tsv
python $S/prep_cels.py

prep_cels.py transforma os desenhos em cor chapada verdadeira e trava cada variante em sua base. Em seguida, abra build/check_alpha.png e verifique os recortes sobre magenta. Redesenhe qualquer imagem com fundo remanescente, peças faltando ou olhos apagados. Se ele avisar sobre uma grande área alterada, o modelo editou o corpo. Adicione uma janela x,y,w,h como coluna 4 de variants.tsv.

Cores variando? Você pode adicionar config/palette.json ({"pele": [250, 220, 190]}), usando cores amostradas do design do personagem. Apenas cores próximas se ajustam a ele, e prep_cels.py o aplica novamente após você alterá-lo.

5. Som

Escolha um:

  • Gere vozes com dula-voice, usando a própria chave da pessoa.
  • Use áudio existente: coloque-o em audio/voice/<id da fala>.wav, ou defina file na fala. mp3 e wav funcionam.
  • Faça um rascunho silencioso: dê à fala um valor seconds.

As bocas são calculadas a partir deste áudio, portanto, estabeleça as vozes antes de fazer o teste.

Opcional: ambience, bgm, sfx e songs. Use apenas material ao qual a pessoa tenha direitos. Este projeto não gera música. Sem música licenciada, deixe a trilha de fora e deixe a ambiência e os efeitos sonoros conduzirem o filme.

6. Teste

python $S/build_film.py
python $S/render.py --stills 1,3,5,8,12
python $S/render.py --range 0,20 -o output/pilot.mp4

build_film.py para com um erro quando um personagem visível fala, mas sua boca não pode se mover, o erro mais fácil de passar despercebido. Olhe cada still antes de mostrar o teste. Não espere o filme inteiro ficar pronto para mostrar a alguém.

Posicionar um personagem no chão: chute ground, renderize um still e ajuste. É mais rápido do que calcular.

Não deixe os planos parados. A menos que uma batida deva ser estática, dê a cada plano uma coisa que se move: um pan na placa, um bob ou shake, uma troca de desenho, ou uma sobreposição como chuva. Termine o filme com fade_out no último plano.

7. Filme completo e verificação final

python $S/render.py
python $S/check_mouths.py

Confirme cada um destes antes de entregar, e diga claramente se não conseguiu:

  • Você olhou um quadro real de cada plano
  • check_mouths.py não relata bocas congeladas
  • Cada personagem ainda parece a mesma pessoa em todos os planos (rosto e proporções importam mais que cor)
  • Pessoas em uma conversa estão de frente uma para a outra
  • Um único desenho se movendo pela tela tem um bob ou mais desenhos, senão parece deslizar
  • Você ouviu. Se não puder ouvir, diga que o áudio não foi verificado de ouvido

Um exemplo completo

examples/rainy-slide neste repositório tem os prompts e a lista de planos de um filme de 15 segundos finalizado, e docs/tutorial.md o explica. Encontre-os em ../../examples/rainy-slide e ../../docs/tutorial.md a partir deste arquivo. Use-os como modelo quando alguém pedir um.

Ritmo

Regras práticas: planos duram em média 3–5 segundos, personagens seguram cada desenho por 3–4 quadros (cerca de 7 desenhos por segundo), com close-ups frequentes e expressões exageradas. hold é o número de quadros por desenho.

Problemas comuns

SintomaCausa e correção
Cores do corpo piscam quando as bocas trocamA variante não passou por prep_cels.py
Uma caminhada ou corrida pulsa alto e baixoNão dimensione os desenhos separadamente. Um ator compartilha uma escala automaticamente. Adicione também align_head
Um adereço assume a cor erradaUma entrada da paleta está muito próxima. Remova-a ou diminua SNAP
A boca fica aberta durante a falaBocas de dois estados usam um limiar de 0.5. Verifique se o áudio está abafado
Palavras baixas ficam fechadasUma palavra alta define a escala para sua fala. Adicione um _m2, ou diminua mouth_open_at na fala
A chuva ou o vento não podem ser ouvidosA ambiência é baixa por padrão. Dê a ela um level_db, como -35
Chiado constanteO clipe de ambiência é apenas ruído. Substitua-o. O ganho é limitado, então não será amplificado ainda mais
Codex diz que a imagem de referência foi perdidaA geração de imagem deve ser sua primeira ação. paint.py lida com isso, então execute-o novamente

Limites

Esta rota não é adequada para lutas complexas, ação contínua longa ou pintura realista.

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

Habilidades Relacionadas