PTENES
MÓDULO 2.3

📝 Guion y narración TTS

Aprende a escribir un SCRIPT punto M D con 6–9 escenas en un arco dramático, generar narración PT-BR local con Kokoro, expandir siglas para el TTS y medir duraciones con ffprobe, todo sin una clave de API.

6
Temas
~30
Minutos
Práctico
Nivel
Manos a la obra
Tipo
Guion → Narración TTS SCRIPT.md · sN.txt · pf_dora · sN.wav SCRIPT punto M D 6–9 escenas assets/txt/ sN punto txt habla expandida Kokoro pf_dora PT-BR --speed 0.98 audio/ sN punto wav ~12s/escena ① GUION ② TEXTO ③ TTS ④ WAV 📏 ffprobe — medir la duración -show_entries format=duration · noprint_wrappers=1:nokey=1
1

🎬 SCRIPT punto M D con 6–9 escenas

El SCRIPT punto M D es el corazón de tu video. Describe cada escena en texto: lo que aparece en pantalla y lo que se dice. Un arco bien estructurado garantiza la máxima retención en videos cortos.

Concepto principal

El SCRIPT punto M D sigue un arco dramático de 8 etapas: hook → primer principio → mecánica → concepto clave → aplicación → avanzado → ejemplo real → cierre → CTA. Cada etapa es una escena. El arco está pensado para mantener la atención desde el inicio hasta el CTA de inema punto club.

Los videos de ~100 segundos de habla (≈ 1:50 de video) tienen mejor retención y caben como Shorts. Cada escena debe tener 1–3 frases, nunca un monólogo.

Arco de 8–9 escenas
1
Hook — la promesa

Primera frase que llama la atención de inmediato. Pregunta, afirmación audaz o dato sorprendente. Ej.: "¿Y si pudieras crear videos profesionales sin pagar nada?"

2
Primer principio — fundamento

Explica el concepto más básico. Sin jerga. Un párrafo que cualquiera pueda entender. Aquí nace la comprensión.

3
Mecánica — cómo funciona

Detalla el mecanismo interno: Chrome captura frames, FFmpeg codifica, Kokoro habla. Técnico, pero directo.

4
Concepto clave: la idea

La idea que cambia la forma de ver el problema. Normalmente, una frase memorable. Ej.: "El navegador es una cámara de cine."

5
Aplicación — en la práctica

Primer comando o paso concreto. El espectador ve cómo usarlo. Ej.: "Ejecuta npx hyperframes init y el proyecto ya estará configurado."

6
Avanzado — nivel superior

Recurso que distingue al usuario principiante del avanzado. Hooks, flags, voces alternativas, dos formatos. Genera curiosidad y valor.

7
Ejemplo real: prueba social

Este video se hizo con la propia herramienta. O incluye un enlace, una captura de pantalla o un resultado concreto. Rompe el escepticismo.

8
Cierre — síntesis

Una frase que cierra el ciclo del hook. Refuerza la transformación que vivirá quien vea el video. Breve y contundente.

9
CTA — inema punto club

Invita al curso completo en inema punto club. Siempre la última escena. Directo y con una acción clara: "Accede a inema punto club ahora."

Estructura del SCRIPT punto M D
# SCRIPT.md — ejemplo para un video sobre HyperFrames Skills
## Escena 1 — Hook
**Pantalla:** título "Skills en Claude Code" fadeIn
**Habla:** "¿Qué son realmente las Skills en Claude Code?"

## Escena 2 — Primer principio
**Pantalla:** diagrama de carpeta + SKILL.md
**Habla:** "Una Skill es solo una carpeta con un archivo llamado SKILL punto M D."

## ... (escenas 3–8)

## Escena 9 — CTA
**Pantalla:** logo INEMA.CLUB + URL
**Habla:** "Curso completo en inema punto club."
✓ Buenas prácticas de guion
  • ✓ Cada escena tiene un único foco — no mezcles dos conceptos
  • ✓ Narración de 1–3 frases por escena (≤15 segundos)
  • ✓ Duración total del habla ≈ 100s para un video de ~1:50
  • ✓ Termina siempre con un CTA explícito
✗ Errores de guion
  • ✗ Escenas demasiado largas — la atención cae después de 15s
  • ✗ Hook sin tensión — no promete una transformación
  • ✗ Saltar directamente de los fundamentos al nivel avanzado
  • ✗ Olvidar el CTA: sin él, el video no convierte
Conceptos clave
🎯
Arco dramático
8–9 etapas
⏱️
~100s de fala
≈ video de 1:50
📌
1–3 frases/escena
Retención máxima
📣
CTA final
inema.club
2

✂️ Narración breve por escena

Cada escena recibe de 1 a 3 frases de narración. El total de ~100 segundos de voz produce aproximadamente 1 minuto y 50 segundos de video — ideal para la retención y compatible con Shorts.

Regla de los 100 segundos

Las personas retienen más información en videos cortos. Con ~100s de habla en total, cada escena dura ≈11–17 segundos: tiempo suficiente para asimilar una idea y lo bastante rápido para no aburrir.

8 escenas
×12,5 s de promedio
~100s
de voz total
≈1:50
de video final
Ejemplo real: 8 escenas del narration-template punto sh
# assets/narration.sh — fragmento con write() por escena
write s1 "¿Qué son realmente las Skills en Claude Code?"
write s2 "Una Skill es solo una carpeta con un archivo llamado SKILL punto M D."
write s3 "Todo SKILL punto M D empieza con dos líneas: name y description."
write s4 "Divulgación progresiva: Claude carga solo lo que necesita, cuando lo necesita."
write s5 "Las Skills se encuentran en punto claude barra skills de tu proyecto o en la carpeta global."
write s6 "En el nivel avanzado, una Skill incluye scripts, paletas y plantillas completas."
write s7 "Este video se hizo con la Skill HyperFrames. Una skill, un flujo, un resultado."
write s8 "Empieza con algo sencillo. Curso completo en inema punto club."
💡
Frase corta = habla natural

Kokoro TTS funciona mejor con frases simples y directas. Evita el uso excesivo del gerundio, las subordinadas largas o las listas habladas. Si necesitas una pausa, divide el texto en dos frases separadas por un punto.

Comparativa: distribución del tiempo por escena
Escena 1
~8s
Escenas 2–7
~72s
Escena 8
~6s
CTA final
~5s
Narración
CTA/Cierre
Conceptos clave
✂️
1–3 frases
por escena
📐
~12s/escena
promedio ideal
⏱️
100s en total
habla acumulada
📱
Cabe en Shorts
≤60s en pantalla
3

🗣️ Expandir siglas para la narración

Kokoro TTS lee el texto literalmente. Las siglas, extensiones de archivo y URL deben escribirse tal como se pronuncian, o el TTS las pronunciará de forma extraña o incomprensible.

Regla de expansión

El texto del archivo sN.txt está escrito para oídos, no para los ojos. Cualquier símbolo, sigla o ruta que no sea una palabra pronunciable debe sustituirse por su pronunciación exacta.

Tabla de expansiones obligatorias
Texto escrito Di en sN.txt Razón
SKILL.md SKILL punto M D extensión de archivo
.claude/skills punto claude barra skills ruta con símbolos
inema.club inema punto club URL / dominio
build-index.mjs build guion index punto M J S nombre de archivo
s1.txt S un punto T X T nombre de archivo
--speed 0.98 speed cero punto noventa y ocho flag CLI con número
pf_dora P F underscore dora identificador de voz
npx hyperframes N P X hyperframes sigla + comando
Ejemplo: s2.txt, texto expandido para TTS
# assets/txt/s2.txt — versión para que la lea el TTS
"Empieza por lo esencial. Una Skill es solo una carpeta con un archivo llamado
SKILL punto M D. Dentro, instrucciones en Markdown que enseñan a Claude
para hacer algo específico: crear videos, revisar código, diseñar interfaces.
Es conocimiento empaquetado."

# NO escribas: "SKILL.md" → el TTS leería "esquil punto md" o se equivocaría
# NO escribas: ".claude/skills" → se leería mal como "punto claude barra skills"
✓ Expansiones correctas
  • ✓ "punto claude barra skills" para .claude/skills
  • ✓ "inema punto club" para inema.club
  • ✓ "SKILL punto M D" para SKILL.md
  • ✓ Prueba la pronunciación en voz alta antes de guardar
✗ Errores de expansión
  • ✗ Dejar SKILL.md sin expandir
  • ✗ Usar URL literal https://inema.club
  • ✗ Escribir comandos bash como npx --help
  • ✗ Poner listas con guiones — el TTS lee el guion en voz alta
💡
Consejo: dos archivos, dos propósitos

Mantén el SCRIPT punto M D con el texto "visual" (con siglas, paths y URLs normales) como referencia humana. El archivo sN.txt es la versión «para los oídos»: el texto ya expandido que va al TTS. Son documentos diferentes con propósitos diferentes.

Conceptos clave
👁️
Texto visual
SCRIPT.md
👂
Texto hablado
sN.txt
🔤
Expansión
punto, barra, guion
🎤
Prueba oral
Lee en voz alta
4

🔊 Generar WAV con Kokoro

Con los archivos sN.txt listos y expandidos, el comando npx hyperframes tts genera los WAVs localmente. La primera ejecución descarga ~340 MB del modelo Kokoro automáticamente.

Comando exacto — npx hyperframes tts
# Genera la narración para la escena 1
npx hyperframes tts "assets/txt/s1.txt" \
--voice pf_dora \
--speed 0.98 \
--output assets/audio/s1.wav

# Bucle para todas las escenas (narration.sh)
for i in 1 2 3 4 5 6 7 8; del
npx hyperframes tts "assets/txt/s$i.txt" \
--voice pf_dora --speed 0.98 \
--output "assets/audio/s$i.wav"
done
⚠️
Primera ejecución: descarga de ~340 MB

La primera vez que lo ejecutas npx hyperframes tts, Kokoro descarga el modelo de voz (~340 MB) automáticamente. Sin clave, sin espeak-ng, sin configuración. Después de la descarga, las siguientes ejecuciones son instantáneas. Asegúrate de tener conexión la primera vez.

¿Por qué --speed 0.98?

La velocidad predeterminada de Kokoro suena ligeramente demasiado rápida para narraciones técnicas en portugués. Con --speed 0.98 la voz se oye natural, sin sonar lenta. No subas de 1.05 — la voz suena metálica.

0.80
Muy despacio
0.98 ✓
Ideal en PT-BR
1.05+
Metálico
💡
Genera un WAV de prueba antes del ciclo completo

Ejecuta solo la escena 1 primero. Escucha el resultado. Si la pronunciación de alguna expansión suena extraña, corrige el s1.txt antes de generar los otros 7 archivos. Rehacer cada escena es mucho más rápido que volver a hacer todo.

Conceptos clave
🔊
npx hyperframes tts
comando generador
🎙️
pf_dora
voz predeterminada PT-BR
⚡
--speed 0.98
natural y fluido
📦
~340 MB
descarga única
5

📏 Medir duraciones con ffprobe

Antes de montar las escenas en el build-index.mjs, necesitas saber exactamente cuántos segundos dura cada narración. El ffprobe devuelve la duración del WAV en segundos en una línea.

¿Por qué medir antes de montar?

O build-index.mjs define cuánto tiempo permanece cada escena en pantalla mediante LEAD, TAIL y la duración del audio. Si no sabes la duración exacta del WAV, el texto desaparecerá de la pantalla antes de que termine la voz, o se quedará inmóvil demasiado tiempo.

Comandos de ffprobe: duración de un WAV y loop completo
# Duración de un archivo único
ffprobe -v error \
-show_entries format=duration \
-of default=noprint_wrappers=1:nokey=1 \
assets/audio/s1.wav
# Salida: 12.384000

# Bucle — medir todas las escenas de una vez
for i in 1 2 3 4 5 6 7 8; del
d=$(ffprobe -v error -show_entries format=duration \
-of default=noprint_wrappers=1:nokey=1 \
"assets/audio/s$i.wav" 2>/dev/null)
echo "s$i: ${d}s"
done
📊 Valores de referencia (narration-template real)
s1
~8–10s
hook corto
s2–s6
~12–18s
desarrollo
s7
~8–12s
ejemplo real
s8
~5–8s
CTA rápida
✓ Flujo de trabajo correcto
  • ✓ Genera todos los WAV primero y luego mide
  • ✓ Anota las duraciones en SCRIPT punto M D
  • ✓ Usa las duraciones en build-index para definir el timing
  • ✓ LEAD=0.5 antes de la voz + TAIL=0.9 después de la voz
✗ Errores de timing
  • ✗ Usar la duración estimada: mide siempre el WAV real
  • ✗ Cortar la escena antes de que termine el audio
  • ✗ No dejes el LEAD antes de que empiece la narración
  • ✗ Olvidar FADE=0.45 al final de la escena
💡
Valores de timing predeterminados del pipeline

O build-index.mjs usa por defecto: LEAD=0.5 (silencio antes de la voz), TAIL=0.9 (silencio después de la voz) y FADE=0.45 (fade-out de salida). La duración total de la escena = LEAD + duración_del_wav + TAIL.

Conceptos clave
📏
ffprobe
mide WAV
⏩
LEAD=0.5
antes del diálogo
⏸️
TAIL=0.9
después del diálogo
🌅
FADE=0.45
fade-out final
6

🎚️ Voces PT-BR disponibles

Kokoro tiene tres voces PT-BR listas para usar: pf_dora (femenina, recomendada por defecto), pm_alex e pm_santa. Cada voz tiene un timbre distinto: elige según el tono del video.

🎙️
pf_dora
PT-BR · Femenina

Voz femenina clara y natural en portugués de Brasil. Es la voz predeterminada de narration-template.sh y la recomendada para todos los videos del pipeline HyperFrames.

--voice pf_dora --speed 0.98
🎤
pm_alex
PT-BR · Masculina

Voz masculina grave, ideal para contenido más serio o técnico. Una alternativa para variar en series largas o cuando el tono exige más autoridad.

--voice pm_alex --speed 0.98
🔈
pm_santa
PT-BR · Alternativa

Tercera opción PT-BR con un timbre distinto. Úsala para probar si el contenido específico suena más natural con esa voz o para hacer un A/B test de retención.

--voice pm_santa --speed 0.98
✓ Buenas prácticas de voz
  • ✓ Usa pf_dora como predeterminada — es la más probada
  • ✓ Mantén la misma voz en todo el video
  • ✓ Prueba primero la voz con la escena de mayor complejidad
  • ✓ Velocidad 0.95–1.00 para narración técnica
✗ Errores con voces
  • ✗ Mezclar voces dentro del mismo video
  • ✗ Speed por encima de 1.05 — suena robótico
  • ✗ Speed por debajo de 0.85 — arrastra demasiado
  • ✗ Intentar instalar espeak-ng — Kokoro no lo necesita
📊 Comparación técnica de las voces
Voz Género Timbre Mejor para
pf_dora Femenina Claro, natural Cursos, tutoriales, estándar
pm_alex Femenina Grave, autoritativo Tecnología seria, demostraciones
pm_santa Femenina Diferenciado Prueba A/B, variedad
💡
Sin espeak-ng, sin clave, sin cuenta

Kokoro tiene un fonemizador nativo para PT-BR: no necesita espeak-ng, que otros motores TTS de código abierto requieren. Sin clave de API ni cuenta en una plataforma. Instalar espeak-ng incluso puede entrar en conflicto con la fonética de Kokoro, así que evítalo.

Conceptos clave
🏆
pf_dora
recomendado
3️⃣
3 voces PT-BR
dora, alex, santa
🚫
Sin espeak-ng
fonética nativa
🔑
Sin clave
local y gratuito

📋 Resumen del Módulo 2.3

Qué aprendiste
  • ✓ SCRIPT punto M D con un arco de 8–9 escenas: hook → principio → mecánica → insight → aplicación → avanzado → ejemplo → cierre → CTA
  • ✓ Narración de 1–3 frases por escena; ~100s de habla en total ≈ 1:50 de video
  • ✓ Expansión de siglas: "SKILL.md" → "SKILL punto M D"; ".claude/skills" → "punto claude barra skills"; "inema.club" → "inema punto club"
  • ✓ Generar WAV: npx hyperframes tts "assets/txt/s1.txt" --voice pf_dora --speed 0.98 --output assets/audio/s1.wav
  • ✓ Medir la duración: ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 assets/audio/s1.wav
  • ✓ Voces PT-BR: pf_dora (por defecto), pm_alex, pm_santa — sin espeak-ng, sin clave, ~340 MB de descarga única
Próximo módulo
2.4
🎞️ Composición de escenas
Monta las escenas en el build-index.mjs usando las duraciones de los WAV. Define LEAD, TAIL, FADE y los tiempos de cada animación para generar el index.html final listo para renderizar.
Ir al módulo 2.4 →