Uma arte de referência virou um Short com cenas do Kling, voz do ElevenLabs, lipsync e publicação, sem ninguém abrir editor de vídeo.

Este projeto conta como um agente de IA (o Claude Code) produziu um vídeo promocional de 15 segundos do INEMA.CLUB no estilo UGC, aquele vídeo "de gente real falando com a câmera" das redes sociais. Serve para quem cria conteúdo e quer delegar a produção a um agente. Mostra a ideia, os passos com os comandos usados, as dicas que fizeram diferença e os problemas que apareceram no caminho. Para repetir, você precisa de assinatura do Kling AI, uma conta ElevenLabs, ffmpeg, Python e um navegador logado no Kling.
O pedido foi uma frase: "quero um vídeo promocional do INEMA de 15 segundos, use o Kling para mostrar o que temos no inema.club usando esta imagem como referência, e depois uma voz do ElevenLabs em português". O agente planejou, mostrou o custo, esperou o ok e produziu.
O vídeo saiu da assinatura Pro do Kling, pela CLI oficial. Custo: 120 créditos pelas cenas e 10 pelo lipsync, de um saldo de 7.936.
O Lip Sync do Kling só existe no site. O agente abriu um navegador já logado, enviou as cenas e baixou o resultado sozinho.
Cada etapa foi checada: transcrição da voz, folha de quadros do vídeo, quadro 0 com o gancho e duração de 15 s exatos.

• Formato 9:16, depois de perguntar (Reels e Shorts).
• Pedir ao Kling cenas sem texto, porque ele deforma letras, e pôr os textos por cima, nítidos.
• Roteiro curto, com o ganho na primeira frase: "Aprenda inteligência artificial na prática, de graça".
• Voz feminina brasileira do catálogo do ElevenLabs (Amanda Kelly).
• Trilha local, sem direito autoral de terceiros.
O que precisou de ok: gastar créditos, usar a API do ElevenLabs e publicar no YouTube.
Oito etapas. Só a primeira e a de publicação precisaram de uma pessoa: para dizer o formato e dar o ok.
kling omni_ref_video com a arte como referência: 15 s, 9:16, 1080p, sem áudio, três tomadas. Uma chamada.
ElevenLabs eleven_multilingual_v2, velocidade 1,12, 13,3 s. Conferida pelo Whisper local.
Python + Pillow desenham 450 quadros PNG, cada texto entrando na palavra falada.
Cenas de frente passam pelo Lip Sync do site; o ffmpeg junta tudo, tira a marca d'água e nivela o som.
A principal: use a sua assinatura e dê ao agente a capacidade de operar o site quando a ferramenta não tem CLI.
O Kling tem CLI oficial (kling) que usa os créditos do seu plano. Sem chave de API, sem cobrança separada. O agente roda kling account antes e depois para medir o custo real.
Lip Sync, avatar e outras funções só existem no site. Um Chromium com o seu login, aberto com --remote-debugging-port, deixa o agente enviar arquivos e clicar pelo Playwright.
Gerador de vídeo deforma letras. Peça "no text, no letters, no logos" e escreva os textos depois, por cima.
No image_to_video o vídeo herda o formato da imagem (1:1). Para 9:16 a partir de uma arte quadrada, use omni_ref_video com --aspect_ratio 9:16.
15 s comportam cerca de 30 palavras. Enxugue o texto e use a velocidade nativa da voz (1,1 a 1,15), em vez de acelerar o áudio depois.
Uma cena de 5,08 s custa 10 créditos; cortada em 5,0 s, custa 5.
O primeiro quadro já mostra a promessa ("Aprenda IA na prática", "Acesso grátis"). Quem rola o feed decide ali.
Grave o retorno de cada envio (o generationId) em arquivo antes de seguir. Trabalho pago perdido não volta.
Tudo isto aconteceu de verdade nesta produção. Cada linha diz o problema e a menor correção que resolveu.
crop=1012:1800:34:0).mp3_44100_192 só no plano Creator. Correção: mp3_44100_128.Tudo roda na sua máquina. O agente usado foi o Claude Code, mas os scripts são comuns e funcionam à mão.
Plano pago e a CLI oficial, logada.
npm i -g @klingai/cli-global kling login kling account
Conta com chave de API para a narração.
export ELEVENLABS_API_KEY=...Chromium com o seu login do Kling e porta de depuração; Playwright só como biblioteca.
chromium --user-data-dir=~/perfil-kling \ --remote-debugging-port=9333 npm i playwright
Montagem, cortes e camada de textos.
sudo apt install ffmpeg pip install pillow
Black e ExtraBold em ~/.local/share/fonts/ (usadas pelo overlay.py).
Uma trilha sua ou livre, em WAV. No promo foi uma trilha gerada localmente.
Os comandos abaixo são os que rodaram no promo do INEMA. Troque a arte, o texto e a voz pelos seus.
Arte como referência, três tomadas, sem texto. Guarde a resposta: ela tem o generationId.
kling omni_ref_video --model kling-video-v3_0_omni --image ./ref.png \ --duration 15 --aspect_ratio 9:16 --resolution 1080p \ --prefer_multi_shots true --enable_audio false \ "A warm 15-second commercial in three shots, featuring the young woman from <<<image_1>>>. Shot 1: she smiles and points at a smartphone. Shot 2: over-the-shoulder, she types on a laptop with abstract dashboards. Shot 3: she laughs and waves. No text, no letters, no logos." > submit.json kling query_tasks <generationId> # repetir até COMPLETED; baixar works[].url na hora (expira em 24 h)
Cerca de 30 palavras, com o ganho na primeira frase. Confira a duração e a pronúncia.
python3 scripts/tts_elevenlabs.py oi8rgjIfLgJRsQ6rbZh3 vo.mp3 \ "Aprenda inteligência artificial na prática, de graça! No Inema Clube tem cursos de IA, agentes, automação e comunidade. Mais conhecimento, mais liberdade. Acesse: inema ponto clube." 1.12 ffprobe -v error -show_entries format=duration -of csv=p=0 vo.mp3 # 13.27
Os tempos de troca de tomada viram C1 e C2 no script de montagem.
ffmpeg -i kling.mp4 -vf "select='gt(scene,0.25)',showinfo" -f null - 2>&1 | grep -o "pts_time:[0-9.]*" # pts_time:4.625 pts_time:9.91667
O montar.sh corta as cenas de frente e o trecho da fala de cada uma. Com o navegador logado aberto na porta 9333, os scripts enviam e baixam.
C1=4.625 C2=9.917 bash scripts/montar.sh # 1ª vez: gera ls/v91, v93, a91, a93 node scripts/kling_lipsync_enviar.mjs $PWD/ls 91:5 93:5 # confere o custo no botão antes de clicar node scripts/kling_lipsync_baixar.mjs $PWD/ls 91 93 # 3 a 5 min depois: ls/ks91.mp4, ls/ks93.mp4
Rodando de novo, o script troca as cenas pelas versões com lipsync, desenha os textos e mistura voz e música em −14 LUFS.
C1=4.625 C2=9.917 bash scripts/montar.sh # → promo-9x16.mp4, 15.000000 s
Uma folha de quadros mostra se o gancho está no quadro 0 e se os textos aparecem.
mkdir -p cs; i=0; for t in 0 1.5 4.8 7.4 9 11.5 14.5; do i=$((i+1)) ffmpeg -v error -y -ss $t -i promo-9x16.mp4 -frames:v 1 -vf scale=270:-1 cs/f$i.jpg; done ffmpeg -y -i cs/f%d.jpg -vf tile=7x1 folha.jpg
No INEMA o Short foi para o canal INEMA FTD pelo yt-pubx, que escreve título e descrição; Short não leva thumb.
./yt-pubx publicar promo-9x16.mp4 --canal lives3 --sem-thumb --contexto "..." --dry-run
./yt-pubx publicar promo-9x16.mp4 --canal lives3 --sem-thumb --plano <pasta>/plano.json
Duas versões do mesmo promo: a primeira com locução em off e a segunda com a moça falando nas cenas 1 e 3.



Ideias que ficaram de fora desta primeira produção.