Phase 07 - Lesson 10
Transformers de Audio — Arquitectura Whisper
This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.
El audio es una imagen de la frecuencia a lo largo del tiempo. Whisper es un ViT que consume espectrogramas mel y habla de vuelta.
Tipo: Aprender Lenguajes: Python Prerrequisitos: Fase 7 · 05 (Full Transformer), Fase 7 · 08 (Encoder-Decoder), Fase 7 · 09 (ViT) Tiempo: ~45 minutos
El Problema
Antes de Whisper (OpenAI, Radford et al. 2022), el estado del arte en reconocimiento automático del habla (ASR) significaba wav2vec 2.0 y HuBERT: extractores de características auto-supervisados combinados con un cabezal ajustado (fine-tuned head). Alta calidad, pipelines de datos costosos y sensibilidad al dominio. El reconocimiento de voz multilenguaje requería modelos independientes por familia de idiomas.
Whisper hizo tres apuestas:
- Entrenar con todo. 680,000 horas de audio con etiquetado débil (weakly-labeled) recopiladas de internet en 97 idiomas. Sin corpus académico limpio. Sin etiquetas de fonemas.
- Modelo único multitarea. Un decodificador entrenado conjuntamente en transcripción, traducción, detección de actividad de voz, identificación de idioma y marcado de tiempo (timestamping) a través de tokens de tarea.
- Transformer codificador-decodificador estándar. El codificador consume espectrogramas log-mel. El decodificador produce tokens de texto de forma autorregresiva. Sin vocoder, sin CTC, sin HMM.
El resultado: Whisper large-v3 es robusto frente a acentos, ruido e idiomas que tienen cero datos etiquetados limpios. Es el front-end de voz predeterminado para todos los asistentes de voz de código abierto y la mayoría de los comerciales en 2026.
El Concepto
Paso 1 — remuestreo + ventanas
Audio a 16 kHz. Recortar/rellenar a 30 segundos. Calcular el espectrograma log-mel: 80 contenedores de mel (mel bins), stride de 10 ms → ~3,000 frames × 80 características. Esta es la "imagen de entrada" que ve Whisper.
Paso 2 — tronco convolucional
Dos capas Conv1D con kernel 3 y stride 2 reducen los 3,000 frames a 1,500. Esto reduce a la mitad la longitud de la secuencia sin agregar muchos parámetros.
Paso 3 — codificador
Un codificador transformer de 24 capas (para la versión large) sobre 1,500 pasos de tiempo. Codificación posicional sinusoidal, autoatención, FFN con GELU. Produce 1,500 × 1,280 estados ocultos (hidden states).
Paso 4 — decodificador
Un decodificador transformer de 24 capas. Produce de forma autorregresiva tokens a partir de un vocabulario BPE que es un superconjunto del de GPT-2 con algunos tokens especiales específicos para audio.
Paso 5 — tokens de tarea
El prompt del decodificador comienza con tokens de control que le indican al modelo qué hacer:
<|startoftranscript|> <|en|> <|transcribe|> <|0.00|>
ou
<|startoftranscript|> <|fr|> <|translate|> <|0.00|>
El modelo fue entrenado bajo esta convención. Controlas la tarea mediante el prefijo. El equivalente en 2026 al ajuste de instrucciones (instruction-tuning), pero aplicado al habla.
Paso 6 — salida
Búsqueda de haz (beam search con ancho 5) con un umbral de log-probabilidad. Las marcas de tiempo (timestamps) se predicen cada 0.02 segundos de audio cuando el token <|notimestamps|> está ausente.
Tamaños de Whisper
| Modelo | Parámetros | Capas | d_model | Cabezas | VRAM (fp16) |
|---|---|---|---|---|---|
| Tiny | 39M | 4 | 384 | 6 | ~1 GB |
| Base | 74M | 6 | 512 | 8 | ~1 GB |
| Small | 244M | 12 | 768 | 12 | ~2 GB |
| Medium | 769M | 24 | 1024 | 16 | ~5 GB |
| Large | 1550M | 32 | 1280 | 20 | ~10 GB |
| Large-v3 | 1550M | 32 | 1280 | 20 | ~10 GB |
| Large-v3-turbo | 809M | 32 | 1280 | 20 | ~6 GB (decodificador de 4 capas) |
Large-v3-turbo (2024) redujo el decodificador de 32 a 4 capas. Decodificación 8× más rápida con una regresión de <1 punto de WER (Word Error Rate). Esta optimización en la velocidad de decodificación es la razón por la cual Whisper-turbo es el estándar para agentes de voz en tiempo real en 2026.
Lo que Whisper no hace
- Sin diarización (quién está hablando). Combínalo con pyannote para eso.
- Sin streaming nativo en tiempo real: la ventana de 30 segundos es fija. Los wrappers modernos (
faster-whisper,WhisperX) incorporan streaming mediante VAD + superposición (overlap). - Sin contexto de formato largo más allá de 30 s sin fragmentación (chunking) externa. Funciona bien en la práctica porque el habla humana rara vez necesita un contexto de largo alcance para la transcripción.
El panorama en 2026
| Tarea | Modelo | Notas |
|---|---|---|
| ASR en Inglés | Whisper-turbo, Moonshine | Moonshine es 4× más rápido en el borde (edge) |
| ASR Multilingüe | Whisper-large-v3 | 97 idiomas |
| ASR en Streaming | faster-whisper + VAD | Metas de latencia de 150 ms alcanzables |
| TTS | Piper, XTTS-v2, Kokoro | Patrón codificador-decodificador, pero con formato de Whisper |
| Audio + lenguaje | AudioLM, SeamlessM4T | Tokens de texto + tokens de audio en un solo transformer |
Constrúyelo
Consulta code/main.py. No entrenamos Whisper: construimos el pipeline del espectrograma log-mel + el formateador de prompts con tokens de tarea. Estas son las partes que realmente se tocan en producción.
Paso 1: sintetizar audio
Generar una onda senoidal de 1 segundo a 440 Hz muestreada a 16 kHz. 16,000 muestras.
Paso 2: espectrograma log-mel (simplificado)
El espectrograma mel completo requiere FFT. Hacemos una versión simplificada de encuadre (framing) + energía por frame que muestra el pipeline sin requerir librosa:
def frame_signal(x, frame_size=400, hop=160):
frames = []
for start in range(0, len(x) - frame_size + 1, hop):
frames.append(x[start:start + frame_size])
return frames
Frame = 25 ms, hop = 10 ms. Coincide con las ventanas de Whisper. La energía por frame reemplaza a los mel bins con fines didácticos.
Paso 3: rellenar a 30 s
Whisper siempre procesa fragmentos de 30 segundos. Rellena (o recorta) el espectrograma a 3,000 frames.
Paso 4: construir los tokens del prompt
def whisper_prompt(lang="en", task="transcribe", timestamps=True):
tokens = ["<|startoftranscript|>", f"<|{lang}|>", f"<|{task}|>"]
if not timestamps:
tokens.append("<|notimestamps|>")
return tokens
Esa es toda la interfaz de control de tareas. Un prefijo de 4 tokens.
Úsalo
import whisper
model = whisper.load_model("large-v3-turbo")
result = model.transcribe("meeting.wav", language="en", task="transcribe")
print(result["text"])
print(result["segments"][0]["start"], result["segments"][0]["end"])
Más rápido, compatible con OpenAI:
from faster_whisper import WhisperModel
model = WhisperModel("large-v3-turbo", compute_type="int8_float16")
segments, info = model.transcribe("meeting.wav", vad_filter=True)
for s in segments:
print(f"{s.start:.2f} - {s.end:.2f}: {s.text}")
Cuándo elegir Whisper en 2026:
- ASR multilenguaje con un solo modelo.
- Transcripción robusta de audio ruidoso y diverso.
- Investigación / prototipo de ASR: el punto de partida más rápido.
Cuándo elegir otra opción:
- Streaming con latencia ultra-baja en el borde (edge): Moonshine supera a Whisper con calidad equivalente.
- IA conversacional en tiempo real que requiera <200 ms: ASR dedicado para streaming.
- Diarización de locutores: Whisper no hace esto; añade pyannote.
Ponlo en producción
Consulta outputs/skill-asr-configurator.md. La skill elige un modelo ASR, parámetros de decodificación y pipeline de preprocesamiento para una nueva aplicación de voz.
Ejercicios
- Fácil. Ejecuta
code/main.py. Confirma que el conteo de frames para una señal de 1 segundo a 16 kHz con un salto (hop) de 10 ms es de ~100 frames. Para 30 segundos: ~3,000 frames. - Medio. Construye el espectrograma log-mel completo usando
numpy.fft. Verifica que los 80 mel bins coincidan conlibrosa.feature.melspectrogram(n_mels=80)dentro del margen de error numérico. - Difícil. Implementa la inferencia en streaming: fragmenta el audio en ventanas de 10 s con una superposición de 2 s, ejecuta Whisper en cada fragmento y fusiona las transcripciones. Mide la tasa de error de palabras (WER) en comparación con una sola pasada en una muestra de podcast de 5 minutos.
Términos Clave
| Término | Lo que la gente dice | Lo que realmente significa |
|---|---|---|
| Espectrograma de mel | "Imagen de audio" | Representación 2D: contenedores de frecuencia en un eje, frames de tiempo en el otro; energía logarítmica por celda. |
| Log-mel | "Lo que Whisper ve" | Espectrograma de mel pasado por logaritmo; se aproxima a la percepción humana del volumen. |
| Frame | "Una porción de tiempo" | Una ventana de muestras de 25 ms; superpuesta con un stride de 10 ms. |
| Token de tarea | "Prefijo de prompt para voz" | Tokens especiales como `< |
| Detección de actividad de voz (VAD) | "Encontrar la voz" | Filtro que elimina el silencio antes del ASR; reduce costos masivamente. |
| CTC | "Connectionist Temporal Classification" | Pérdida clásica de ASR para entrenamiento libre de alineación; Whisper NO la utiliza. |
| Whisper-turbo | "Decodificador pequeño, codificador completo" | Codificador large-v3 + decodificador de 4 capas; decodificación 8× más rápida. |
| Faster-whisper | "El wrapper de producción" | Reimplantación de CTranslate2; cuantización int8; 4× más rápido que la referencia de OpenAI. |
Lecturas Adicionales
- Radford et al. (2022). Robust Speech Recognition via Large-Scale Weak Supervision — Artículo de Whisper.
- OpenAI Whisper repo — código de referencia + pesos del modelo. Lee
whisper/model.pypara ver el tronco Conv1D + codificador + decodificador de extremo a extremo en ~400 líneas. - OpenAI Whisper —
whisper/decoding.py— la lógica de búsqueda de haz (beam-search) + tokens de tarea descrita en los Pasos 5–6 está aquí; 500 líneas, completamente legible. - Baevski et al. (2020). wav2vec 2.0: A Framework for Self-Supervised Learning of Speech Representations — precursor; todavía cuenta con características SOTA en algunos entornos.
- SYSTRAN/faster-whisper — wrapper de producción, 4× más rápido que la referencia.
- Jia et al. (2024). Moonshine: Speech Recognition for Live Transcription and Voice Commands — ASR de 2024 adaptado para el borde (edge), con formato similar al de Whisper pero de menor tamaño.
- HuggingFace blog — "Fine-Tune Whisper For Multilingual ASR with Transformers" — receta canónica de ajuste fino que incluye el preprocesador del espectrograma de mel y el manejo de marcas de tiempo de tokens.
- HuggingFace
modeling_whisper.py— implementación completa (codificador, decodificador, atención cruzada, generación) que refleja el diagrama de arquitectura de la lección.