E1 · Motor probado
5 minEjecuta el bloque "pruebas de explicavideos".
Listo cuando: La salida muestra 2.13.10, saída: 0, Ran 50 tests y OK.
Clase 2 · 18 min
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
Objetivo: ejecutar las pruebas de explicavideos y armar escenas y bloques de un guion tuyo sin generar nada en el estudio de avatar.
Haz clic en cada etapa. Solo la del medio gasta crédito.
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.
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.
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$//'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.
En el commit 604fc74, preview llama a build_final_block.py pt 1 --preview, que solo graba el HTML del bloque 1 en layout-preview/, con tiempos ficticios y el aviso "PRÉVIA VISUAL · SEM NARRAÇÃO" en lugar del avatar. No sale ningún MP4. Cuando el texto de ayuda y el código divergen, vale el código.
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.
[
{"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"}
]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{"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": 2Dos 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.
El motor se niega a cortar una narración. Con el límite en 140, la primera escena (155 caracteres) ya lo supera.
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]}"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.
En producción real, el start levanta cinco servicios. Ejecútalo, interrúmpelo y vuelve a ejecutarlo.
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).
Tres cosas para verificar antes de cualquier start.
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.
El motor fue hecho para el avatar y la voz de Nei, con su consentimiento. En tu uso, el avatar es tuyo, con formulario de consentimiento firmado. El avatar de otra persona sin formulario, no.
Los perfiles son del v2: sin profile_visual, sale el perfil aula; con "profile_visual": "viral", el perfil viral (cortes más rápidos), verificado por engine/v2/qa_viral.py, que imprime APROVADO, APROVADO COM AVISO o REPROVADO.
El v2 no genera el avatar de nuevo: parte de una producción v1 lista y rehace lo visual de cada bloque con un guion visual por pies hablados, el mismo concepto que el validador de refazvideo verifica en la clase 4.
Comandos del README (solo descritos aquí, porque necesitan la locución transcrita del avatar): engine/v2/setup_output.py → engine/v2/build_block.py 1 --strict → engine/v2/run_lane.sh 1 2 3.
Un explicativo de 10 minutos hecho con explicavideos v2, con avatar y voz del propio Nei (con su consentimiento), en tres idiomas.
Del motor probado a las escenas de tu próximo video.
Ejecuta el bloque "pruebas de explicavideos".
Listo cuando: La salida muestra 2.13.10, saída: 0, Ran 50 tests y OK.
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.
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.
La explicación aparece después de tu respuesta.
Pregunta 1 de 4
¿Qué comando de explicavideos gasta crédito?
Pregunta 2 de 4
Una escena tiene 5.000 caracteres de parlamento y el límite es 4.400. ¿Qué haces?
Pregunta 3 de 4
El --help dice que preview renderiza; el código solo guarda un HTML. ¿En quién confías?
Pregunta 4 de 4
¿Por qué importa el manifiesto cuando el start se interrumpe?
Elige una alternativa. La explicación aparece después de tu intento.