Caso real · promo de INEMA.CLUB en 15 s

Video UGC hecho de principio a fin por un agente

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.

Banner: video UGC con agente
En resumen

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.

La idea

Una imagen, un pedido y el agente hace el resto

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.

Las seis etapas: idea, Kling por suscripción, lipsync en el sitio, voz de ElevenLabs, montaje y publicación

💳 Suscripción, no API

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 agente también usa el sitio

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.

🔎 Revisado antes de entregar

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.

Imagen de referencia: joven sosteniendo un celular con la app de INEMA.CLUB
La imagen de referencia que envió Nei. La joven, el escenario y la pantalla del celular se convirtieron en el video.

Lo que el agente decidió por su cuenta

• 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.

Cómo lo hicimos

De la imagen al Short publicado

Ocho etapas. Solo la primera y la de publicación necesitaron a una persona: para indicar el formato y dar la aprobación.

Imagen de referencia→ Plan + costo (ok)→ Kling: 3 escenas, 15 s→ Voz ElevenLabs→ Textos encima→ Lip Sync en el sitio→ Montaje ffmpeg→ Bot + YouTube
1

Escenas

kling omni_ref_video con la imagen como referencia: 15 s, 9:16, 1080p, sin audio, tres tomas. Una sola llamada.

2

Voz

ElevenLabs eleven_multilingual_v2, velocidad 1,12, 13,3 s. Verificada con Whisper local.

3

Textos

Python + Pillow dibujan 450 cuadros PNG, y cada texto entra en la palabra hablada.

4

Lipsync y final

Las escenas de frente pasan por el Lip Sync del sitio; ffmpeg une todo, quita la marca de agua y nivela el sonido.

Consejos

Lo que marcó la diferencia

El principal: usa tu suscripción y dale al agente la capacidad de operar el sitio cuando la herramienta no tiene CLI.

💳 1. Primero la suscripción

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.

🌐 2. Un agente que usa la web

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.

🔤 3. Nada de texto en la generación

Los generadores de video deforman las letras. Pide "no text, no letters, no logos" y escribe los textos después, encima.

📐 4. Formato con el modelo correcto

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.

⏱️ 5. La voz cabe en el tiempo

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.

💰 6. El lipsync cobra en bloques de 5 s

Una escena de 5,08 s cuesta 10 créditos; recortada a 5,0 s, cuesta 5.

🎯 7. Gancho en el cuadro 0

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í.

🧾 8. Guarda cada respuesta

Graba en un archivo la respuesta de cada envío (el generationId) antes de seguir. El trabajo pagado que se pierde no vuelve.

Problemas

Lo que salió mal y cómo lo resolvimos

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ó.

Lipsync olvidadoLa primera versión salió con locución en off: el agente decidió por su cuenta que la joven no hablaría. Corrección: preguntar desde el plan si la persona del video habla.
La CLI de Kling no acepta audioSin lipsync por línea de comandos. Corrección: Lip Sync desde el sitio, en el navegador con sesión iniciada, con dos scripts de Playwright.
"Sin confirmación" que sí había entradoLa pantalla no mostró el aviso de envío de la escena 1, pero el pedido estaba en la cola. Corrección: revisar el historial antes de reenviar, para no pagar dos veces.
Descarga de trabajos antiguosEl script de descarga bajó 12 videos de otro proyecto con el mismo patrón de nombre. Corrección: descargar solo los números pedidos.
Marca de agua "KlingAI"Aparece en la esquina inferior derecha de las escenas y del lipsync. Corrección: zoom de 6% en ffmpeg (crop=1012:1800:34:0).
ElevenLabs rechazó el formatoError 403: mp3_44100_192 solo en el plan Creator. Corrección: mp3_44100_128.
Archivo de audio vacíoEl script abría el archivo antes de que la API respondiera; con el error, quedó un mp3 vacío. Corrección: leer la respuesta primero, grabar después.
Narración demasiado larga16,6 s para un video de 15 s. Corrección: texto más corto y velocidad 1,12 en la propia voz: 13,3 s.
Cuadro 0 vacíoLos textos entraban con fundido y el primer cuadro salía limpio. Corrección: el gancho ya aparece completo en el cuadro 0.
Texto azul que desaparecía"mais liberdade" (más libertad) en azul casi no se veía sobre el fondo claro. Corrección: caja oscura detrás de la frase.
Hoja de cuadros desordenadaEl glob ordena los nombres como texto (0.5, 11, 13, 3…) y la revisión visual quedó fuera de orden. Corrección: numerar los cuadros (k1, k2, k3…).
Requisitos previos

Lo que necesitas

Todo corre en tu máquina. El agente usado fue Claude Code, pero los scripts son comunes y funcionan a mano.

Kling AI (suscripción)

Plan pago y la CLI oficial, con sesión iniciada.

npm i -g @klingai/cli-global
kling login
kling account

ElevenLabs

Cuenta con clave de API para la narración.

export ELEVENLABS_API_KEY=...

Navegador con sesión iniciada

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

ffmpeg + Python

Montaje, cortes y capa de textos.

sudo apt install ffmpeg
pip install pillow

Fuente Montserrat

Black y ExtraBold en ~/.local/share/fonts/ (usadas por overlay.py).

Música

Una pista tuya o libre, en WAV. En la promo fue una pista generada localmente.

Guía de uso · paso a paso

Repitiendo la producción

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.

1

Genera las escenas en Kling

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)
2

Graba la narración

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
3

Encuentra los cortes de las escenas

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
4

Prepara los fragmentos y haz el Lip Sync en el sitio

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
5

Monta el video final

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
6

Revisa antes de publicar

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
7

Publica

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
Ejemplos

El resultado

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.

Versión 1 · locución en off. Publicada en YouTube.
Versión 2 · lipsync de Kling en las escenas de frente (+10 créditos).
Ocho cuadros del video en bruto de Kling
Lo que entregó Kling: celular con la pantalla de INEMA.CLUB (0–4,6 s), laptop (4,6–9,9 s) y saludo (9,9–15 s). Incluso mantuvo legible el menú del celular.
Ocho cuadros del video montado con los textos
Después del montaje: el gancho en el cuadro 0, los cuatro elementos entrando cuando se mencionan, la frase de valor y el cierre INEMA.CLUB.
Recortes del rostro que muestran la boca en movimiento
Revisión del lipsync: la boca se abre y se cierra a lo largo de la locución en las escenas 1 y 3.
Próximos pasos

Lo que se puede mejorar

Ideas que quedaron fuera de esta primera producción.

Hecho
Promo de 15 s, dos versionesEscenas en Kling, voz de ElevenLabs, textos, lipsync, Short publicado.
Siguiente
Preguntar "¿la persona habla?" en el planEvita rehacer el video para agregar lipsync después.
Idea
Lote de variacionesEl mismo guion con otras personas, escenarios y voces, para probar cuál retiene más.
Idea
Lipsync en lote, sin clic manualLos scripts ya envían y descargan; falta encadenar todo en un solo comando.