O que Handmade Stage Film faz?
Noite de Halloween, nada na TV: uma garota com um corte chanel preto senta dentro de um sofá de papelão pintado, bebida rosa na mão, e clica no controle remoto de papelão. A TV de papelão liga com chiado, um pequeno fantasma dança na tela, depois sai dela e flutua para longe. Ele paira perto do copo dela (
"Queria um gole." ), pousa na mesa xadrez onde um garfo gigante esfaqueia um prato de frutas pintadas ("Gardênia. Frutas. Iogurte."), e um gole depois ela está sentada em um chapéu de bruxa gigante enquanto estrelas explodem ao seu redor ("...magia total."). O copo ganha um close-up com um rabisco "Água Mágica Bonita" e uma seta, e o último cartão tem o logotipo, o copo, o fantasma, "Edição Halloween" e onde está à venda. Cada quadro vem das sete fotos de campanha da própria marca.
É feito em quatro partes:
scripts/generate.mjstransforma os stills nas peças: keyframes 9:16 (Nano Banana 2 pinta a extensão extra, os pixels originais voltam por cima), clipes Kling, adereços recortados, rótulos recolocados e o logotipo.scripts/reel.mjscorta os clipes em um único rolo no ritmo do filme.scripts/sfx.mjssintetiza o som: uma valsa de caixa de música original e um som em cada evento.scripts/render.mjsreproduz tudo como um show de palco: movimento escalonado a 12 quadros por segundo, tremor de câmera na mão, granulação em movimento, fantoches, legendas em papel rasgado, tags com setas, uma tela de TV que liga e o último cartão. Renderiza localmente com headless Chrome e FFmpeg.
Configuração (uma vez por máquina)
Execute dentro da pasta desta Skill:
npm install
Isso instala puppeteer-core e ffmpeg-static. O Google Chrome deve estar instalado, ou defina CHROME_PATH para um executável Chrome/Chromium (npx @puppeteer/browsers install chrome-headless-shell@stable mostra um).
O material precisa de uma chave de API para Nano Banana 2 e Kling 2.5 Turbo; os scripts os chamam através de um gateway de API de modelo, onde a chave é criada (https://fal.ai/dashboard/keys). O usuário a define em seu próprio terminal como FAL_KEY (por exemplo, em seu perfil de shell). Nunca peça para colar a chave no chat e nunca a imprima.
Custo
Uso do modelo, faturado na sua própria chave de API: $0.08 para cada still estendido para 9:16 (e cada edit), $0.35 para cada clipe de 5 segundos e uma fração de centavo para cada recorte (preços de outubro de 2026). Um filme de sete stills com cinco clipes custa cerca de $2.30. O rolo, os fantoches, as legendas, o som e o MP4 final são feitos gratuitamente em sua máquina. Informe o custo ao usuário antes de gerar.
O que o faz funcionar
- Suas próprias fotos, intocadas onde importa. A extensão e cada clipe começam a partir dos stills reais da marca;
extendcoloca os pixels originais de volta sobre a versão da IA, erelabelcoloca um rótulo nítido de volta em qualquer quadro onde o clipe o borrou. - Uma história, não um slideshow. Planeje um pequeno enredo entre as fotos, com uma coisa que viaja entre elas (aqui um fantasma fantoche que escapa de uma TV). As legendas são pequenos beats da história, não slogans.
- Desajeitado de propósito. Tudo se move em passos de 1/12 s com um pequeno tremor, fantoches balançam em suas teclas, legendas aparecem em três passos e setas desenham em três traços. Não alise.
- Metade produto, metade marca. O produto está na maioria das fotos e ganha um close-up com uma tag; o último cartão é o logotipo, o produto, o nome e onde comprar.
Fluxo de trabalho
- Colete 4–8 stills de uma única sessão de fotos (3:4, 4:5 ou 9:16), o nome do produto, uma linha (sabores, materiais), uma nota ("Edição Halloween") e o CTA. Pergunte se os stills têm um logotipo ou selo impresso na parte inferior (ele é pintado para fora dos quadros e removido para o último cartão).
- Roteiro (mostre antes de gerar): a ordem das fotos, o enredo, o que se move em cada clipe (uma ou duas pequenas ações, o produto mantido parado), quais adereços recortar como fantoches e o que eles fazem, as legendas e as tags, e o custo. Mantenha-o em 15–20 s.
- Keyframes:
node scripts/generate.mjs extend --in still.jpg --out keys/<foto>.png --cover <linhas>para cada still que não seja 9:16 (--cover= a altura em pixels da faixa do logotipo impresso na parte inferior do original, se houver). Veja cada um em tamanho real: se o modelo deixou um objeto espelhado ou duplicado nas novas faixas, cubra-o com textura lisa da mesma foto. - Teste: um clipe, a foto com o gancho da trama:
node scripts/generate.mjs clip --start keys/<foto>.png --prompt "…" --out clips/<foto>.mp4. O prompt nomeia apenas o que se move ("ela pressiona um botão no controle remoto com o polegar; o copo permanece ereto e parado"); um sufixo fixo mantém a câmera travada e o cenário, rosto e produto inalterados. Mostre-o e então faça o resto. - Clipes para as outras fotos em movimento. Assista cada um quadro a quadro: anote onde a ação termina (para colocar o som e os fantoches nela) e onde o texto pequeno no produto borra. Corrija rótulos com
relabel --clip … --key keys/<foto>.png --box x,y,w,h(a caixa do rótulo no keyframe), ou use apenas os quadros antes do produto se mover. Um clipe não é necessário para todas as fotos: um still close-up com um zoom lento (still,box,boxTo) geralmente é melhor para o produto. - Adereços:
cutout --in keys/<foto>.png --box x,y,w,h --out props/<nome>.pngpara cada fantoche (um personagem, estrelas, uma flor, uma baga, o produto em uma mão);editpara um prato com algo removido (uma tela de TV sem seu fantasma). O logotipo:wordmark --in still.jpg --box x,y,w,h --out props/wordmark.png. O fundo do último cartão é um recorte de uma parede pintada de um dos keyframes. - Construa
effect.jsona partir deexamples/example.json(veja Fotos e o último cartão), entãonode scripts/reel.mjs effect.json --out reel.mp4e defina"reel": "reel.mp4". - Som:
node scripts/sfx.mjs effect.json --out stage.m4a, então"music": "stage.m4a". Execute novamente após qualquer alteração no tempo.--no-bed --music track.mp3substitui a valsa por uma faixa que o usuário tem licença para usar. - Valide:
node scripts/validate.mjs effect.json— corrija todos os erros e leia os avisos para o usuário. - Rascunho:
node scripts/render.mjs effect.json --quality draft --width 540 --out draft.mp4, e verifique um quadro de cada foto: nenhuma legenda, tag ou fantoche sobre um rosto ou o produto, tudo fora dos 14% direitos onde os botões da plataforma ficam. - Final:
node scripts/render.mjs effect.json --out film.mp4 --poster poster.png. Para Xiaohongshu, corte uma versão 3:4:ffmpeg -i film.mp4 -vf crop=720:960:0:160 -c:a copy film-3x4.mp4(na largura padrão de 720; verifique se nada importante está no topo ou nos 160 px inferiores).
Fotos
Todas as posições estão em pixels de quadro 1080 × 1920. Cada foto é uma de:
- Uma foto de clipe:
clip(o arquivo do qual reel.mjs corta),frometo(segundos no clipe),speed(0.5 = metade da velocidade, que com a reprodução em 12 passos usa cada quadro de um bom trecho curto),hold(segundos que o primeiro quadro segura antes de se mover). - Uma foto still:
still(uma imagem),len,boxeboxTo([x, y, width]janelas 9:16 nos pixels da imagem; a visão se move de uma para a outra).
Cada foto pode ter:
captions:{ "text", "at", "out", "x", "y", "rot", "size" }— pedaços de papel rasgado com palavras escritas à mão;\nquebra uma linha.tags:{ "text", "at", "x", "y", "to": [x, y], "ink": "dark" | "light", "rot", "size" }— palavras escritas à mão com uma seta que se desenha parato.puppets:{ "image", "path": [[t, x, y, width, rotation], …], "sound", "exit", "flip", "wobble" }— um recorte movido entre suas teclas (t em segundos na foto, x e y seu centro). Uma tecla com largura 0 e então uma largura total um passo depois é um pop. Ele segura sua última tecla a menos que"exit": true.soundtoca em sua primeira tecla.screen:{ "rect": [x, y, w, h], "off", "static", "plate", "plateAt" }— uma tela de TV ou telefone que fica preta atéoff, chiado atéstatic, e mostraplate(o mesmo keyframe com a tela esvaziada) a partir deplateAt, para que um fantoche possa escalar para fora dela.sounds:[[t, "kind"], …]—click,tvon,static,ghost,boing,tap,pop,whoosh,land,stab,sip,sparkle,chime,paper,scribble,cut. Cortes, legendas, tags, telas e fantoches com umsoundobtêm os seus automaticamente.
O último cartão
end: len, bg (uma parede pintada 9:16), wordmark (wordmarkY, wordmarkWidth), name (nameY, nameSize), line (lineY), note em um pedaço de papel (noteX, noteY), cta em uma pílula (ctaY), e puppets como os de uma foto (o produto em uma mão deslizando da borda, o personagem, estrelas). Cada um tem um tempo …At.
Campos
| Campo | Obrigatório | Notas |
|---|---|---|
reel | sim | caminho para um arquivo de vídeo, relativo ao arquivo JSON — cada clipe de foto cortado em um rolo 9:16 silencioso por scripts/reel.mjs (reel.mp4) |
shots | sim | lista de 2 a 10 entradas: clip, from, to, speed, hold, still, len — o filme em ordem: fotos de clipe (um clipe de IA de um dos seus stills) e fotos still (um still com um movimento lento); veja SKILL.md, Fotos |
end.bg | não | caminho para uma imagem, relativo ao arquivo JSON — o fundo do último cartão: uma parede pintada ou cenário de suas fotos, 9:16 |
end.wordmark | não | caminho para uma imagem, relativo ao arquivo JSON — seu logotipo em fundo transparente (scripts/generate.mjs wordmark) |
end.name | não | texto, abaixo de 4 palavras — o nome do produto, escrito à mão no último cartão |
end.line | não | texto, abaixo de 6 palavras — uma pequena linha abaixo do nome, por exemplo os sabores |
end.note | não | texto, abaixo de 4 palavras — em um pedaço de papel rasgado, por exemplo "Edição Halloween" |
end.cta | não | texto, abaixo de 12 palavras |
music | não | caminho para um arquivo de áudio, relativo ao arquivo JSON — a trilha sonora de scripts/sfx.mjs (stage.m4a) |
palette | não | cores como #RRGGBB; chaves: ink (legendas e tags escuras), paper (os pedaços de papel e tags claras) e accent (a pílula CTA) |
Dicas
- Escreva os prompts dos clipes de forma enxuta: uma ou duas pequenas ações, um rosto inexpressivo, "o copo permanece ereto e parado, rótulo voltado para a câmera". Gestos grandes borram rostos e rótulos.
- O Kling escolhe seu próprio tempo: observe onde a ação termina e coloque o clique, o corte e os fantoches naquele quadro, não em um número redondo.
- Dê à história um viajante: um fantoche cortado de uma foto que aparece nas próximas fotos une sete stills em um filme.
- Corte fantoches das próprias fotos, não de novas artes: a mesma tinta, papel e luz os fazem pertencer.
- Mantenha as legendas em três ou quatro palavras; as imagens contam a maior parte.
Saída
H.264 MP4, 1080 × 1920, 30 fps (a imagem se move em 12 passos por segundo), 15 a 20 segundos com o som, mais um quadro de pôster (PNG).