
El audio binaural es la técnica que permite simular sonido en 3D usando únicamente dos canales, pensados para escucharse con auriculares. Y sí, se puede generar desde Python con unas pocas librerías. En esta guía te muestro cómo, partiendo de una pista mono o estéreo, aplicar las HRTF (Head-Related Transfer Functions) y convolución para obtener una mezcla binaural realista. No necesitas equipos caros: solo Python, NumPy, SciPy y un dataset público de HRTF.
¿Qué es el audio binaural y por qué funciona?
Cuando escuchas un sonido en el mundo real, tu cabeza, tus orejas y hasta los hombros modifican las ondas antes de llegar al tímpano. Esas modificaciones dependen de la dirección: un sonido que viene de la izquierda llega antes y con más intensidad al oído izquierdo, pero también sufre un filtrado distinto por la forma del pabellón auricular. Las HRTF capturan precisamente eso: la respuesta en frecuencia (y fase) que introduce tu anatomía para cada punto del espacio. Aplicando esa respuesta mediante convolución a una señal de audio, puedes «colocar» el sonido en una posición virtual alrededor del oyente.
La convolución es la operación matemática que combina la señal original con la respuesta al impulso de la HRTF. Si tienes un impulso seco y lo convolucionas con la HRTF de la izquierda a 30 grados, obtienes lo que escucharía tu oído izquierdo si ese impulso proviniera de esa dirección. Haz lo mismo para el oído derecho y tendrás un par estéreo binaural.

Requisitos y herramientas
Vas a necesitar Python 3.8 o superior y estas librerías:
- NumPy: para el manejo de arrays y operaciones numéricas.
- SciPy: para la convolución eficiente con
scipy.signal.fftconvolve. - SoundFile o Librosa: para leer y escribir archivos de audio.
Instálalas con pip:
pip install numpy scipy soundfilePaso 1: Consigue un dataset de HRTF
No tienes que medir tus propias HRTF. Hay varios conjuntos públicos de alta calidad. Los más usados son el CIPIC HRTF Database (de la Universidad de California), el MIT KEMAR y el Listen HRTF (del IRCAM). Para este tutorial usaré el CIPIC porque es fácil de manejar: incluye archivos .mat con las respuestas al impulso para 1250 posiciones (azimut y elevación). Descárgalo desde la web oficial (busca «CIPIC HRTF Database») y descomprime los archivos en una carpeta.
Una vez descargado, puedes cargar los datos en Python usando scipy.io.loadmat. El archivo principal (por ejemplo, subject_001.mat) contiene una matriz hrir_l y hrir_r de dimensiones (n_posiciones, n_muestras) y un vector de posiciones. Cada fila corresponde a una combinación de azimut y elevación.
Paso 2: Carga tu pista de audio
Con SoundFile lees cualquier archivo WAV, FLAC o MP3 (aunque para MP3 necesitas el codec). Si tu pista es estéreo, puedes usar solo un canal o sumar ambos a mono. Para el ejemplo, asumiré que tienes un archivo mono llamado voz.wav.
import soundfile as sf
import numpy as np
audio, fs = sf.read('voz.wav')
if audio.ndim > 1:
audio = audio.mean(axis=1) # mezcla a monoPaso 3: Selecciona la HRTF y aplica convolución
Elige la posición deseada. Por ejemplo, azimut 30 grados (a la derecha) y elevación 0. Busca el índice correspondiente en el dataset. Luego extrae las respuestas al impulso izquierda y derecha (HRIR) y convolucionalas con tu audio.
from scipy.io import loadmat
from scipy.signal import fftconvolve
# Cargar HRTF
data = loadmat('subject_001.mat')
hrir_l = data['hrir_l'] # forma (1250, 200)
hrir_r = data['hrir_r']
azim = data['azim'] # vector de azimuts en grados
# Buscar índice para azimut 30 y elevación 0
idx = np.where((azim == 30) & (elev == 0))[0][0] # elev se define según dataset
# Extraer HRIR
hrir_left = hrir_l[idx, :]
hrir_right = hrir_r[idx, :]
# Convolución
left_ear = fftconvolve(audio, hrir_left)
right_ear = fftconvolve(audio, hrir_right)
# Normalizar para evitar clipping
max_val = max(np.max(np.abs(left_ear)), np.max(np.abs(right_ear)))
left_ear = left_ear / max_val * 0.9
right_ear = right_ear / max_val * 0.9
# Crear estéreo binaural
binaural = np.stack([left_ear, right_ear], axis=1)
# Guardar
sf.write('binaural.wav', binaural, fs)Fíjate que la convolución alarga la señal: el resultado tendrá una cola extra igual a la longitud del HRIR menos 1. Puedes recortarla para mantener la duración original, pero muchas veces se deja para no perder reverberación.
Paso 4: Escucha y ajusta
Guarda el archivo y ábrelo con auriculares. Deberías percibir la voz claramente a la derecha, como si estuviera a 30 grados. Juega con diferentes azimuts y elevaciones para «mover» el sonido. Si notas demasiada coloración, prueba con HRTF de otro sujeto o aplica ecualización.
¿Y si mi pista es estéreo?
Puedes procesar cada canal por separado y sumar los resultados para cada oído. Es decir, convolucionas el canal izquierdo con la HRTF izquierda y derecha, y lo mismo para el canal derecho. La suma de ambas convoluciones te da la señal binaural final. Esto simula que cada altavoz virtual del estéreo original está en una posición fija (por ejemplo, ±30 grados).
Mejoras y consideraciones prácticas
La convolución con fftconvolve es rápida para archivos de pocos minutos, pero si quieres tiempo real necesitas técnicas como particionado en bloques (overlap-add). Para una guía introductoria, el método directo es suficiente. Otro detalle: los datasets públicos suelen tener HRIR de 200 o 512 muestras a 44.1 kHz. Si tu audio está a otra frecuencia, remuestrea antes o ajusta las HRTF.
Una vez generado tu audio binaural en WAV, quizá quieras compartirlo en MP3 para que pese menos. Ahí puedes usar un conversor de audio como y-mp3.top, que te permite convertir WAV a MP3 sin instalar nada. Es cómodo y gratuito, y evitas sobrecargar el script de Python.
Preguntas frecuentes
¿Puedo usar HRTF para crear audio inmersivo para videojuegos?
Sí, de hecho muchos motores de audio lo implementan. Con Python puedes prototipar el posicionamiento de sonidos antes de integrarlo en el motor.
¿Necesito auriculares especiales?
No, cualquier auricular estéreo funciona. La magia está en la señal, no en el hardware. Evita altavoces porque rompen la ilusión.
¿Puedo generar mis propias HRTF?
Sí, con micrófonos en los oídos y un protocolo de medición. Pero es laborioso. Para empezar, los datasets públicos son más que suficientes.
¿Qué pasa si uso HRTF de otra persona?
La localización puede ser menos precisa y haber confusiones frente-detrás. Aun así, el efecto 3D sigue siendo notable para la mayoría de la gente.
Con esto ya tienes lo básico para experimentar con audio binaural en Python. El código es sencillo, pero los resultados pueden sorprenderte. Prueba a crear una escena con varios sonidos en diferentes posiciones y verás el potencial.
