Phase 06 - Lesson 07
Text-to-Speech (TTS) — de Tacotron a F5 y Kokoro
El ASR invierte el habla a texto; el TTS invierte el texto a habla. El stack de 2026 tiene tres partes: texto → tokens, tokens → mel, mel → forma de onda. Cada parte tiene un modelo por defecto que cabe en una laptop.
Tipo: Build Lenguajes: Python Requisitos previos: Fase 6 · 02 (Espectrogramas y Mel), Fase 5 · 09 (Seq2Seq), Fase 7 · 05 (Transformer Completo) Tiempo: ~75 minutos
El Problema
Tienes una cadena: "Please remind me to water the plants at 6 pm." Necesitas un clip de audio de 3 segundos que suene natural, tenga la prosodia correcta (pausas, enfasis), pronuncie "plants" con la vocal correcta y se ejecute en menos de 300 ms en una CPU para un asistente de voz en vivo. Tambien necesitas cambiar de voces, manejar entradas con cambio de codigo ("remind me at 6 pm, daijoubu?") y no hacer el ridiculo con nombres propios.
Los pipelines modernos de TTS lucen asi:
- Frontend de texto. Normaliza el texto (fechas, numeros, correos), convierte a fonemas o tokens de subpalabra, predice features de prosodia.
- Modelo acustico. Texto → espectrograma mel. Tacotron 2 (2017), FastSpeech 2 (2020), VITS (2021), F5-TTS (2024), Kokoro (2024).
- Vocoder. Mel → forma de onda. WaveNet (2016), WaveRNN, HiFi-GAN (2020), BigVGAN (2022), vocoders de codec neural en 2024+.
En 2026 la division acustico + vocoder se difumina con modelos end-to-end de difusion y flow-matching. Pero el modelo mental de tres partes sigue siendo valido para depurar.
El Concepto
Tacotron 2 (2017). Seq2seq: char-embedding → encoder BiLSTM → atencion sensible a la ubicacion → decoder LSTM autorregresivo que emite frames de mel. Lento (AR), inestable en textos largos. Aun se cita como baseline.
FastSpeech 2 (2020). No autorregresivo. El predictor de duracion genera cuantos frames de mel recibe cada fonema. Una sola pasada, 10x mas rapido que Tacotron. Pierde algo de naturalidad (alineamiento monotonico) pero se despliega en todas partes.
VITS (2021). Entrena conjuntamente encoder + duracion basada en flow + vocoder HiFi-GAN end-to-end con inferencia variacional. Alta calidad, modelo unico. TTS open-source dominante en 2022–2024. Variantes: YourTTS (multi-hablante zero-shot), XTTS v2 (2024, Coqui).
F5-TTS (2024). Transformer de difusion sobre flow matching. Prosodia natural, clonacion de voz zero-shot con 5 segundos de audio de referencia. En la cima de los rankings de TTS open-source de 2026. 335M de parametros.
Kokoro (2024). Pequeno (82M), ejecutable en CPU, el mejor TTS de ingles de su categoria para uso en tiempo real. Solo ingles con vocabulario cerrado, apache-2.0.
OpenAI TTS-1-HD, ElevenLabs v2.5, Google Chirp-3. Estado del arte comercial. Las etiquetas de emocion de ElevenLabs v2.5 ("[whispered]", "[laughing]") y las voces de personaje dominan la produccion de audiolibros en 2026.
Evolucion del vocoder
| Era | Vocoder | Latencia | Calidad |
|---|---|---|---|
| 2016 | WaveNet | solo offline | SOTA al lanzamiento |
| 2018 | WaveRNN | ~tiempo real | buena |
| 2020 | HiFi-GAN | 100x tiempo real | casi humana |
| 2022 | BigVGAN | 50x tiempo real | generaliza entre hablantes/lenguas |
| 2024 | SNAC, DAC (codecs neuronales) | integrados con modelos AR | tokens discretos, eficientes en bits |
Para 2026 la mayoria de los modelos de "TTS" son end-to-end de texto a forma de onda; el espectrograma mel es una representacion interna.
Evaluacion
- MOS (Mean Opinion Score). Escala de 1–5, obtenida por crowdsourcing. Sigue siendo el estandar de oro; dolorosamente lento.
- CMOS (Comparative MOS). Preferencia A-vs-B. Intervalos de confianza mas ajustados por anotacion.
- UTMOS, DNSMOS. Predictores neuronales de MOS sin referencia. Usados en rankings.
- CER (Character Error Rate) via ASR. Pasa la salida del TTS por Whisper, calcula el CER contra el texto de entrada. Proxy de inteligibilidad.
- SECS (Speaker Embedding Cosine Similarity). Calidad de la clonacion de voz.
Numeros de 2026 en LibriTTS test-clean:
| Modelo | UTMOS | CER (via Whisper) | Tamano |
|---|---|---|---|
| Ground truth | 4.08 | 1.2% | — |
| F5-TTS | 3.95 | 2.1% | 335M |
| XTTS v2 | 3.81 | 3.5% | 470M |
| VITS | 3.62 | 3.1% | 25M |
| Kokoro v0.19 | 3.87 | 1.8% | 82M |
| Parler-TTS Large | 3.76 | 2.8% | 2.3B |
Construyelo
Paso 1: fonemiza la entrada
from phonemizer import phonemize
ph = phonemize("Hello world", language="en-us", backend="espeak")
# 'həloʊ wɜːld'
Los fonemas son el puente universal. Evita alimentar texto crudo a cualquier cosa por debajo del nivel de calidad de VITS.
Paso 2: ejecuta Kokoro (por defecto para CPU en 2026)
from kokoro import KPipeline
tts = KPipeline(lang_code="a") # "a" = American English
audio, sr = tts("Please remind me to water the plants at 6 pm.", voice="af_bella")
# audio: float32 tensor, sr=24000
Se ejecuta offline, archivo unico, 82M de parametros.
Paso 3: ejecuta F5-TTS con clonacion de voz
from f5_tts.api import F5TTS
tts = F5TTS()
wav = tts.infer(
ref_file="my_voice_5s.wav",
ref_text="The quick brown fox jumps over the lazy dog.",
gen_text="Please remind me to water the plants.",
)
Pasa un clip de referencia de 5 segundos + su transcripcion; F5 clona prosodia y timbre.
Paso 4: vocoder HiFi-GAN desde cero
Demasiado grande para caber en un script de tutorial, pero la forma es:
class HiFiGAN(nn.Module):
def __init__(self, mel_channels=80, upsample_rates=[8, 8, 2, 2]):
super().__init__()
# 4 upsample blocks, total 256x to go from mel-rate to audio-rate
...
def forward(self, mel):
return self.blocks(mel) # -> waveform
Entrenamiento: adversarial (discriminador sobre ventanas cortas) + perdida de reconstruccion del espectrograma mel + perdida de feature-matching. Comoditizado — usa checkpoints preentrenados del repo hifi-gan o de nvidia-NeMo.
Paso 5: el pipeline completo (pseudocodigo)
text = "Please remind me at 6 pm."
phones = phonemize(text)
mel = acoustic_model(phones, speaker=alice) # [T, 80]
wav = vocoder(mel) # [T * 256]
soundfile.write("out.wav", wav, 24000)
Usalo
El stack de 2026:
| Situacion | Eleccion |
|---|---|
| Asistente de voz en ingles en tiempo real | Kokoro (CPU) o XTTS v2 (GPU) |
| Clonacion de voz desde referencia de 5 s | F5-TTS |
| Voces comerciales de personaje | ElevenLabs v2.5 |
| Narracion de audiolibro | ElevenLabs v2.5 o XTTS v2 + fine-tune |
| Lengua de pocos recursos | Entrena VITS con 5–20 h de datos en la lengua objetivo |
| Etiquetas expresivas / de emocion | ElevenLabs v2.5 o fine-tune de StyleTTS 2 |
Lider open-source en 2026: F5-TTS para calidad, Kokoro para eficiencia. No recurras a Tacotron a menos que seas un historiador.
Errores Comunes
- Sin normalizador de texto. "Dr. Smith" se lee como "Doctor" o "Drive"? "2026" como "twenty twenty six" o "two zero two six"? Normaliza ANTES del fonemizador.
- Nombres propios fuera de vocabulario (OOV). "Ghumare" → "ghyu-mair"? Despliega un modelo de fallback grafema-a-fonema para tokens desconocidos.
- Clipping. La salida del vocoder rara vez satura, pero un desajuste de escala del mel en la inferencia puede sobrepasar ±1.0. Usa siempre
np.clip(wav, -1, 1). - Desajuste de tasa de muestreo. Kokoro genera 24 kHz; tu pipeline downstream espera 16 kHz → remuestrea o tendras aliasing.
Entregalo
Guarda como outputs/skill-tts-designer.md. Diseña un pipeline de TTS para un objetivo especifico de voz, latencia y lengua.
Ejercicios
- Facil. Ejecuta
code/main.py. Construye un diccionario de fonemas a partir de un vocabulario de juguete, estima la duracion por fonema e imprime un cronograma "mel" falso. - Medio. Instala Kokoro, sintetiza la misma frase en las voces
af_bellayam_adam. Compara las duraciones de audio y la calidad subjetiva. - Dificil. Graba un clip de referencia de 5 segundos de ti mismo. Usa F5-TTS para clonarlo. Reporta el SECS entre la referencia y la salida clonada.
Terminos Clave
| Termino | Lo que dice la gente | Lo que realmente significa |
|---|---|---|
| Fonema | Unidad de sonido | Clase sonora abstracta; 39 en ingles (ARPABet). |
| Predictor de duracion | Cuanto dura cada fonema | Salida de modelo no-AR; frames enteros por fonema. |
| Vocoder | Mel → forma de onda | Red neuronal que mapea espectrograma mel a muestras crudas. |
| HiFi-GAN | Vocoder estandar | Basado en GAN; dominante en 2020–2024. |
| MOS | Calidad subjetiva | Mean opinion score de 1–5 de evaluadores humanos. |
| SECS | Metrica de clonacion de voz | Similaridad de coseno entre el embedding de hablante objetivo y el de salida. |
| F5-TTS | SOTA open-source de 2024 | Difusion con flow-matching; clonacion zero-shot. |
| Kokoro | Lider en ingles en CPU | Modelo de 82M de parametros, Apache 2.0. |
Lecturas Adicionales
- Shen et al. (2017). Tacotron 2 — el baseline seq2seq.
- Kim, Kong, Son (2021). VITS — end-to-end basado en flow.
- Chen et al. (2024). F5-TTS — SOTA open-source actual.
- Kong, Kim, Bae (2020). HiFi-GAN — el vocoder que aun se despliega en 2026.
- Kokoro-82M en HuggingFace — TTS de ingles amigable con CPU de 2024.