Communitygithub.com

shaharsha/geração-de-clipes-de-vídeo

Use para transformar uma imagem estática, ilustração, quadrinho ou arte de personagem em um clipe animado curto (imagem para vídeo), escolhendo um modelo/provedor de vídeo (Gemini Omni, Veo, Seedance, Kling, ElevenLabs Flows) ou acessando suas APIs, sincronizando os lábios de um personagem com um áudio de diálogo existente (Sync, fal.ai, active speaker), ou corrigindo um clipe com artefatos – objetos duplicados, uma porta ou uma segunda figura aparecendo, mãos atravessando corpos, olhos brilhando, um gesto repetido no início, etc.

O que é geração-de-clipes-de-vídeo?

Este skill automatiza o pipeline de pós-produção de animação: a partir de uma imagem finalizada (ilustração, painel de quadrinho ou arte de personagem), gera-se um clipe de 4 a 9 segundos usando um modelo de imagem para vídeo (padrão: Gemini Omni Flash 1.1, com suporte para Veo, Seedance e ElevenLabs Flows). Em seguida, se houver um personagem falando, um modelo de sincronização labial (padrão: Sync 3 no fal.ai) ajusta o movimento da boca ao áudio de diálogo fornecido, preservando o movimento original do clipe. O skill inclui scripts para revisão sistemática (extração de frames de cada take, detecção de cortes, e criação de folhas de contato visuais) e para correção de artefatos comuns (objetos duplicados, portas ou pessoas extras, gestos repetidos) via ajuste de offset, velocidade e recorte. O workflow é totalmente orientado por prompts com linha do tempo por segundo, descrição de personagens por características visuais (nunca por nome) e divisão de cenas com múltiplos falantes para sincronia labial independente. Suporta paralelismo (até 6 jobs de lip-sync simultâneos) e oferece fallback de chaves de API (GEMINI_IMAGE_API_KEY como fallback para GEMINI_API_KEY).

Funciona com~Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/shaharsha/claude-skills/tree/HEAD/skills/generating-video-clips

Perguntar na sua IA favorita

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

Documentação

Geração de clipes de vídeo (imagem para clipe, depois sincronia labial)

Visão geral

Uma imagem finalizada se torna um clipe de 4 a 9 segundos com um modelo de imagem para vídeo. Em seguida, se um personagem fala na tela, um modelo de sincronia labial ajusta o movimento da boca ao seu próprio diálogo. Você não pode assistir ao resultado: julgue cada clipe a partir de frames extraídos (scripts/take_sheet.py e o skill visualizar-vídeos), e deixe o humano ter a palavra final sobre o movimento.

Requisitos: Python 3 (apenas stdlib) e ffmpeg/ffprobe. As chaves vão em variáveis de ambiente: GEMINI_API_KEY (uma chave do Google AI Studio; uma chave com escopo de imagem funciona, e GEMINI_IMAGE_API_KEY é lida como fallback) para Omni, e FAL_KEY (a chave completa exatamente como o fal a mostra) para sincronia labial. Nunca as imprima.

Escolha o modelo

ModeloAcessado porUse paraObservações
Gemini Omni Flash 1.1 (gemini-omni-1.1-flash)Google Interactions API, chave AI StudioPadrão para ilustrações, anime e cartoons; também funcionou em uma imagem fotorrealista (um teste)Mantém o estilo artístico e os rostos; qualquer proporção de entrada (uma imagem 2:3 resultou em 9:16 limpo, sem necessidade de expandir ou cortar); 720p 9:16 ou 16:9; síncrono, ~25-35 s por clipe; adiciona seu próprio áudio (silencie-o)
Veo 3.1 / Veo 3.1 FastGemini API, imagem como frame inicialimagens fotorrealistasnão usado em nossas execuções; verifique a documentação atual primeiro
Seedance 2.5ElevenLabs Flows, ou ByteDance diretamentevisual alternativoprecisou de aprovação de conta quando testado
Qualquer modelo dentro do ElevenLabs FlowsElevenLabs APIuma chave para tudoO acesso à API precisa do plano Pro (402 paid_plan_required) e da permissão image_video_generation da chave (401 sem ela); Omni lá é apenas para aplicativo

Para sincronia labial, Sync 3 no fal (fal-ai/sync-lipsync/v3) é o padrão. Funciona vídeo a vídeo, então mantém o movimento do clipe e ajusta apenas a boca. Comparação e preços: references/providers.md.

Animar uma imagem

python3 <diretório-deste-skill>/scripts/omni_generate.py jobs.json clips/ [--takes 3] [--only S05]
{"base": "Dê vida a esta imagem como ela é: mesmo estilo de arte, paleta, luz e layout, e cada personagem mantém o rosto, cabelo, físico e roupas que tem nela. Movimento natural e fluido. Nada escrito na tela, sem balões de fala, ninguém novo, um único plano contínuo.",
 "jobs": {"S05": {"image": "painéis/p05.png",
                  "prompt": "[0-3s] A mulher de jaqueta vermelha levanta o telefone e fala, animada. [3-6s] A amiga de moletom verde se reclina no sofá e ri. Câmera aproxima lentamente."}}}

Como escrever o prompt (guia completo com exemplos em references/gemini-omni.md):

  • Uma linha do tempo por segundo, um momento por colchete. O clipe dura aproximadamente o tempo da linha do tempo.
  • Nomeie as pessoas pelo que vestem, nunca pelo nome: o modelo não sabe quem é "Dana".
  • Diga "fala" para quem será sincronizado labialmente, para que a boca já se mova.
  • Fixe o que não pode mudar: "a câmera fica parada", "uma única janela na parede esquerda", "exatamente UMA figura encapuzada", "as mãos dela ficam apoiadas na mesa". Cada fixação em references/failure-modes.md veio de uma falha real.

Revise cada take antes de usar

python3 <diretório-deste-skill>/scripts/take_sheet.py sheet revisão/S09.jpg clips/S09_t1.mp4 clips/S09_t2.mp4 clips/S09_t3.mp4 --times 0.3,1,2,3,4,5,6

Leia a folha: linhas são takes, colunas são tempos. Procure por objetos que duplicam, portas ou pessoas que aparecem, mãos cruzando corpos, rostos que se desviam e um gesto feito duas vezes. Nomeie o segundo exato de cada problema, porque a correção depende de onde ele está.

Um corte brusco é fácil de perder entre frames amostrados. Liste-os diretamente; nenhuma saída significa um único plano contínuo:

ffmpeg -i clips/S09_t1.mp4 -vf "select='gt(scene,0.3)',showinfo" -an -f null - 2>&1 | grep pts_time

Ajustar um clipe ao seu plano

Uma edição precisa de um clipe que preencha exatamente seu plano, na taxa de quadros da edição:

ProblemaCorreção
Início ruim (um gesto feito antes de sua fala, um objeto duplicado no primeiro segundo)Comece mais tarde: --off 1.5.
Muito curto após o corteDesacelere com --speed 1.22 (até ~1.25 é lido bem); o último frame é mantido.
Meio ruimDivida o plano: reproduza a primeira fala em um recorte que mantenha o problema fora do quadro, depois corte de volta após ele.
Irrecuperável (uma porta aparece, uma segunda pessoa entra)Regere com um prompt fixado, 2-3 takes, e escolha em uma folha.

lipsync_parts.py normalize clipe.mp4 plano.mp4 --frames N --off S --speed K faz o offset, velocidade, fps, escala (cobrir e centralizar, nunca esticar) e retenção do último frame em uma única etapa, e sempre retorna exatamente N frames.

Sincronizar diálogo labial

  1. Normalizar o clipe para o plano: python3 <diretório-deste-skill>/scripts/lipsync_parts.py normalize clipe.mp4 plano.mp4 --frames 132 --off 1.5 --speed 1.22.
  2. Dividir nos limites das falas para que cada parte tenha um falante.
    • Escreva plano.json: cada fala com seu início/fim no plano (segundos) e seu falante; frames é igual ao --frames que você normalizou. Adicione "skip": true para um falante visto de costas, fora da tela, ou um grito de multidão:
      {"id": "S05", "video": "plano.mp4", "fps": 24, "frames": 132,
       "falas": [{"id": "05-1", "audio": "falas/05-1.mp3", "start": 0.72, "end": 2.31, "speaker": "maya"},
                 {"id": "05-2", "audio": "falas/05-2.mp3", "start": 2.43, "end": 4.10, "speaker": "ido"}]}
      
    • Execute lipsync_parts.py split plano.json parts/. Além das partes, ele escreve parts/S05_lipsync_jobs.json: uma entrada para cada parte não pulada, com caminhos absolutos, out já nomeado como o join espera (synced/S05_<k>.mp4), e face: null.
  3. Apontar para o falante em cada parte e escreva no arquivo de jobs como "face": "x,y@<mid>" (mid está em cada entrada).
    • Escolha um pixel no rosto dele no frame do meio da parte.
    • Confirme: take_sheet.py point parts/S05_1.mp4 check.jpg --frame 30 --xy 410,560, depois leia a imagem.
    • Detectores faciais são pouco confiáveis em rostos desenhados, então escolha e confirme visualmente. Deixe null apenas quando um único rosto estiver visível.
  4. Sync: lipsync_fal.py --jobs parts/S05_lipsync_jobs.json. Espere ~$0.13 por segundo e ~70-150 s por parte; 6 rodam em paralelo. Saídas existentes são puladas. Para refazer uma parte após corrigir seu rosto, rode essa parte sozinha: lipsync_fal.py parts/S05_1.mp4 parts/S05_1.wav synced/S05_1.mp4 --face 410,560@30 --force (--force com --jobs refaria todas as partes).
  5. Juntar: lipsync_parts.py join parts/S05_plan.json synced/ final/S05.mp4. Cada parte é forçada a sua contagem exata de frames, partes puladas mantêm seus frames originais, uma parte sem arquivo sincronizado é reportada (--strict torna isso um erro), e a contagem total de frames é verificada.

Detalhes, escolha de modelo e casos de falha: references/lipsync.md.

Custos e tempos (medidos em 2026-10)

EtapaContagemCustoTempo
Clipe Omnipor segundo de vídeo de saída (um clipe de 6 s é ~$0.60; planeje ~1.5 chamadas por plano para retakes)~$0.10~30 s por chamada, 4 em paralelo
Sync 3 lip-syncpor segundo de saída (uma parte tem tipicamente 3-6 s)~$0.13~70-150 s por parte, 6 em paralelo

Erros comuns

ErroResultadoCorreção
Nomear personagens no prompt de vídeoa pessoa errada se movedescreva-os pelas roupas
Manter o áudio do Omnivozes e música inventadas sob seu diálogosilencie-o (-an)
Usar um take sem uma folhaobjetos duplicados e novas portas vão para o arfaça folha de cada take
Regenerar o clipe inteiro por um primeiro segundo ruimnovos problemas em outros lugaresoffset mais desaceleração
Sincronizar labialmente um plano inteiro com dois falantesuma boca se move para ambas as falasdivida nos limites das falas, um falante por parte
Deixar o modelo escolher o falanteo rosto errado fala--face X,Y@FRAME
Encurtar a chave fal401passe a chave exatamente como o fal a mostra
Juntar partes sem corrigir as contagens de frameso plano perde sincronia com a ediçãolipsync_parts.py join

Skills relacionados

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

shaharsha/deck-to-video

Use when turning a slide deck plus per-slide narration audio into an mp4 video — a self-playing/self-presenting deck video, "slides to video", "presentation to mp4", a shareable WhatsApp/Slack/Drive video of a narrated deck, or when a slide video needs a per-slide progress bar / countdown / slide counter. Also use when a slide video should highlight, glow or spotlight the element being talked about in time with the voice, or when narration and on-screen animation need syncing. Also use when...

shaharsha/image-generation

Generate logos, icons, UI mockups, hero images, product shots, and other design assets using OpenAI GPT Image 2.5 (Sunburst, Flare) or Google Gemini (Nano Banana 2, Nano Banana Pro, Nano Banana 2 Lite). Use whenever the user asks to create, design, generate, mock up, render, or illustrate a visual asset, needs a transparent PNG, or asks for image prompt engineering. Picks the right model and quality for the job, writes a model-specific prompt following the official prompting rules of each...

shaharsha/producing-animated-episodes

Use when making a narrated or voiced animated video with recurring characters - an anime, cartoon or comic episode, a short for a group chat, a story video about friends, family, a class or a team - from photos, a chat export, a story idea or a script, in any visual style, Hebrew/RTL or English. Also use when such a video has subtitles or cards too fast to read, music stopping early, the ending cut off, lines buried under music, mouths out of sync, a gesture before its line, or one face...

Habilidades Relacionadas