Apunta al sitio del curso y genera videos en tres niveles —visión general, rutas y lecciones profundas por módulo— con el estilo dark premium ámbar, narración local y CTA para INEMA.CLUB.
escena illus · narración inemavox · subtítulo en el pie
El motor (engine.mjs) ya incluye el estilo, las animaciones y los tipos de escena. En el día a día solo escribes los specs de cada video — el resto es pipeline.
Un video de descripción general — la landing del curso y las trilhas (qué es, cifras, las N trilhas). ~45–60s, voz rachel.
Un video por trilha que muestra módulos y temas; opcionalmente, una intro por módulo. Nivel tráiler/roadmap. ~30–90s, voz rachel.
Una clase profunda por módulo ) (recorre los ~6 temas), bien ilustrada con SVG. ~3–4 min, voz bella.
⚠️ La clase profunda es por módulo, no por tema: 6 rutas × 6 módulos = 36 videos profundos, no 216.
La narración se genera primero; el build.mjs lee la duración real de cada WAV y sincroniza la animación y los subtítulos. Cambiar la voz implica cambiar solo la etapa de TTS — el resto queda idéntico.
Narración con voz clonada (inemavox / Chatterbox-VC) ejecutándose en 127.0.0.1. No cuesta nada y pronuncia bien términos en inglés entre el PT-BR.
El HTML generado es una composición HyperFrames con timeline GSAP pausada — renderizada a MP4 en 16:9 o 9:16.
title · topic · lead · bullets · cards · steps · term · compare · illus (SVG) · cta. La última siempre es el CTA de INEMA.CLUB.
El repo incluye la skill instalable videos-cursos-inema en skills/videos-cursos-inema/ — le enseña al agente a extraer el curso, escribir los specs y ejecutar el pipeline. Copia a ~/.claude/skills/ e invócala con /videos-cursos-inema.
Todo se ejecuta localmente. El único servicio externo es el daemon de voz, que funciona en 127.0.0.1.
Node 18+ (fetch nativo, ESM) y FFmpeg con ffmpeg/ffprobe en el PATH.
# revisa node -v && ffprobe -version
CLI vía npx (versión fija en package.json). Revisa el entorno.
# diagnóstico npx hyperframes doctor
Daemon inemavox en marcha y fuentes locales generadas una vez.
# voz curl 127.0.0.1:7860/health # fuentes node fetch-fonts.mjs
Cada video es una entrada en el objeto VIDEOS (en specs.mjs para las Partes 1–2, specs-deep.mjs para la Parte 3). El id siempre empieza con el slug del curso, por ejemplo: fep-deep-t1-m1.
Copia el esqueleto y completa las escenas. La última escena siempre es cta.
cp assets/spec-template.mjs specs.mjs # edita el objeto VIDEOS
Genera los archivos de texto de cada escena a partir del campo narration.
node write-txt.mjs <id> # -> assets/txt/<id>-sN.txt
Llama al daemon de voz y guarda los WAV. Usa bella (predeterminado) o rachel para las Partes 1–2.
node tts-inemavox.mjs <id> bella # -> assets/audio/<id>-sN.wav
Lee la duración real de los WAV y escribe el index.html. Sin flag = 16:9; --vertical = 9:16.
node build.mjs <id> # 16:9 node build.mjs <id> --vertical # 9:16 (Shorts/Reels)
El lint debe dar 0 errores. Revisa 1 frame por escena antes del render final; los renders son largos, ejecútalo en segundo plano.
npx hyperframes lint npx hyperframes render --quality high --output renders/<id>.mp4
Los valores predeterminados cubren el caso común; cada eje se puede cambiar sin modificar el resto del pipeline.