La fábrica de video con agentes|INEMA.CLUB-PRO

Clase 2 · 18 min

Explicativo con avatar y voz: explicavideos por dentro

explicavideos transforma un guion en un video explicativo con avatar, voz, escenas animadas y subtítulos. La parte cara es una sola: el estudio de avatar. En esta clase ejecutas las pruebas del motor y armas escenas, bloques y moldes de un guion tuyo, deteniéndote antes del estudio.

Comenzar la clase
Pequeño estudio oscuro con un banco vacío, un micrófono en el pedestal y un monitor de edición con la pantalla dividida en diapositiva y presentador.

En esta clase vas a

  1. 1Las etapas del motor, del guion al video armado
  2. 2El formato de escena: título, capítulo, habla, rótulos y frase para llevar
  3. 3Por qué las escenas se convierten en bloques y qué hace el límite por bloque
  4. 4Dónde está la compuerta del estudio y qué dice el --help que el código no hace

Objetivo: ejecutar las pruebas de explicavideos y armar escenas y bloques de un guion tuyo sin generar nada en el estudio de avatar.

01El camino de un explicativo

Haz clic en cada etapa. Solo la del medio gasta crédito.

Haz clic en cada bloque del diagrama para ver qué hace.

Etapas del motor v1, leídas en el README y en el código de explicavideos 2.13.10 (commit 604fc74). El prepare es la primera etapa de los dos motores, v1 y v2. HyperFrames por dentro es tema del curso 3.

02El motor en un commit fijo

Clona, muestra la versión, lee el --help y ejecuta las pruebas. Las pruebas simulan la red y cambian el render por un comando que falla si se lo llama: nada sale de tu máquina.

Terminal · pruebas de explicavideos
E=${TMPDIR:-/tmp}/ensaio-fabrica/a2; rm -rf "$E"; mkdir -p "$E"; cd "$E"
git clone -q https://github.com/inematds/explicavideos.git && cd explicavideos
git checkout -q 604fc74 && cat VERSION
python3 explica.py --help | grep -E "^  (prepare|preview)"
python3 -m unittest discover -s tests > testes.log 2>&1; echo "saída: $?"
grep -E "^(Ran|OK)" testes.log | sed 's/ in .*s$//'
Ejemplo del repositorio
2.13.10
  prepare   monta cenas, blocos (<= 4.400 caracteres) e templates. Não gera nada no HeyGen.
  preview   renderiza o bloco 1 localmente, sem avatar, para conferir o layout.
saída: 0
Ran 50 tests
OK

El bloque quita el tiempo de la línea Ran 50 tests (cambia en cada ejecución). Fíjate en el texto de preview: dice que renderiza, pero mira la siguiente pestaña.

03Un guion tuyo se convierte en escenas y bloques

Cuatro escenas de ejemplo y una config que apunta a ellas. El límite bajo (300 caracteres) es a propósito, para ver el empaquetado.

Archivo · kit/exemplos/a2-explica/cenas-pt.json
[
  {"title": "Por que conferir antes de gerar", "chapter": "ABERTURA", "kind": "steps", "speech": "Gerar avatar custa crédito e tempo. Por isso o motor monta tudo antes: cenas, blocos e moldes. Só depois de conferir é que alguma coisa vai para o estúdio.", "labels": ["Cenas", "Blocos", "Moldes"], "takeaway": "Conferir é de graça. Gerar não é.", "source": "README do explicavideos"},
  {"title": "O roteiro vira cenas", "chapter": "ETAPA 1", "kind": "steps", "speech": "Cada cena tem título, capítulo, fala e até três rótulos. A fala é o que o avatar diz; os rótulos são o que aparece na tela.", "labels": ["Título", "Fala", "Rótulos"], "takeaway": "Fala para ouvir, rótulo para ver.", "source": "engine/prepare.py"},
  {"title": "As cenas viram blocos", "chapter": "ETAPA 2", "kind": "steps", "speech": "O estúdio aceita um texto de tamanho limitado por vídeo. O motor junta cenas inteiras em blocos até o limite, sem cortar nenhuma fala no meio.", "labels": ["Limite por bloco", "Cena inteira", "Sem corte"], "takeaway": "Bloco é um vídeo de avatar.", "source": "engine/prepare.py"},
  {"title": "O que vem depois", "chapter": "ETAPA 3", "kind": "steps", "speech": "Com os blocos prontos, a pessoa dona do avatar aprova e só então o estúdio gera. Depois vêm transcrição, cenas animadas, render e montagem.", "labels": ["Aprovação", "Estúdio", "Render"], "takeaway": "Aprovação humana antes do crédito.", "source": "README do explicavideos"}
]
Terminal · prepare y status
K=~/projetos/formacao-cinema-ia-fabrica-v72/kit
E=${TMPDIR:-/tmp}/ensaio-fabrica/a2; cd "$E/explicavideos"
cat > "$E/ensaio.json" <<FIM
{"id": "ensaio", "title": "Ensaio", "source_repo": "$E", "output": "$E/saida",
 "languages": ["pt"], "scene_files": {"pt": "$K/exemplos/a2-explica/cenas-pt.json"},
 "max_chars": 300}
FIM
python3 explica.py --config "$E/ensaio.json" prepare; echo "saída: $?"
ls "$E/saida/blocos" "$E/saida/templates/pt"
python3 explica.py --config "$E/ensaio.json" status | head -3
Ejemplo del repositorio
{"blocks": 2, "scenes": 4, "topics": 0, "chars": 561}
saída: 0
/tmp/ensaio-fabrica/a2/saida/blocos:
manifest.json
pt-b01.txt
pt-b02.txt

/tmp/ensaio-fabrica/a2/saida/templates/pt:
scene-01.html
scene-02.html
scene-03.html
scene-04.html
{
  "submitted": {
    "prepared": 2

Dos escenas por bloque (155 + 123 caracteres caben en 300; la tercera no). El status muestra los dos bloques como prepared: no se envió nada al estudio. Los moldes scene-NN.html ya tienen data-duration calculado a partir de la narración.

04Cuando una escena no cabe

El motor se niega a cortar una narración. Con el límite en 140, la primera escena (155 caracteres) ya lo supera.

Terminal · límite excedido
E=${TMPDIR:-/tmp}/ensaio-fabrica/a2; cd "$E/explicavideos"
sed 's/"max_chars": 300/"max_chars": 140/' "$E/ensaio.json" > "$E/curto.json"
sed -i 's#"output": "[^"]*"#"output": "'"$E"'/saida-curta"#' "$E/curto.json"
python3 explica.py --config "$E/curto.json" prepare 2>&1 | grep -E "^ValueError"; echo "saída: ${PIPESTATUS[0]}"
Ejemplo del repositorio
ValueError: Scene 1 exceeds limit; split its narration before submitting
saída: 1

La solución es dividir la narración de la escena en dos, no aumentar el límite: el límite real viene del estudio.

05El start: cinco servicios que retoman donde se quedaron

En producción real, el start levanta cinco servicios. Ejecútalo, interrúmpelo y vuelve a ejecutarlo.

fila/

rodando/

pronto/

falhou/

Simulación en el navegador: nada se ejecuta de verdad. Los cinco nombres son los servicios del start en explicavideos 2.13.10 (submit, monitor, render, assemble, publish).

06Lo que va antes del estudio

Tres cosas para verificar antes de cualquier start.

1. Aprobación

El --help del motor exige un archivo APROVADO_HEYGEN en el output, con la autorización del dueño del avatar y el número de bloques y minutos. Es una regla escrita, no un bloqueo en el código: tu compuerta (clase 7) es la que cierra de verdad.

07Lo que sale del motor

Un explicativo de 10 minutos hecho con explicavideos v2, con avatar y voz del propio Nei (con su consentimiento), en tres idiomas.

IA Cultivada: un explicativo que salió del explicavideos · 9 minPágina del video con guion →

08Práctica

Del motor probado a las escenas de tu próximo video.

E1 · Motor probado

5 min

Ejecuta el bloque "pruebas de explicavideos".

Listo cuando: La salida muestra 2.13.10, saída: 0, Ran 50 tests y OK.

E2 · Escenas y bloques

5 min

Ejecuta el bloque "prepare e status" con las cuatro escenas del kit.

Listo cuando: {"blocks": 2, "scenes": 4, "topics": 0, "chars": 561}, saída: 0 y el status con "prepared": 2.

E3 · Tu guion

15 min

Pídele a tu agente las escenas de un explicativo tuyo (5 a 8 escenas, cada locución con hasta 600 caracteres) en el mismo formato de cenas-pt.json. Guárdalo en ${TMPDIR:-/tmp}/ensaio-fabrica/a2/minhas-cenas.json, cambia el scene_files de la config y corre el prepare con max_chars 4400.

Listo cuando: cd ${TMPDIR:-/tmp}/ensaio-fabrica/a2/explicavideos && python3 explica.py --config ../ensaio.json prepare; echo "saída: $?" → una línea {"blocks": …, "scenes": N, …} con el N de tus escenas y saída: 0.

09Prueba de la clase

La explicación aparece después de tu respuesta.

Pregunta 1 de 4

¿Qué comando de explicavideos gasta crédito?

10En tres frases

Escenasparlamento para escuchar, etiqueta para ver; el agente escribe, tú revisas.
Bloquesel prepare empaqueta escenas completas hasta el límite del estudio, sin gastar nada.
Estudioel único paso de pago queda detrás del start, de la aprobación y de tu formulario de consentimiento.

Para ir más allá

Clase anteriorPróxima clase