¿Cómo aprenden los modelos a oír?
El audio crudo es simplemente una secuencia de números — muestras de amplitud capturadas miles de veces por segundo. Un clip de 10 segundos a 16 kHz son 160,000 valores de punto flotante sin estructura inherente más allá de la forma de onda. ¿Cómo pasamos de este flujo plano de muestras a un modelo que entiende el habla, identifica hablantes o transcribe idiomas que nunca se le enseñaron explícitamente? La respuesta está en los codificadores de audio : modelos que comprimen audio crudo en representaciones compactas y significativas sobre las que los sistemas posteriores pueden razonar.
Han surgido tres paradigmas para entrenar estos codificadores, cada uno con una filosofía diferente sobre de dónde proviene la señal de aprendizaje:
- Supervisado con datos etiquetados (Whisper): recopilar cientos de miles de horas de audio emparejado con transcripciones, luego entrenar un transformer codificador-decodificador para predecir el texto. El codificador aprende representaciones porque debe hacerlo — el decodificador las necesita para producir transcripciones precisas.
- Aprendizaje contrastivo autosupervisado (wav2vec 2.0): enmascarar partes del audio, luego entrenar el modelo para distinguir el contenido enmascarado verdadero de distractores. No se necesitan transcripciones — el propio audio proporciona la señal de aprendizaje.
- Predicción enmascarada autosupervisada (HuBERT): agrupar tramas de audio en pseudo-etiquetas discretas offline, luego enmascarar tramas y predecir los IDs de clúster. Como el modelado de lenguaje enmascarado de BERT , pero para audio.
Esta progresión refleja lo que ocurrió en visión por computadora. La visión comenzó con entrenamiento supervisado en etiquetas de ImageNet, luego pasó a métodos autosupervisados como DINO y MAE que aprenden solo de imágenes. El audio siguió el mismo arco: Whisper demostró que el entrenamiento supervisado masivo produce excelente reconocimiento de voz, mientras que wav2vec 2.0 y HuBERT mostraron que el pre-entrenamiento autosupervisado produce representaciones de propósito general que se transfieren a tareas que nadie anticipó en el momento del entrenamiento. Examinemos cada enfoque en detalle.
Whisper: Supervisión a escala
Whisper (Radford et al., 2022) es el enfoque más simple conceptualmente: tomar una cantidad enorme de audio con transcripciones y entrenar un transformer estándar codificador -decodificador para predecir el texto. Lo que hace notable a Whisper no es la arquitectura sino la escala: 680,000 horas de audio multilingual débilmente supervisado recopilado de internet — aproximadamente 77 años de escucha continua. Este enfoque de fuerza bruta produjo un modelo que generaliza a través de acentos, idiomas y condiciones de grabación sin ningún truco específico de dominio.
La arquitectura tiene dos mitades. El codificador toma un espectrograma log-mel de 80 canales (una representación tiempo-frecuencia del audio, cubierta en un artículo anterior de este track) y lo pasa a través de dos capas convolucionales 1D con stride de 2, que submuestrean el eje temporal por 4x. El resultado alimenta un codificador transformer estándar con embeddings posicionales sinusoidales. Para un clip de audio de 30 segundos a 100 tramas por segundo (la tasa del espectrograma mel), las convoluciones reducen 3,000 tramas a 1,500 tramas, cada una representada como un vector de dimensión $d$. Esta es la representación que los sistemas posteriores pueden reutilizar.
El
decodificador
es un transformer autorregresivo que produce tokens de texto uno a la vez, atendiendo a la salida del codificador mediante
atención cruzada
. Lo que hace distintivo al decodificador de Whisper es su uso de tokens especiales para manejar múltiples tareas a través de un solo modelo. La secuencia de tokens podría verse así:
<|startoftranscript|> <|en|> <|transcribe|> <|0.00|> Hello world <|2.40|> <|endoftext|>
. El token de idioma (
<|en|>
) selecciona el idioma de salida, el token de tarea (
<|transcribe|>
o
<|translate|>
) elige entre transcripción y traducción, y los tokens de marca temporal (
<|0.00|>
) proporcionan la temporización a nivel de palabra. Una arquitectura, un conjunto de pesos, múltiples tareas — todo controlado por los tokens de prefijo en el decodificador.
Whisper viene en varios tamaños, desde Tiny (39M parámetros, 4 capas de codificador) hasta Large-v3 (1.55B parámetros, 32 capas de codificador). El escalado sigue un patrón familiar: los modelos más grandes son más precisos pero más lentos, con los saltos más grandes de Tiny a Small y de Medium a Large. Como referencia, el codificador Large-v3 solo tiene aproximadamente 600M parámetros — comparable a un modelo BERT-Large.
import json, js
# Whisper model sizes (from the paper, Table 1)
models = [
["Tiny", "39M", 4, 384, 6, 256, "~32x real-time"],
["Base", "74M", 6, 512, 8, 512, "~16x real-time"],
["Small", "244M", 12, 768, 12, 768, "~6x real-time"],
["Medium", "769M", 24, 1024, 16, 1024, "~2x real-time"],
["Large-v3", "1.55B", 32, 1280, 20, 1280, "~1x real-time"],
]
rows = []
for name, params, enc_layers, enc_dim, heads, dec_dim, speed in models:
rows.append([name, params, str(enc_layers), str(enc_dim), str(heads), str(dec_dim), speed])
js.window.py_table_data = json.dumps({
"headers": ["Model", "Params", "Enc Layers", "Enc Dim", "Heads", "Dec Dim", "Approx Speed"],
"rows": rows
})
print("Whisper model family: from 39M to 1.55B parameters")
print("All models share the same encoder-decoder architecture")
print("Trained on 680,000 hours of weakly-supervised multilingual audio")
¿Por qué importa Whisper como base más allá del reconocimiento de voz? Porque su codificador se ha convertido en el front-end de audio de facto para modelos de lenguaje multimodales. Qwen-Audio, Qwen2-Audio y Qwen2.5-Omni todos reutilizan un codificador Whisper pre-entrenado como su módulo de percepción de audio, conectando su salida a un modelo de lenguaje a través de una capa de proyección. Whisper estableció el pipeline — espectrograma mel a submuestreo convolucional a codificador transformer — como la forma estándar de convertir audio en representaciones continuas que los modelos de lenguaje pueden consumir.
wav2vec 2.0: Aprendiendo sin etiquetas
El enfoque de Whisper tiene un cuello de botella obvio: datos etiquetados. Transcribir audio requiere anotadores humanos, lo cual es costoso, lento y sesgado hacia idiomas con buenos recursos. El inglés tiene cientos de miles de horas de habla transcrita; muchos de los más de 7,000 idiomas del mundo tienen virtualmente ninguna. ¿Podemos aprender representaciones de audio a partir de audio crudo y no transcrito? Esa es la pregunta que wav2vec 2.0 (Baevski et al., 2020) responde con un rotundo sí.
La arquitectura tiene tres componentes que trabajan juntos en un bucle autosupervisado. Primero, un codificador de características : una red neuronal convolucional 1D de 7 capas que procesa la forma de onda cruda a 16 kHz directamente (sin necesidad de espectrograma). Cada capa aplica convolución, normalización de grupo y activación GELU, submuestreando progresivamente la señal. La tasa de salida es aproximadamente 50 Hz — un vector de características cada 20 milisegundos — que es una reducción de 320x respecto a la tasa de muestreo cruda. A 16,000 muestras por segundo, una ventana de 20ms abarca 320 muestras, así que cada trama de salida CNN resume 320 valores de audio crudos en un solo vector de dimensión $d$.
Segundo, una red de contexto : un codificador transformer estándar que toma la secuencia de salida CNN y aplica autoatención a través de todas las tramas. Mientras que la CNN solo ve una ventana local (cada trama corresponde a ~25ms de audio con algo de superposición del campo receptivo), el transformer captura dependencias de largo alcance — la identidad de un fonema puede depender de lo que se dijo segundos antes. La red de contexto produce una representación contextualizada $c_t$ para cada paso temporal $t$.
Tercero, un módulo de cuantización que discretiza la salida CNN en un conjunto finito de objetivos. Usa cuantización de producto con 2 codebooks de 320 entradas cada uno. Cada trama de salida CNN se mapea a una entrada de cada codebook, y las dos entradas se concatenan para formar la representación cuantizada $q_t$. Con $320 \times 320 = 102{,}400$ combinaciones posibles, el codebook es lo suficientemente grande como para capturar distinciones fonéticas finas mientras sigue siendo un espacio objetivo discreto y finito.
El procedimiento de entrenamiento autosupervisado funciona así. Se enmascaran tramos de tramas de salida CNN (típicamente 10 tramas consecutivas comenzando en posiciones aleatorias, cubriendo aproximadamente 200ms de audio cada uno). La red de contexto ve la entrada enmascarada y debe producir representaciones contextualizadas $c_t$ en cada posición enmascarada. El objetivo de entrenamiento es entonces una tarea contrastiva : dado $c_t$ en una posición enmascarada, identificar cuál representación cuantizada $q_t$ es el objetivo verdadero entre un conjunto de $K$ distractores $\tilde{q}$ muestreados uniformemente de otras posiciones enmascaradas en la misma expresión.
La pérdida contrastiva para esta tarea es la pérdida InfoNCE , el mismo objetivo usado en CLIP para alineamiento imagen-texto y en recuperación densa para emparejamiento consulta-documento:
Desglosemos lo que hace cada pieza. $c_t$ es la salida de la red de contexto en el paso temporal enmascarado $t$ — esta es la mejor estimación del modelo sobre qué audio fue enmascarado, informada por el contexto circundante. $q_t$ es el objetivo cuantizado verdadero — la versión discretizada de la salida CNN que estaba realmente en la posición $t$ antes del enmascaramiento. $\tilde{q}$ recorre un conjunto $Q_t$ que incluye el objetivo verdadero $q_t$ y $K$ distractores. $\text{sim}(\cdot, \cdot)$ es la similitud coseno. Y $\kappa$ es un parámetro de temperatura que controla la nitidez de la distribución.
Verifiquemos el comportamiento en los límites. Cuando el modelo identifica perfectamente el objetivo verdadero, $\text{sim}(c_t, q_t) \gg \text{sim}(c_t, \tilde{q})$ para todos los distractores. En ese caso, el numerador domina el denominador, la fracción se acerca a 1 y la pérdida se acerca a $-\log(1) = 0$. Cuando el modelo está completamente confundido y asigna similitud igual a todos los candidatos, la fracción se convierte en $1/(K+1)$ (un objetivo verdadero entre $K+1$ candidatos totales), dando una pérdida de $\log(K+1)$. Para $K = 100$ distractores, esta pérdida máxima es $\log(101) \approx 4.62$. La temperatura $\kappa$ importa en los márgenes: un $\kappa$ más bajo agudiza el softmax, haciendo al modelo más confiado y penalizando más duramente los casi-aciertos; un $\kappa$ más alto suaviza la distribución, haciendo el entrenamiento más estable al principio cuando el modelo aún está aprendiendo.
La pérdida completa añade una penalización de diversidad para prevenir el colapso del codebook — la tendencia del módulo de cuantización a usar solo unas pocas entradas del codebook mientras ignora el resto. La pérdida de diversidad maximiza la entropía de la distribución de uso del codebook, fomentando que todas las entradas se usen por igual. Sin ella, el modelo podría converger a una solución degenerada donde la mayoría de las tramas de audio se mapean al mismo puñado de códigos, destruyendo el contenido de información de los objetivos cuantizados.
Los resultados del artículo son sorprendentes. Pre-entrenar wav2vec 2.0 en 960 horas de audio no etiquetado de LibriSpeech y luego ajustar con solo 10 minutos de datos etiquetados logra una tasa de error de palabra (WER) del 4.8% en la partición test-clean. Para comparar, el estado del arte anterior usaba 960 horas de datos etiquetados para alcanzar un rendimiento similar. Eso es una reducción de 5,760x en los requisitos de datos etiquetados. La conclusión en los límites es clara: más datos no etiquetados para pre-entrenamiento mejora consistentemente las representaciones (el modelo entrenado en 60,000 horas de datos no etiquetados supera al entrenado en 960 horas), mientras que la cantidad de datos etiquetados para ajuste fino llega a rendimientos decrecientes rápidamente (pasar de 10 minutos a 1 hora ayuda significativamente, pero pasar de 10 horas a 100 horas ayuda mucho menos).
import json, js
# wav2vec 2.0 results from Table 9 in the paper
# Pre-trained on 960h unlabeled LibriSpeech, varying labeled fine-tuning data
results = [
["10 min", "4.8", "8.2"],
["1 hour", "3.4", "6.1"],
["10 hours", "2.6", "5.0"],
["100 hours","2.3", "4.6"],
["960 hours","2.1", "4.3"],
]
rows = []
for labeled, clean, other in results:
rows.append([labeled, clean, other])
js.window.py_table_data = json.dumps({
"headers": ["Labeled Fine-tuning Data", "WER test-clean (%)", "WER test-other (%)"],
"rows": rows
})
print("wav2vec 2.0 (Large) pre-trained on 960h unlabeled LibriSpeech")
print("Fine-tuned with varying amounts of labeled data")
print()
print("Key insight: 10 min of labels + self-supervised pre-training")
print("rivals models trained on 960h of fully labeled data")
HuBERT: Prediciendo unidades ocultas
wav2vec 2.0 demostró que el aprendizaje autosupervisado funciona para audio, pero su enfoque contrastivo tiene piezas móviles: el módulo de cuantización debe entrenarse conjuntamente con el resto de la red, y la tarea contrastiva requiere un muestreo cuidadoso de negativos. HuBERT (Hsu et al., 2021) propone una alternativa más simple: en lugar de aprender los objetivos en línea a través de un objetivo contrastivo, crear objetivos offline usando agrupamiento k-means plano, luego entrenar el modelo para predecir esas asignaciones de clúster en posiciones enmascaradas — exactamente como el modelado de lenguaje enmascarado (MLM) de BERT , pero con tramas de audio en lugar de tokens de texto e IDs de clúster en lugar de palabras del vocabulario.
El proceso de entrenamiento iterativo es lo que hace único a HuBERT. Se ejecuta en etapas, con cada etapa produciendo mejores objetivos para la siguiente:
- Etapa 0 — características iniciales: extraer MFCCs (Coeficientes Cepstrales en Frecuencia Mel, una característica clásica de procesamiento de señales) de 39 dimensiones del audio crudo. Estas son representaciones crudas — capturan la forma espectral pero pierden la rica estructura temporal y semántica que las redes neuronales aprenden.
- Etapa 0 — agrupar: ejecutar agrupamiento k-means sobre las características MFCC con $K = 100$ clústeres. Cada trama de audio recibe un ID de clúster de $\{0, 1, \ldots, 99\}$. Estas son las pseudo-etiquetas iniciales.
- Etapa 1 — entrenar HuBERT: enmascarar tramos de la entrada de audio (misma estrategia de enmascaramiento que wav2vec 2.0), alimentar las porciones no enmascaradas a través de un codificador de características CNN y un transformer, y predecir el ID de clúster en cada posición enmascarada usando una cabeza de clasificación. El modelo se entrena con pérdida estándar de entropía cruzada.
- Etapa 1 — re-extraer características: después del entrenamiento, usar la salida de la 6ª capa del transformer (una representación intermedia) como nuevas características para todas las tramas de audio. Estas representaciones aprendidas son mucho más ricas que los MFCCs originales.
- Etapa 2 — re-agrupar y re-entrenar: ejecutar k-means de nuevo sobre las nuevas características, ahora con $K = 500$ clústeres para mayor granularidad. Usar estos IDs de clúster mejorados como objetivos y entrenar un modelo HuBERT nuevo (o continuado). El ciclo puede repetirse, pero en la práctica dos iteraciones son suficientes.
La función de pérdida es directa — entropía cruzada calculada solo en posiciones enmascaradas:
Aquí $\mathcal{M}$ es el conjunto de pasos temporales enmascarados, $c_t$ es la asignación de clúster para la trama $t$ (determinada offline por k-means), y $\tilde{x}$ es la versión enmascarada del audio de entrada. La probabilidad $P(c_t \mid \tilde{x})$ proviene de un softmax sobre $K$ clases en la posición $t$. Verifiquemos los límites. Cuando el modelo predice el clúster correcto con probabilidad 1, el término log es $\log(1) = 0$, contribuyendo cero pérdida — predicción perfecta. Cuando el modelo asigna probabilidad $1/K$ uniformemente a todos los clústeres (adivinando al azar), cada posición enmascarada contribuye $\log(K)$. Para $K = 100$, eso es $\log(100) \approx 4.6$ por posición; para $K = 500$, es $\log(500) \approx 6.2$. Más clústeres significan una tarea de predicción más difícil y un techo de pérdida más alto, por eso la segunda iteración usa 500 clústeres — obliga al modelo a hacer distinciones más finas.
La pregunta obvia es: ¿por qué funciona esto cuando las etiquetas de clúster son ruidosas y semánticamente sin significado? Un clúster k-means sobre MFCCs no corresponde a un fonema o una palabra — es una agrupación arbitraria de tramas acústicamente similares. La idea clave del artículo es que las etiquetas no necesitan ser correctas; solo necesitan ser consistentes . Si dos instancias del fonema /k/ caen en el mismo clúster (incluso si ese clúster también contiene algunos sonidos /g/), el modelo aún aprende que estas tramas están relacionadas. Y debido a que el modelo debe predecir tramas enmascaradas a partir del contexto, se ve obligado a aprender tanto patrones acústicos (¿cómo suena este sonido?) como estructura secuencial (¿qué sonido es probable que venga después dado lo que vino antes?). El paso de re-agrupamiento luego mejora las etiquetas usando las propias representaciones aprendidas del modelo, creando un ciclo virtuoso: mejores representaciones producen mejores clústeres, que producen mejores objetivos de entrenamiento, que producen mejores representaciones.
Las representaciones de HuBERT han demostrado ser importantes mucho más allá del reconocimiento de voz. Su sucesor WavLM (Chen et al., 2022) extiende el enfoque con objetivos de eliminación de ruido y logra resultados de última generación en el benchmark SUPERB a través de tareas que incluyen identificación de hablante, reconocimiento de emociones y separación de habla. Más importante para el pipeline de generación de audio, las representaciones de HuBERT y WavLM sirven como tokens semánticos en codecs de audio neuronales. El codec Mimi de Moshi, por ejemplo, destila de WavLM para crear un primer codebook semántico que captura contenido lingüístico, mientras que los codebooks acústicos capturan el detalle fino necesario para reconstrucción de alta fidelidad. Cubriremos esto en el próximo artículo sobre codecs de audio neuronales.
Comparando los tres enfoques
Cada uno de estos tres codificadores toma decisiones fundamentalmente diferentes sobre la señal de entrenamiento, la representación de entrada y el formato de salida. La tabla a continuación resume las diferencias clave:
import json, js
rows = [
["Whisper", "Supervised (ASR)", "Log-mel spectrogram", "Text tokens",
"680K hrs labeled", "ASR, translation directly; encoder reused in multimodal LLMs"],
["wav2vec 2.0", "Self-sup. contrastive", "Raw waveform (16kHz)", "Continuous features",
"960h-60Kh unlabeled", "Fine-tune for ASR, speaker ID, emotion recognition"],
["HuBERT", "Self-sup. masked pred.", "Raw waveform (16kHz)", "Continuous features",
"960h unlabeled", "Fine-tune for ASR; semantic tokens for neural codecs"],
]
js.window.py_table_data = json.dumps({
"headers": ["Model", "Training", "Input", "Output", "Data", "Downstream Use"],
"rows": rows
})
print("Three paradigms for learning audio representations:")
print()
print("Supervised (Whisper): best when you have labeled data and want ASR directly")
print("Contrastive (wav2vec 2.0): best for low-resource languages with little labeled data")
print("Masked prediction (HuBERT): simplest self-supervised approach, semantic tokens for codecs")
El patrón que emerge es familiar del NLP y la visión: los modelos supervisados sobresalen en la tarea específica para la que fueron entrenados (Whisper es difícil de superar en ASR multilingual con sus 680K horas de supervisión), pero los modelos autosupervisados aprenden representaciones de propósito más general que se transfieren a una gama más amplia de tareas posteriores. Las representaciones de wav2vec 2.0 y HuBERT son útiles para verificación de hablante, detección de emociones, identificación de idioma, separación de habla y detección de palabras clave — tareas para las que el codificador de Whisper nunca fue optimizado pero que se benefician de la rica comprensión de audio que estos modelos desarrollan a través del aprendizaje autosupervisado.
También hay una diferencia práctica en cómo se reutilizan estos codificadores. El codificador de Whisper típicamente se congela y se usa como extractor de características — su salida se proyecta al espacio de embeddings de un modelo de lenguaje, y solo se entrenan la capa de proyección y el modelo de lenguaje. wav2vec 2.0 y HuBERT, por el contrario, se ajustan más comúnmente de extremo a extremo en tareas posteriores, porque su objetivo de pre-entrenamiento no optimizó para ningún formato de salida específico.
Los tres codificadores producen representaciones continuas — vectores densos de punto flotante en cada paso temporal. Pero para modelos de lenguaje que operan con tokens discretos, a menudo queremos convertir el audio en una secuencia de enteros, al igual que el texto se tokeniza en índices de vocabulario. El próximo artículo de este track cubre cómo los codecs de audio neuronales (EnCodec, SoundStream, DAC, Mimi) usan cuantización vectorial residual para convertir audio continuo en tokens discretos — cerrando la brecha entre los codificadores de audio y el mundo basado en tokens de los grandes modelos de lenguaje.
Quiz
Pon a prueba tu comprensión de los tres paradigmas de codificadores de audio.
¿Por qué el codificador de Whisper se reutiliza ampliamente en modelos de lenguaje multimodales como Qwen-Audio, en lugar de entrenar un nuevo codificador de audio desde cero?
En la pérdida contrastiva de wav2vec 2.0, ¿qué sucede con el valor de la pérdida cuando el modelo asigna similitud igual al objetivo verdadero y a todos los $K$ distractores?
¿Por qué funciona el entrenamiento de HuBERT a pesar de que las etiquetas de clúster de k-means son ruidosas y semánticamente sin significado?
¿Cuál es la ventaja clave de los codificadores de audio autosupervisados (wav2vec 2.0, HuBERT) sobre los supervisados (Whisper)?