PTENES
MÓDULO 2.2

🛠️ Configuración y requisitos previos

Instala Node.js 22+, FFmpeg, Chrome headless y el TTS Kokoro. Configura todo desde cero hasta ejecutarlo npx hyperframes init con éxito.

6
Temas
20
Minutos
Práctico
Nivel
Configuración
Tipo
HyperFrames CLI npx hyperframes Node.js v22+ runtime FFmpeg C:\ffmpeg\bin -nostdin Chrome headless browser ensure Kokoro TTS PT-BR pf_dora hyperframes doctor ✓ diagnóstico ENTORNO DE CONFIGURACIÓN
1

⚙️ Node 22+ y FFmpeg

Dos binarios obligatorios: Node.js en la versión 22 o superior y FFmpeg accesible en el PATH. Sin ellos, HyperFrames no puede renderizar ni un solo frame.

¿Por qué específicamente Node 22+?

HyperFrames usa ESM nativo y API de fs/promises presentes a partir de Node 18, pero la versión 22 trae el --experimental-strip-types y el V8 actualizado que acelera el parse de las composiciones. Las versiones antiguas (16, 18) pueden funcionar parcialmente, pero causan avisos y comportamientos inesperados en el build-index.mjs.

Verificar la versión e instalar mediante nvm (git-bash / WSL)
# Verificar la versión actual
node --version
# debe devolver v22.x.x o superior
# Si necesitas instalar mediante nvm
nvm install 22
nvm usa 22
nvm alias default 22
Instalar FFmpeg y agregarlo al PATH (Windows)
# 1. Descargar la versión estática de ffmpeg.org/download.html
# 2. Extraer en C:\ffmpeg (debe tener bin\ffmpeg.exe dentro)
# 3. Agregar al PATH mediante PowerShell (Admin)
[Environment]::SetEnvironmentVariable("Path",
"$env:Path;C:\ffmpeg\bin",
"Machine")

# 4. Verificar (nuevo terminal)
ffmpeg -version
# debe mostrar ffmpeg version 6.x o 7.x
✓ Camino correcto
  • ✓ FFmpeg en C:\ffmpeg\bin\ffmpeg.exe
  • ✓ PATH configurado en la variable de sistema (no usuario)
  • ✓ Node 22+ verificado con node --version
  • ✓ Abrir una nueva terminal después de modificar PATH
✗ Trampas comunes
  • ✗ Usar FFmpeg instalado por choco sin verificar PATH
  • ✗ Node 16 o 18: causa errores en ESM nativo
  • ✗ Probar ffmpeg en el terminal antiguo (PATH no actualizado)
  • ✗ ffmpeg.exe fuera del subdirectorio bin
Conceptos clave
⚙️
Node 22+
ESM nativo
🎞️
FFmpeg
C:\ffmpeg\bin
🌿
nvm
Administrar versiones
🔗
PATH
Var. del sistema
2

⌨️ ffmpeg -nostdin en git-bash

El gotcha más silencioso de la configuración: ejecutar FFmpeg dentro de git-bash sin -nostdin causa exit 0 sin generar ningún archivo. No hay ningún error visible: simplemente no se crea nada.

⚠️ Gotcha crítico: termina con exit 0 sin archivo

En git-bash (MinTTY), FFmpeg intenta leer stdin y se bloquea silenciosamente. El proceso termina con código 0 (éxito), pero no se genera ningún MP4. Es el bug más difícil de diagnosticar porque todo parece haber funcionado.

✗ Problema (git-bash)
# Termina con exit 0, ¡sin archivo!
ffmpeg -i frames/%04d.png \
-c:v libx264 output.mp4
# Ningún error — y ningún MP4
✓ Solución (-nostdin)
# Correcto en git-bash
ffmpeg -nostdin \
-i frames/%04d.png \
-c:v libx264 output.mp4
# Genera el MP4 correctamente
💡
HyperFrames ya incluye -nostdin

El CLI de HyperFrames (npx hyperframes render) pasa -nostdin automáticamente en las llamadas internas a FFmpeg. Solo tienes que preocuparte si vas a invocar FFmpeg directamente en git-bash para el posprocesamiento manual, script de concatenación, etc.

📊 ¿Por qué sucede?
MinTTY (git-bash)
Emula una terminal POSIX. Cuando FFmpeg detecta que stdin es un TTY, espera la entrada del usuario, que nunca llega.
Exit code 0
FFmpeg cierra la lectura de stdin y termina normalmente, sin error — pero sin procesar nada. Comportamiento ambiguo por diseño.
-nostdin
Desactiva por completo la lectura de stdin. FFmpeg procesa el archivo de entrada sin bloquearse en el TTY.
Conceptos clave
⚠️
MinTTY
TTY en git-bash
🔇
-nostdin
Flag obligatorio
0️⃣
Exit 0
Silencioso
🔄
CLI auto
Ya incluido
3

🌐 Chrome headless de HyperFrames

HyperFrames incluye su propio Chrome headless; no depende de Chrome instalado en el sistema. Un solo comando descarga y vincula la versión exacta probada con el CLI.

¿Por qué un Chrome dedicado?

Las diferentes versiones de Chrome renderizan CSS y animaciones GSAP con diferencias sutiles de píxeles. Para que el output sea determinista (el mismo HTML → el mismo MP4), HyperFrames fija una versión específica de Chromium mediante Puppeteer, descargada y administrada internamente. No necesitas tocar el Chrome del sistema.

Descargar Chrome headless (solo una vez)
# Descarga e instala Chromium en la versión fijada por HyperFrames
npx hyperframes browser ensure

# Resultado esperado:
✓ Chromium 121.0.6167.85 already installed
# o
⬇ Downloading Chromium 121.0.6167.85 (~170MB)...
✓ Done
Qué hace internamente el comando
1

Lee la versión bloqueada en el package.json de HyperFrames

El campo puppeteer.chromiumRevision define exactamente qué build de Chromium usar — nada de "latest".

2

Verifica la caché local (~/.cache/puppeteer/)

Si el build ya existe, omite la descarga. El segundo proyecto creado no espera nada: es instantáneo.

3

Descarga ~170MB del CDN de Chromium si es necesario

Solo la primera vez o cuando se actualiza la versión de HyperFrames. Se recomienda una conexión estable.

💡
Verificar dónde se instaló Chrome
npx hyperframes browser path
# muestra la ruta completa del ejecutable
Conceptos clave
🌐
Chromium
Versión bloqueada
🎭
Puppeteer
Administrador
💾
Caché
~/.cache/puppeteer
🔒
Determinístico
Pixel-perfect
4

🔊 TTS Kokoro

Narración en PT-BR 100% local, sin clave de API. Kokoro tiene su propio fonemizador de portugués, así que no necesitas espeak-ng. En la primera ejecución, descarga ~340MB de modelo.

✓ Instalación correcta
  • ✓ pip install kokoro-onnx soundfile
  • ✓ Python 3.10+ en el PATH
  • ✓ Primera ejecución: espera una descarga de ~340MB
  • ✓ Voz predeterminada: pf_dora con --speed 0.98
✗ No instales
  • ✗ espeak-ng — Kokoro no lo necesita y crea conflictos
  • ✗ Otros paquetes TTS que dependen de espeak
  • ✗ Interrumpir la primera descarga del modelo
  • ✗ Usar speed 1.0+ — suena mecánico en PT-BR
Instalar y generar el primer audio
# Instalar (una vez)
pip install kokoro-onnx soundfile

# Generar narración mediante HyperFrames TTS
npx hyperframes tts "assets/txt/s1.txt" \
--voice pf_dora \
--speed 0.98 \
--output assets/audio/s1.wav

# En la primera ejecución — salida esperada:
⬇ Downloading kokoro model (~340MB)...
✓ Model cached at ~/.cache/kokoro/
✓ Generated: assets/audio/s1.wav (3.2s)
💡
¿Por qué sin espeak-ng?

espeak-ng fonemiza mal el portugués: la pronunciación de las palabras técnicas suena robótica. Kokoro tiene su propio fonemizador de PT-BR, entrenado específicamente para el idioma.

⚡
Segunda ejecución: instantánea

El modelo (~340MB) se almacena en caché en ~/.cache/kokoro/. A partir de la segunda invocación, generar un fragmento de 10s tarda menos de 2 segundos.

Conceptos clave
🔊
kokoro-onnx
Motor TTS
🗣️
pf_dora
Voz PT-BR
📦
340MB
Solo la primera vez
🚫
sin espeak
No instalar
5

🩺 npx hyperframes doctor

El comando de diagnóstico verifica todo el stack de una sola vez: Node, FFmpeg, Chrome y Kokoro. Si algo está mal, te dice exactamente qué falta.

Salida esperada (entorno correcto)
npx hyperframes doctor

# Salida esperada:
✓ Node.js v22.3.0 — OK
✓ FFmpeg 6.1.1 found at C:\ffmpeg\bin\ffmpeg.exe
✓ Chrome headless 121.0.6167.85 — cached
✓ kokoro-onnx 0.8.2 — installed
✓ soundfile 0.12.1 — installed

Todo listo 🚀
Salida con problemas (FFmpeg no encontrado)
npx hyperframes doctor

✓ Node.js v22.3.0 — OK
✗ FFmpeg not found in PATH
→ Install FFmpeg and add C:\ffmpeg\bin to PATH
✓ Chrome headless 121.0.6167.85 — cached
⚠ kokoro-onnx not found
→ Run: pip install kokoro-onnx soundfile

2 issues found. Fix them before rendering.
💡
Ejecuta doctor antes de cualquier render

Especialmente en un entorno nuevo o después de actualizar HyperFrames. El npx hyperframes render falla a mitad del proceso si falta una dependencia — el doctor detecta eso antes.

Qué verifica el doctor
1

Node.js — versión mínima 18, recomendada 22+

Lee process.version y compara con el campo engines del package.json.

2

FFmpeg — ejecuta ffmpeg -version y parsea la salida

Verifica si el binario está disponible mediante PATH y muestra la ruta completa encontrada.

3

Chrome — verifica la caché de Puppeteer

Verifica si el build bloqueado está en ~/.cache/puppeteer/. Si no, sugiere ejecutar browser ensure.

4

Kokoro — importa el módulo Python y verifica

Ejecuta python -c "import kokoro_onnx" e import soundfile. Versiones mínimas verificadas.

Conceptos clave
🩺
doctor
Diagnóstico
✓
Todo OK
4 checks
✗
Issues
Con sugerencia
🔁
Pre-renderizado
Ejecutar siempre
6

📦 Iniciar un proyecto

Con el entorno listo, el siguiente paso es crear la estructura del proyecto. La plantilla blank + --non-interactive genera todo sin preguntas: ideal para scripts y CI.

Plantilla blank vs. otras

O --example blank crea un proyecto mínimo con la estructura de carpetas correcta, pero sin escenas preconstruidas; empiezas desde cero. Es el punto de entrada recomendado para aprender el pipeline, ya que cada archivo que aparece se creó intencionalmente.

Crear y configurar un nuevo proyecto
# 1. Crear el proyecto (sin interacción)
npx hyperframes init mi-video \
--example blank \
--non-interactive

# 2. Entrar al directorio
cd mi-video

# 3. Instalar las dependencias
npm install

# 4. Copiar las fuentes (obligatorio antes de cualquier render)
node scripts/fetch-fonts.mjs

# 5. Verificar el entorno antes de renderizar
npx hyperframes doctor
Estructura generada por el init blank
mi-video/
├── scenes/ # escenas HTML + GSAP
│ └── s01.html
├── assets/
│ ├── txt/ # narración por escena
│ ├── audio/ # .wav generado por el TTS
│ └── fonts/ # ← fetch-fonts.mjs
├── scripts/
│ ├── build-index.mjs
│ ├── fetch-fonts.mjs
│ └── narration-template.sh
├── design.md # paleta, tipografía, estilo
└── package.json
✓ Después del init, haz siempre
  • ✓ Lee el design.md para entender la paleta
  • ✓ Ejecuta node scripts/fetch-fonts.mjs antes del render
  • ✓ Usa narration-template.sh como base del guion
  • ✓ Ejecuta doctor una vez en el proyecto nuevo
✗ Errores comunes de principiantes
  • ✗ Renderizar sin ejecutar fetch-fonts.mjs → fuente no encontrada
  • ✗ Ignorar el design.md e inventar una paleta
  • ✗ Saltar el npm install después del init
  • ✗ Usar espacios en el nombre del proyecto (ej.: meu video)
💡
El design.md define la identidad visual

Cada proyecto tiene un design.md con la paleta principal, la tipografía y el estilo visual. Para los videos de INEMA.CLUB, la paleta predeterminada es: fondo #0D1321, acento ámbar #FACC15, textos en blanco/gris. Claude lee este archivo antes de escribir cualquier escena.

Conceptos clave
📦
hyperframes init
Scaffolding
📄
design.md
Paleta + estilo
🔤
fetch-fonts
Obligatorio
📝
narration.sh
Plantilla TTS

📋 Resumen del Módulo 2.2

Qué aprendiste en este módulo

Checklist de configuración completa
  • ✓ Node.js 22+ instalado y verificado con node --version
  • ✓ FFmpeg en C:\ffmpeg\bin agregado al PATH del sistema
  • ✓ Chrome headless instalado mediante npx hyperframes browser ensure
  • ✓ TTS Kokoro instalado (pip install kokoro-onnx soundfile), sin espeak-ng
  • ✓ npx hyperframes doctor devolviendo "All systems go"
  • ✓ Primer proyecto creado con npx hyperframes init <nome> --example blank --non-interactive
  • ✓ fetch-fonts.mjs ejecutado, fuentes descargadas
  • ✓ Entendido por qué -nostdin es necesario en git-bash
Próximo módulo:
2.3
📝 Guion y narración TTS
Estructura el guion usando el narration-template.sh, genera los archivos de audio con Kokoro (pf_dora --speed 0.98) y mide las duraciones con ffprobe para sincronizar con las escenas.
Ir al módulo 2.3 →