Vídeo com IA: Claude Code, Codex e ElevenLabs · Capítulo 20 de 25 · 24 min
Escrever prompt de vídeo em cinco camadas e manter o personagem consistente
Escreva cada cena em cinco camadas a partir de um arquivo JSON e use referências e o último quadro de cada clipe para manter a mesma cozinha em todo o vídeo.
Este capítulo faz parte do curso gratuito Vídeo com IA: Claude Code, Codex e ElevenLabs.
Modelo de vídeo não lê intenção, lê descrição. Um pedido solto como "cozinha aconchegante em Recife, bolo de rolo" devolve seis cozinhas diferentes em seis clipes, e a montagem denuncia o corte a cada troca de plano. Cada clipe refeito custa de US$ 0,48 a US$ 3,20, e o erro costuma estar no texto, não no modelo.
O que mantém a identidade é separar o pedido em camadas fixas, com vocabulário de set de filmagem, e repetir as camadas que não mudam (cenário, lente, luz, personagem) em todas as cenas. Nesta aula o prompt deixa de ser digitado à mão: ele nasce de um JSON por código, recebe as referências certas para cada modelo e encadeia os clipes pelo último quadro.
Escrever as cinco camadas na ordem do set
As cinco camadas seguem a ordem em que uma equipe de filmagem decide uma tomada. SHOT diz o enquadramento, a lente, a proporção e onde o assunto fica. CAMERA diz o movimento e quanto tempo ele dura. LIGHT diz a fonte, a direção e a temperatura da luz. ACTION diz o que acontece, uma única ação por clipe. AUDIO traz a fala entre aspas, o som ambiente e os negativos de áudio, como "No music" e "No on-screen text".
Escreva as camadas em inglês: os exemplos oficiais de Veo, Omni, Runway e Kling estão em inglês, e as instruções de áudio também. A fala em português do Brasil vai entre aspas dentro de AUDIO, só quando o modelo gera fala (Veo 3.1, Omni, Seedance 2.5, Kling Omni e MiniMax H3). O gen4.5 não tem áudio documentado na API: a camada AUDIO sai e a narração vem do Eleven v4, na aula 15.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
O mesmo pedido escrito solto e em cinco camadas
Prompt solto
Coluna a evitar
- Cozinha aconchegante em Recife, bolo de rolo
- Luz e lente ficam a critério do modelo em cada clipe
- Duas ações no mesmo clipe de 6 s
- Negativos esquecidos ou no campo errado
Cinco camadas
Coluna recomendada
- Azulejo azul-cobalto, bancada de madeira clara e janela à esquerda no bloco base
- LIGHT fixa em luz de janela a 4500 K e lente de 35 mm
- Uma ação por clipe, com o objeto e o movimento nomeados
- negative_prompt no Veo e frase Avoid no corpo para os demais
Abaixo está a cena de abertura da Cozinha da Rafa como o script desta aula monta, pronta para o Veo 3.1 Fast. O negative_prompt vai num campo separado, porque o Veo aceita.
Em português, a cena diz: plano médio fechado na vertical, o bolo de rolo num prato branco no terço inferior, lente de 35 mm com fundo desfocado, na mesma cozinha com azulejo português azul-cobalto. A câmera se aproxima devagar por 8 s, com leve tremor de mão. A luz é de janela no fim da manhã, 4500 K. As mãos cortam uma fatia fina em espiral, que tomba e mostra as camadas de goiabada. Uma voz feminina diz "Bolo de rolo de verdade tem a massa fininha assim.", com som ambiente de cozinha, sem música e sem texto na tela.
A cena c04 vai para o Kling 3.0 Pro na fal. O esquema da fal tem um campo negative_prompt, com um padrão próprio ("blur, distort, and low quality"), mas o script de envio da aula 21 não o preenche: o modelos.toml marca negative_prompt = false para esse modelo, e o script acrescenta uma linha Avoid no fim do texto.
Traduzindo: close na xícara de café preto sobre a bancada, com uma fatia de bolo de rolo no pires, câmera parada no tripé, a mesma luz de janela. As mãos pousam uma colherinha no pires enquanto o vapor sobe. No áudio, o tilintar da louça e o barulho distante da rua pela janela, sem música, sem fala e sem texto na tela. A última linha pede para evitar texto, marca d'água e mãos deformadas.
No Gemini Omni, a regra é a mesma: ele não aceita negative_prompt, e a edição de um clipe já gerado se pede com a frase "Keep everything else the same". No aleph2, que edita gravação real, a frase que segura a pessoa é "Keep the person, clothing, camera motion and timing exactly the same".
Prompt de vídeo em cinco camadas, pronto para a API
Escolha plano, câmera, luz, ação e áudio e copie o prompt e o JSON para o Veo ou para o fal.ai.
Construtor de prompt de vídeo em cinco camadas: plano, câmera, luz, ação e áudio, cada uma com uma lista de escolhas e um complemento livre, mais proporção (16:9 ou 9:16), duração e resolução. O laboratório monta o prompt em inglês e em português e o corpo JSON pronto para o Kling 3.0 Pro no fal.ai e para o Veo 3.1 Fast no Gemini API ou na Gemini Enterprise Agent Platform do Google Cloud (o antigo Vertex AI), com o custo estimado. O preview do Veo 3.1 sai do Gemini API em 22/10/2026; depois dessa data, o Veo segue na Agent Platform com o ID veo-3.1-fast-generate-001.
A demonstração interativa carrega quando este trecho entra na tela.
Manter o personagem e o cenário iguais entre clipes
O bloco base é o figurino que não muda entre as tomadas: cenário, paleta, lente, luz e personagem, injetados em toda cena. Na Cozinha da Rafa, o personagem gerado são só as mãos (pele morena, unhas curtas sem esmalte, um anel fino de prata, avental de linho azul-cobalto); o rosto da Rafa vem só de gravação real. Gerar o rosto de uma pessoa real exige autorização por escrito, específica e revogável, guardada no projeto, e os direitos de imagem estão na aula 25.
Além do texto, cada modelo aceita um número diferente de imagens e vídeos de referência. Os quadros-chave que servem de referência saem do storyboard com gpt-image-2.5-flare e gpt-image-2.5-sunburst, como mostra a aula 13. O mesmo cuidado de família visual aparece no curso Astra em construir uma coleção visual reconhecível e em editar uma imagem preservando as escolhas aprovadas.
Referências e negativos aceitos por modelo em 12/10/2026
| Modelo | Referências aceitas | Negativos e áudio |
|---|---|---|
| Veo 3.1 Standard e Fast | Até 3 imagens de referência; 9:16 nativo no Ingredients to Video | Campo negative_prompt; áudio nativo |
| Gemini Omni 1.1 Flash | Imagens e até 3 vídeos de 3 s; interpolação entre quadros-chave; papel de cada arquivo por tag | Sem negative_prompt; áudio nativo |
| MiniMax H3 e H3 Max | Primeiro e último quadro; até 9 imagens, 3 vídeos e 3 áudios | Negativos no texto; áudio estéreo |
| Seedance 2.5 | Imagens, vídeo e áudio em content[]; na Replicate, até 30 imagens, 10 vídeos e 10 áudios, citados como [Image1], [Video1] e [Audio1]; na Runware, frameImages não combina com referenceImages | Negativos no texto; fala sincronizada |
| Wan 3.0 | Primeiro quadro ou primeiro e último; até 10 imagens, 5 vídeos e 5 áudios | Negativos no texto; áudio nativo |
| Luma Ray 3.2 | Até 16 quadros-guia (keyframes) por clipe, segundo o anúncio do Ray3.2 | Sem áudio nativo na documentação |
| Runway gen4.5 e aleph2 | gen4.5 parte de uma imagem; aleph2 usa até 5 imagens como quadros-chave | Negativos no texto; gen4.5 sem áudio documentado |
O Kling 4.0 promete até 15 referências, entre elas referência de voz, mas em 12/10/2026 não tem id de API.
Quando dois clipes seguidos mostram o mesmo objeto, não descreva o objeto de novo: use o último quadro do primeiro como primeiro quadro do segundo. Extraia com o comando da aula 4, ffmpeg -sseof -0.1 -i midia/gerados/clips/c02.mp4 -update 1 -frames:v 1 midia/gerados/frames/c02_last.png, e aponte o arquivo no campo primeiro_quadro da cena seguinte. Na Replicate, o LTX 2.3 Fast nomeia esses campos como image e last_frame_image; o MiniMax H3 e o Wan 3.0 também aceitam o par de primeiro e último quadro.
Com referência de voz, o mesmo trecho entra em toda cena com fala, como bloco base do áudio; o Vidu Q4 Preview, com API desde 07/10/2026, aceita até 3 áudios de 3 a 12 s.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Gerar e validar os prompts por código
O JSON é a fonte da verdade: o bloco base mais um array cenas, cada uma com as cinco camadas, o modelo (chave do modelos.toml da aula 19), duração, resolução, proporção, referências e, quando houver, primeiro e último quadro. Exigir um formato fixo e conferi-lo por código é a mesma ideia de exigir formato de saída garantido em vez de torcer.
{
"base": {
"cenario": "the same small home kitchen in Recife, Brazil: white tiles with a cobalt-blue Portuguese pattern on the backsplash, light wood counter, a window on the left",
"paleta": "warm neutrals with cobalt-blue accents, no saturated reds except the guava",
"lente": "35mm lens, shallow depth of field",
"luz": "soft late-morning daylight from the window on the left, 4500K, gentle shadows, no artificial light",
"personagem": "only the cook's hands are visible: medium-brown skin, short unpainted nails, a thin silver ring on the right ring finger, sleeves of a cobalt-blue linen apron"
},
"cenas": [
{
"id": "c01",
"tipo": "produto",
"modelo": "veo31_fast_vertex",
"duracao_s": 8,
"resolucao": "1080p",
"proporcao": "9:16",
"referencias": ["storyboard/ref_c01.png", "storyboard/ref_maos.png"],
"shot": "Medium close-up, vertical 9:16, a rolled guava cake (bolo de rolo) on a white ceramic plate centered in the lower third",
"camera": "Slow push-in over 8 seconds, subtle handheld feel, ending with the cake filling most of the frame",
"light": "base",
"action": "The hands slice one thin spiral slice with a knife; the slice tips over slowly, revealing the thin red guava layers",
"audio": "A warm female voice says in Brazilian Portuguese: \"Bolo de rolo de verdade tem a massa fininha assim.\" Quiet kitchen room tone, a soft ceramic clink. No music. No on-screen text, no subtitles.",
"negative_prompt": "cartoon, distorted hands, extra fingers, text overlays, watermark, logo"
},
{
"id": "c02",
"tipo": "broll",
"modelo": "minimax_h3_max",
"duracao_s": 6,
"resolucao": "768p",
"proporcao": "16:9",
"referencias": ["storyboard/ref_c02.png"],
"shot": "Top-down shot of a rectangular baking tray on the light wood counter",
"camera": "[pan] slow lateral pan from left to right",
"light": "base",
"action": "A spatula spreads a very thin layer of pale cake batter across the tray, edge to edge",
"audio": "Soft scraping of the spatula. No music. No dialogue.",
"negative_prompt": "text, watermark, distorted hands"
},
{
"id": "c03",
"tipo": "broll",
"modelo": "replicate_seedance25",
"duracao_s": 5,
"resolucao": "720p",
"proporcao": "16:9",
"referencias": [],
"primeiro_quadro": "midia/gerados/frames/c02_last.png",
"ultimo_quadro": "storyboard/ref_c03_fim.png",
"shot": "Top-down shot of the same baking tray, now with a baked thin cake layer covered in melted guava paste",
"camera": "Static camera, no movement",
"light": "base",
"action": "The hands roll the thin cake layer into a tight spiral from the near edge to the far edge",
"audio": "Soft sticky sounds of the cake rolling. No music. No dialogue.",
"negative_prompt": "text, watermark, distorted hands"
}
]
}O script monta o texto de cada cena, tira a camada AUDIO quando o modelo não gera som, escreve os negativos no corpo quando o modelo não tem o campo e reprova a cena com camada faltando, referência inexistente ou ação contraditória ("enters" e "leaves" no mesmo clipe). A saída fica em storyboard/prompts/, um .txt e um .json por cena, e é isso que a aula 21 envia às APIs.
"""montar_prompt.py: monta o prompt de cinco camadas de cada cena de storyboard/cenas_video.json.
Grava storyboard/prompts/<id>.txt (texto que vai para a API) e storyboard/prompts/<id>.json
(modelo, duração, resolução, referências e quadros), que a aula 21 lê.
Uso: python scripts/montar_prompt.py (sai com código 1 se houver erro)
Nunca edite o .txt à mão: edite o JSON e rode de novo.
"""
import json
import os
import sys
import tomllib
with open("storyboard/cenas_video.json", encoding="utf-8") as f:
dados = json.load(f)
with open("config/modelos.toml", "rb") as f:
modelos = tomllib.load(f)
base = dados["base"]
CAMADAS = ["shot", "camera", "light", "action", "audio"]
# pares de verbos opostos que, juntos num clipe curto, confundem o modelo
OPOSTOS = [("enters", "leaves"), ("opens", "closes"), ("lifts", "drops"),
("walks in", "walks out"), ("sits down", "stands up")]
def bloco_de_papeis(c: dict) -> list[str]:
"""Sexto bloco, só no Omni: uma linha por arquivo, no formato da doc ([# Sources <FIRST_FRAME>@Image1]).
Image1, Image2... e Video1... seguem a ordem em que a aula 21 anexa os arquivos."""
linhas, n_img = [], 0
for tag, chave in (("FIRST_FRAME", "primeiro_quadro"), ("LAST_FRAME", "ultimo_quadro")):
if c.get(chave):
n_img += 1
linhas.append(f"[# Sources <{tag}>@Image{n_img}]")
refs = c.get("referencias", [])
imagens = [r for r in refs if not r.endswith(".mp4")]
videos = [r for r in refs if r.endswith(".mp4")][:3] # até 3 vídeos de até 3 s
for i, _ in enumerate(imagens):
n_img += 1
linhas.append(f"[# References <IMAGE_REF_{i}>@Image{n_img}]")
for i, _ in enumerate(videos):
linhas.append(f"[# References <VIDEO_REF_{i}>@Video{i + 1}]")
return linhas
os.makedirs("storyboard/prompts", exist_ok=True)
gerados, erros = 0, []
for c in dados["cenas"]:
cid = c["id"]
m = modelos.get(c["modelo"])
if m is None:
erros.append(f"{cid}: modelo {c['modelo']} não está em modelos.toml")
continue
faltam = [k for k in CAMADAS if not c.get(k)]
if faltam:
erros.append(f"{cid}: faltam as camadas {faltam}")
continue
acao = c["action"].lower()
for a, b in OPOSTOS:
if a in acao and b in acao:
erros.append(f"{cid}: ação contraditória ('{a}' e '{b}') no mesmo clipe")
# quadros em midia/gerados/ nascem do clipe anterior (aula 21); os do storyboard já precisam existir
arquivos = [c.get("primeiro_quadro"), c.get("ultimo_quadro"), *c.get("referencias", [])]
for caminho in filter(None, arquivos):
if not caminho.startswith("midia/gerados/") and not os.path.exists(caminho):
erros.append(f"{cid}: arquivo de referência ausente: {caminho}")
luz = base["luz"] if c["light"] == "base" else c["light"]
linhas = [
f"SHOT: {c['shot']}, {base['lente']}. Setting: {base['cenario']}. Palette: {base['paleta']}.",
f"CAMERA: {c['camera']}. Continuous take, no cuts.",
f"LIGHT: {luz}.",
f"ACTION: {c['action']}. Character: {base['personagem']}.",
]
if m.get("audio", False):
linhas.append(f"AUDIO: {c['audio']}") # modelo sem áudio: a camada sai inteira
# modelo sem campo negative_prompt: os negativos vão escritos no corpo do texto
if not m.get("negative_prompt", False) and c.get("negative_prompt"):
linhas.append(f"Avoid: {c['negative_prompt']}.")
if m["provedor"] == "gemini":
linhas += bloco_de_papeis(c) # Omni: tags de papel depois das cinco camadas
prompt = "\n".join(linhas)
if len(prompt) > 1800:
erros.append(f"{cid}: prompt com {len(prompt)} caracteres; encurte o base ou a ação")
with open(f"storyboard/prompts/{cid}.txt", "w", encoding="utf-8") as f:
f.write(prompt + "\n")
meta = {
"id": cid, "chave_toml": c["modelo"], "modelo": m["id"], "provedor": m["provedor"],
"duracao_s": c["duracao_s"], "resolucao": c["resolucao"],
"proporcao": c.get("proporcao", "16:9"), "referencias": c.get("referencias", []),
"primeiro_quadro": c.get("primeiro_quadro"), "ultimo_quadro": c.get("ultimo_quadro"),
"negative_prompt": c.get("negative_prompt", "") if m.get("negative_prompt") else "",
}
with open(f"storyboard/prompts/{cid}.json", "w", encoding="utf-8") as f:
json.dump(meta, f, ensure_ascii=False, indent=2)
gerados += 1
print(f"{gerados} prompts gerados em storyboard/prompts/")
for e in erros:
print("ERRO:", e, file=sys.stderr)
sys.exit(1 if erros else 0)Se o modelo não aceita negative_prompt, escreva os negativos no corpo e nunca envie o campo. Se a revisão apontar diferença grave em um só clipe, regenere só ele com mais uma referência (até 3 no Veo, até 9 no MiniMax H3). Se dois ou mais clipes erram a mesma coisa, o problema está no bloco base: corrija lá e regenere só as cenas afetadas. A revisão quadro a quadro com a visão do Claude segue a rubrica da aula 11, com uma linha a mais para o continuísta: cor do azulejo, cor da bancada, lado da janela e anel das mãos.
Prompt por modelo: tamanho do texto e papel de cada arquivo no Omni
Ajustar o tamanho do prompt ao modelo
As cinco camadas são o esqueleto; o tamanho do texto muda com o modelo. Na biblioteca do Vibehub Academy (309 prompts de vídeo testados), o Seedance 2.5 tem em média 386 palavras por prompt e o Grok Imagine, 43. Para o Seedance, escreva uma lista de planos com tempo: blocos de cerca de 1,2 s com ação, reação e movimento de câmera, de 300 a 400 palavras num clipe de 10 s. Para o Grok Imagine, uma frase de cerca de 40 palavras com sujeito, ação e câmera; desde 01/10/2026, a versão 1.5 Lite custa US$ 0,03 por segundo em 720p na Runway.
Três regras valem para qualquer tamanho: um verbo de câmera por plano, o que a câmera não faz ("the camera does not move") e duração curta. Para variações de um produto sem perder a identidade, use o plano-sequência de transformação: o objeto fica sempre visível e em foco, a câmera orbita em velocidade constante e só a embalagem ou o estilo troca em cadeia. Está pronto quando o prompt passa pela lista abaixo.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Conferir o prompt antes de enviar
Os quatro primeiros elementos estão presentes na maioria dos prompts testados; os cinco seguintes entram conforme a cena.
Passo 1: Um verbo de câmera por plano e o que a câmera não faz (61%)
Passo 2: Estilo ou película nomeado no bloco base (60%)
Passo 3: Restrição negativa, no corpo ou no campo negative_prompt (55%)
Passo 4: Duração em segundos, aceita pelo modelo no TOML (54%)
Passo 5: Cortes ou sequência de planos, ou Continuous take, no cuts (47%)
Conforme a cena.
Passo 6: Referência ou personagem do bloco base (38%)
Conforme a cena.
Passo 7: Áudio: ambiente e negativos de som (36%)
Conforme a cena.
Passo 8: Proporção no texto quando o modelo não tem o campo (33%)
Conforme a cena.
Passo 9: Fala entre aspas, só em modelo que gera som (26%)
Conforme a cena.
No fim você tem: Um prompt com os elementos que a cena pede antes de gastar crédito na API.
Dizer ao Omni o papel de cada arquivo
Quando a cena vai para o Gemini Omni com mais de um arquivo, o modelo precisa saber qual imagem abre o clipe, qual fecha e qual é só referência. A doc do Omni resolve isso com tags de papel: <FIRST_FRAME> e <LAST_FRAME> para os quadros de início e fim, <IMAGE_REF_N> e <VIDEO_REF_N> para as referências (N começa em 0), sob os cabeçalhos [# Sources ...] e [# References ...]. É um sexto bloco, escrito depois das cinco camadas, e a função bloco_de_papeis do script acima o gera quando o provedor da cena é gemini. Desde 27/08/2026 o Omni 1.1 está em GA no Gemini API.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Está certo quando o .txt de uma cena do Omni termina com as linhas de papel, na ordem em que a aula 21 envia os arquivos, e o de outro provedor sai sem elas. Não escreva as tags à mão: uma referência numerada sem arquivo enviado confunde o modelo, e o script numera a partir do JSON.

Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Gerar os prompts de uma peça com o personagem consistente
Passo 1: Escreva o bloco base em storyboard/cenas_video.json
Cenário, paleta, lente, luz e personagem, em inglês.
Deu certo quando: O bloco tem as cinco chaves e cabe em 80 palavras.
Erro comum: Pôr a ação no base; a ação muda a cada cena.
Passo 2: Preencha as cinco camadas de cada cena
Deu certo quando: Cada cena tem shot, camera, light, action e audio, com uma única ação.
Erro comum: Duas ações no mesmo clipe de 6 s.
Passo 3: Aponte as referências que existem em storyboard/
Deu certo quando: Cada caminho em referencias abre uma imagem, e nenhuma cena do Veo passa de 3.
Erro comum: Pedir texto dentro do quadro-chave; o texto entra na montagem.
Passo 4: Rode python scripts/montar_prompt.py
Deu certo quando: A saída diz 3 prompts gerados em storyboard/prompts/ e não há linha ERRO.
Erro comum: Editar o .txt à mão; a próxima rodada apaga a mudança.
Passo 5: Gere o primeiro clipe e extraia o último quadro
Deu certo quando: midia/gerados/frames/c02_last.png existe e mostra a forma inteira, sem desfoque de movimento.
Erro comum: Extrair em 4K e mandar ao Claude sem reduzir; um quadro de 3840x2160 vira 4784 tokens.
Passo 6: Use o último quadro como primeiro quadro da cena seguinte
Deu certo quando: Na transição de c02 para c03, a forma, a bancada e a luz não saltam.
Erro comum: Misturar frameImages com referenceImages no Seedance pela Runware; o guia do modelo diz que não combinam.
Passo 7: Corrija só a cena reprovada no JSON
Deu certo quando: python scripts/custo.py soma só a cena regenerada ao gasto da semana.
Erro comum: Regenerar a peça inteira para garantir e estourar o teto.
No fim você tem: Prompts gerados por código, referências certas por modelo e clipes que continuam um do outro.
Guia prático: variações de gancho sem perder o personagem
Anúncio 9:16 vive dos dois primeiros segundos, e testar ganchos costuma quebrar a consistência que a aula construiu. Este guia mostra como gerar três aberturas para a mesma cena mexendo só em ACTION e CAMERA, com o bloco base intacto, e como alongar um plano com a extensão do Gemini Omni em vez de encadear dois clipes. Você sai com o storyboard/ganchos.json, o scripts/variar_gancho.py e três variantes prontas para o teste da aula de publicação.
Funções, casos de uso e aplicações
Funções
Recursos para variar a cena sem mudar o personagem
| Função ou recurso | O que faz | Quando usar | Desde |
|---|---|---|---|
| Tarefa extend do gemini-omni-1.1-flash | Acrescenta de 3 a 10 s ao fim do clipe, até 40 s no total; o vídeo enviado tem até 10 s | Plano contínuo longo, como a massa sendo enrolada, sem o salto de um encadeamento | 27/08/2026 |
| Extensão de vídeo enviado com fala | Vídeo enviado em que alguém fala não ganha fala nova; personagem calado pode continuar | Gravação real da Rafa falando: estenda só planos sem fala ou gere a fala no clipe do próprio modelo | 27/08/2026 |
| Nano Banana 2.1 (gemini-nano-banana-2.1) | Modelo de imagem do Gemini API em disponibilidade geral (GA) | Folha de personagem: as mãos e o avental em quatro ângulos, como referência | 06/10/2026 |
| Nano Banana 2.1 na Runway (nano_banana_2.1) | Até 14 imagens de referência, saída de 1K a 4K, de 4 a 12 créditos por imagem | Quando a folha de personagem precisa herdar muitas fotos reais de produto e cenário | 06/10/2026 |
| GPT Image 2.5 na Runway (gpt_image_2_5_flare, gpt_image_2_5_sunburst) | Até 16 referências e até 10 saídas, mais um crédito por referência | Gerar os quadros-chave das variantes de gancho de uma vez, com as mesmas referências | 08/09/2026 |
| negative_prompt do Veo na Runway | Campo opcional para veo3, veo3.1 e veo3.1_fast em texto e imagem para vídeo | Quando a cena do Veo sai pela Runway: os negativos ficam no campo próprio, fora do corpo do prompt | 10/07/2026 |
Casos de uso
Marcos, gestor de tráfego de uma confeitaria artesanal em Salvador
Marketing digital
Dor
Cada gancho novo do anúncio vinha com outra bancada e outras mãos, e o teste media o cenário em vez da abertura.
Solução
Mantém o bloco base, escreve três ganchos em storyboard/ganchos.json (corte da fatia, close na espiral, mão polvilhando açúcar) e gera só as três aberturas de 4 s.
Resultado
Observar, depois de sete dias de veiculação, qual abertura segura mais gente nos três primeiros segundos; as três devem ser idênticas em cenário na revisão de quadros.
Custo apurado: Três aberturas de 4 s no modelo do TOML, em vez de três vídeos inteiros.
Cenário construído para fins didáticos. Números não correspondem a cliente específico.
Professora de um curso técnico de gastronomia em Fortaleza
Educação
Dor
O passo de enrolar a massa precisa de 20 s contínuos para a aula, e dois clipes encadeados mostram um salto no meio.
Solução
Gera 8 s no Omni e pede duas extensões com a tarefa extend, com o mesmo prompt da cena e sem fala no clipe.
Resultado
Na revisão de quadros, conferir se o ponto de emenda some; se a cor da massa mudar na segunda extensão, regenere só ela.
Cenário construído para fins didáticos. Números não correspondem a cliente específico.
Na prática
O script copia a cena escolhida em variantes c01a, c01b e c01c, troca só action e camera e deixa shot, light, audio, referências e bloco base iguais. Depois, o montar_prompt.py e o custo.py da aula seguem valendo sem mudança.
"""variar_gancho.py: cria variantes de uma cena com ganchos diferentes nos primeiros segundos.
storyboard/ganchos.json: {"cena": "c01", "duracao_s": 4, "ganchos": [{"action": "...", "camera": "..."}]}
Uso (na raiz video-ia): python scripts/variar_gancho.py"""
import copy
import json
from pathlib import Path
ARQ = Path("storyboard/cenas_video.json")
dados = json.loads(ARQ.read_text(encoding="utf-8"))
pedido = json.loads(Path("storyboard/ganchos.json").read_text(encoding="utf-8"))
base = next(c for c in dados["cenas"] if c["id"] == pedido["cena"])
# remove variantes antigas da mesma cena para a rodada ser repetível
dados["cenas"] = [c for c in dados["cenas"] if not c["id"].startswith(base["id"]) or c is base]
for letra, g in zip("abcde", pedido["ganchos"]):
v = copy.deepcopy(base)
v["id"] = base["id"] + letra
v["action"], v["camera"] = g["action"], g["camera"] # só o gancho muda
v["duracao_s"] = pedido.get("duracao_s", base["duracao_s"])
v["variante_de"] = base["id"] # rastreio para o relatório do teste
dados["cenas"].append(v)
print(f"{v['id']}: {g['action'][:70]}")
ARQ.write_text(json.dumps(dados, ensure_ascii=False, indent=2), encoding="utf-8")
print("Agora rode: python scripts/montar_prompt.py && python scripts/custo.py")Do gancho escrito à variante pronta para teste
Passo 1: Escreva três ganchos que diferem só no que acontece e no movimento
Deu certo quando: Os três cabem numa linha cada e citam o mesmo objeto do bloco base.
Erro comum: Mudar a luz junto com o gancho; o teste deixa de isolar a abertura.
Passo 2: Rode o variar_gancho.py, o montar_prompt.py e o custo.py
Deu certo quando: Aparecem c01a.txt, c01b.txt e c01c.txt em storyboard/prompts/ e o TOTAL cabe no teto.
Passo 3: Gere as três aberturas e revise com a linha do continuísta
Azulejo, bancada, lado da janela e anel das mãos iguais nas três.
Deu certo quando: Nenhuma variante reprovada por cenário.
Passo 4: Monte cada abertura com o mesmo restante do vídeo
Deu certo quando: Três arquivos que só diferem nos primeiros segundos, prontos para o teste de Reels da aula 24.
Armadilhas
Mude uma camada por vez
Uma variante de gancho só mede a abertura se o resto da cena for idêntico às outras.
- Bloco base, luz e referências iguais em todas as variantes
- Extensão do Omni só acrescenta ao fim do clipe
- Gravação real com fala não ganha fala nova pela extensão
- Folha de personagem gerada entra como referência, nunca como rosto real
O teste: Ponha os primeiros quadros das três variantes lado a lado: só a ação muda.
alexandrecaramaschi.com/educacao/frontends-com-vibecoding
Na Cozinha da Rafa, a primeira rodada do bolo de rolo voltou com a cena c03 numa bancada cinza, contra a madeira clara da referência. A correção foi uma frase no shot de c03, "light wood counter visible at the bottom of the frame", e o uso de c02_last.png como primeiro quadro. Só c03 foi regenerada, por US$ 1,16 no Seedance 2.5 em 720p, e as outras quatro cenas ficaram como estavam.
Glossário rápido
cinco camadas
Estrutura do prompt de vídeo em SHOT, CAMERA, LIGHT, ACTION e AUDIO, na ordem em que um set de filmagem decide cada coisa.
bloco base
Trecho fixo de cenário, paleta, lente, luz e personagem que todas as cenas da peça herdam, como o figurino que não muda entre as tomadas.
negative_prompt
Campo separado com o que o modelo deve evitar; o Veo 3.1 aceita, o Gemini Omni não, e nesse caso os negativos vão escritos no corpo do prompt.
imagem para vídeo (I2V)
Geração que parte de uma imagem dada como primeiro quadro, em vez de partir só do texto (T2V).
primeiro e último quadro
Par de imagens que fixa onde o clipe começa e onde termina; o modelo inventa só o movimento entre os dois.
encadeamento pelo último quadro
Usar o quadro final de um clipe como primeiro quadro do clipe seguinte, para que objeto, cor e posição continuem iguais.
Escreva hoje o bloco base da sua cozinha (ou do seu cenário) e três cenas no storyboard/cenas_video.json, rode python scripts/montar_prompt.py e gere a primeira cena. Está pronto quando o script sai sem ERRO, cada .txt tem as camadas certas para o modelo da cena e dois clipes seguidos mostram o mesmo cenário sem salto de cor ou de posição.
Seu caderno neste capítulo
Abrir o caderno completoSelecione um trecho do capítulo para destacar ou anotar. Nos vídeos e áudios, use Anotar este momento. No teclado, selecione com Shift e as setas e use Alt+Shift+D para destacar ou Alt+Shift+N para anotar.
Salvo neste navegador. Entre na sua conta para levar o caderno a outros aparelhos.
Entre na sua conta para compartilhar o que aprendeu e convidar alguém para estudar com você.
Conexões deste capítulo
Veja o que estudar antes e para onde seguir depois, explore os conceitos e compare abordagens em outros cursos. Sugestões marcadas como “sugerido pelo grafo” vêm dos assuntos em comum, não do índice do curso.
Estude antes
- CursoClaude Code CLI: Programação com IA
- CursoAstra profundosugerido pelo grafoA quinta parte do Astra planeja o vídeo e edita o material bruto com o modelo dirigindo a ferramenta. O curso de vídeo com IA aprofunda esse trabalho com Claude Code, Codex e ElevenLabs, do roteiro à publicação. O grafo já sugeria esta ordem pela regra de entrada da trilha; com a ordem anterior curada, ela passa a ser declarada (Etapa 4, wave 3).
- CursoSetup Completo: do zero ao Claude Codesugerido pelo grafo7 capítulos de “Vídeo com IA: Claude Code, Codex e ElevenLabs” usam conceitos apresentados em “Setup Completo: do zero ao Claude Code”.
Depois, siga para
- CursoFrontends com Vibecodingsugerido pelo grafo21 capítulos de “Frontends com Vibecoding” usam conceitos apresentados em “Vídeo com IA: Claude Code, Codex e ElevenLabs”.
- CursoDo Agile ao Agentic Operating Modelsugerido pelo grafo5 capítulos de “Do Agile ao Agentic Operating Model” usam conceitos apresentados em “Vídeo com IA: Claude Code, Codex e ElevenLabs”.
- CursoAgentes de IA Autônomos: Do Conceito à Produçãosugerido pelo grafo7 capítulos de “Agentes de IA Autônomos: Do Conceito à Produção” usam conceitos apresentados em “Vídeo com IA: Claude Code, Codex e ElevenLabs”.
- CursoLLM FinOps: o custo da IA para quem assina o orçamentosugerido pelo grafo4 capítulos de “LLM FinOps: o custo da IA para quem assina o orçamento” usam conceitos apresentados em “Vídeo com IA: Claude Code, Codex e ElevenLabs”.
Conceitos deste capítulo
O mesmo assunto em outros cursos
Voltar ao capítulo anterior: Escolher o modelo de vídeo certo para cada peça
Leve uma ideia para a prática
Escolha uma atividade no painel e volte a este curso quando quiser.
Atividades e evolução ficam reunidas no painel da sua conta.
Laboratórios ao vivo deste curso
Cada laboratório monta a biblioteca real dentro da aula, com controles para você mexer e o código do exemplo para copiar. O texto de reserva descreve a demonstração para quem lê sem JavaScript. O link abre o capítulo já no ponto do laboratório.
MediaRecorder, Canvas 2D e Long Animation Frames (plataforma)
Grave a cena em tempo real e veja os quadros que se perdem
Suba as partículas, force um bloqueio de 300 ms e grave seis segundos; compare com o render quadro a quadro desta aula.
Pacote
Abrir no capítuloMontar vídeo em HTML com HyperFrames e escolher entre ele e o Remotionsem pacoteMotion
Ver agentes em paralelo trocando mensagens numa linha do tempo
Reproduza a cena, percorra o tempo pelo controle e compare o tempo de parede com a soma das barras de cada agente.
Pacote
Abrir no capítuloParalelizar cenas com subagentes sem estourar o limite das APIsmotionReact (sem dependência extra), com as APIs do Veo e do fal.ai
Prompt de vídeo em cinco camadas, pronto para a API
Escolha plano, câmera, luz, ação e áudio e copie o prompt e o JSON para o Veo ou para o fal.ai.
Pacote
Abrir no capítuloEscrever prompt de vídeo em cinco camadas e manter o personagem consistentereactReact (sem dependência extra), com o comando para o FFmpeg
Corte o vídeo apagando palavras da transcrição
Aperte as palavras para removê-las, ligue a remoção de pausas e copie o comando FFmpeg e a legenda SRT gerados.
Pacote
Abrir no capítuloRemover pausas e reenquadrar o vídeo de 16:9 para 9:16 com legenda por palavrareactReact (sem dependência extra)
Quanto custa cada etapa do seu pipeline de vídeo
Troque a ferramenta de cada etapa e o percentual de b-roll e veja qual etapa pesa no custo por minuto e por vídeo.
Pacote
Abrir no capítuloOrquestrar o pipeline com etapas idempotentes e teto de gastoreact
Capítulos vizinhos em Vídeo com IA: Claude Code, Codex e ElevenLabs
- 18Dublar o vídeo e compor trilha e efeitos com licença registrada
- 19Escolher o modelo de vídeo certo para cada peça
- 20Escrever prompt de vídeo em cinco camadas e manter o personagem consistente
- 21Chamar Veo, Kling, Seedance e Runway por API com polling e custo controlado
- 22Remover pausas e reenquadrar o vídeo de 16:9 para 9:16 com legenda por palavra