Una imagen de referencia se convirtió en un Short con escenas de Kling, voz de ElevenLabs, lipsync y publicación, sin que nadie abriera un editor de video.

Este proyecto cuenta cómo un agente de IA (Claude Code) produjo un video promocional de 15 segundos de INEMA.CLUB en estilo UGC, ese video "de gente real hablándole a la cámara" de las redes sociales. Sirve para quien crea contenido y quiere delegar la producción a un agente. Muestra la idea, los pasos con los comandos usados, los consejos que marcaron la diferencia y los problemas que surgieron en el camino. Para repetirlo necesitas una suscripción de Kling AI, una cuenta de ElevenLabs, ffmpeg, Python y un navegador con sesión iniciada en Kling.
El pedido fue una frase: "quiero un video promocional de INEMA de 15 segundos, usa Kling para mostrar lo que tenemos en inema.club usando esta imagen como referencia, y después una voz de ElevenLabs en portugués". El agente planificó, mostró el costo, esperó la aprobación y produjo.
El video salió de la suscripción Pro de Kling, con la CLI oficial. Costo: 120 créditos por las escenas y 10 por el lipsync, de un saldo de 7.936.
El Lip Sync de Kling solo existe en el sitio. El agente abrió un navegador con la sesión ya iniciada, envió las escenas y descargó el resultado por su cuenta.
Cada etapa se verificó: transcripción de la voz, hoja de cuadros del video, cuadro 0 con el gancho y duración de 15 s exactos.

• Formato 9:16, después de preguntar (Reels y Shorts).
• Pedirle a Kling escenas sin texto, porque deforma las letras, y poner los textos encima, nítidos.
• Guion corto, con el beneficio en la primera frase: "Aprende inteligencia artificial en la práctica, gratis".
• Voz femenina brasileña del catálogo de ElevenLabs (Amanda Kelly).
• Música local, sin derechos de autor de terceros.
Lo que necesitó aprobación: gastar créditos, usar la API de ElevenLabs y publicar en YouTube.
Ocho etapas. Solo la primera y la de publicación necesitaron a una persona: para indicar el formato y dar la aprobación.
kling omni_ref_video con la imagen como referencia: 15 s, 9:16, 1080p, sin audio, tres tomas. Una sola llamada.
ElevenLabs eleven_multilingual_v2, velocidad 1,12, 13,3 s. Verificada con Whisper local.
Python + Pillow dibujan 450 cuadros PNG, y cada texto entra en la palabra hablada.
Las escenas de frente pasan por el Lip Sync del sitio; ffmpeg une todo, quita la marca de agua y nivela el sonido.
El principal: usa tu suscripción y dale al agente la capacidad de operar el sitio cuando la herramienta no tiene CLI.
Kling tiene una CLI oficial (kling) que usa los créditos de tu plan. Sin clave de API, sin cobro aparte. El agente ejecuta kling account antes y después para medir el costo real.
Lip Sync, avatar y otras funciones solo existen en el sitio. Un Chromium con tu sesión, abierto con --remote-debugging-port, le permite al agente enviar archivos y hacer clic mediante Playwright.
Los generadores de video deforman las letras. Pide "no text, no letters, no logos" y escribe los textos después, encima.
En image_to_video el video hereda el formato de la imagen (1:1). Para 9:16 a partir de una imagen cuadrada, usa omni_ref_video con --aspect_ratio 9:16.
En 15 s caben unas 30 palabras. Acorta el texto y usa la velocidad nativa de la voz (1,1 a 1,15), en lugar de acelerar el audio después.
Una escena de 5,08 s cuesta 10 créditos; recortada a 5,0 s, cuesta 5.
El primer cuadro ya muestra la promesa ("Aprenda IA na prática", "Acesso grátis": aprende IA en la práctica, acceso gratis). Quien desliza el feed decide ahí.
Graba en un archivo la respuesta de cada envío (el generationId) antes de seguir. El trabajo pagado que se pierde no vuelve.
Todo esto ocurrió de verdad en esta producción. Cada línea indica el problema y la corrección más pequeña que lo resolvió.
crop=1012:1800:34:0).mp3_44100_192 solo en el plan Creator. Corrección: mp3_44100_128.Todo corre en tu máquina. El agente usado fue Claude Code, pero los scripts son comunes y funcionan a mano.
Plan pago y la CLI oficial, con sesión iniciada.
npm i -g @klingai/cli-global kling login kling account
Cuenta con clave de API para la narración.
export ELEVENLABS_API_KEY=...Chromium con tu sesión de Kling y puerto de depuración; Playwright solo como biblioteca.
chromium --user-data-dir=~/perfil-kling \ --remote-debugging-port=9333 npm i playwright
Montaje, cortes y capa de textos.
sudo apt install ffmpeg pip install pillow
Black y ExtraBold en ~/.local/share/fonts/ (usadas por overlay.py).
Una pista tuya o libre, en WAV. En la promo fue una pista generada localmente.
Los comandos de abajo son los que se ejecutaron en la promo de INEMA. Cambia la imagen, el texto y la voz por los tuyos.
Imagen como referencia, tres tomas, sin texto. Guarda la respuesta: contiene el 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 hasta COMPLETED; descargar works[].url de inmediato (expira en 24 h)
Unas 30 palabras, con el beneficio en la primera frase. Revisa la duración y la pronunciación. (El ejemplo es la locución real, en portugués.)
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
Los tiempos de cambio de toma se convierten en C1 y C2 en el script de montaje.
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
El montar.sh recorta las escenas de frente y el fragmento de voz de cada una. Con el navegador con sesión iniciada abierto en el puerto 9333, los scripts envían y descargan.
C1=4.625 C2=9.917 bash scripts/montar.sh # 1.ª vez: genera ls/v91, v93, a91, a93 node scripts/kling_lipsync_enviar.mjs $PWD/ls 91:5 93:5 # revisa el costo en el botón antes de hacer clic node scripts/kling_lipsync_baixar.mjs $PWD/ls 91 93 # 3 a 5 min después: ls/ks91.mp4, ls/ks93.mp4
Al ejecutarlo de nuevo, el script cambia las escenas por las versiones con lipsync, dibuja los textos y mezcla voz y música a −14 LUFS.
C1=4.625 C2=9.917 bash scripts/montar.sh # → promo-9x16.mp4, 15.000000 s
Una hoja de cuadros muestra si el gancho está en el cuadro 0 y si los textos aparecen.
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
En INEMA el Short fue al canal INEMA FTD mediante yt-pubx, que escribe el título y la descripción; los Shorts no llevan miniatura.
./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
Dos versiones de la misma promo: la primera con locución en off y la segunda con la joven hablando en las escenas 1 y 3.



Ideas que quedaron fuera de esta primera producción.