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:

  1. 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.
  2. 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.
  3. 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

Pipeline de Whisper: audio → mel → codificador → decodificador → texto

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

  1. 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.
  2. Medio. Construye el espectrograma log-mel completo usando numpy.fft. Verifica que los 80 mel bins coincidan con librosa.feature.melspectrogram(n_mels=80) dentro del margen de error numérico.
  3. 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

0 lifetime access. Curriculum based on AI Engineering from Scratch by Rohit Ghumare (MIT, used under attribution).