Tutorial · Laboratorio DIY
Cómo calcular un espectrograma con librosa
Tutorial con cuaderno Jupyter descargable: cómo pasar de un audio real a su espectrograma con librosa, la STFT, decibelios y cómo leer los armónicos.
librosa es la librería de Python de referencia para trabajar con audio: calcula espectrogramas, extrae características y da acceso directo a la transformada de Fourier sin que tengas que implementarla tú. Este tutorial pasa de la teoría a la práctica: cargamos un audio real, calculamos su espectrograma y aprendemos a leerlo. Al final tienes un cuaderno Jupyter descargable con todo el código, listo para ejecutar con tu propio audio.
Qué vamos a construir
Partimos de un extracto de audio real —un fragmento de Fayendo (2021), tema del EP Suañu de Gaita, grabación propia de gaita asturiana— y recorremos el camino completo hasta su espectrograma:
- Cargar el audio con
librosa.load. - Calcular su transformada de Fourier de tiempo corto (STFT).
- Convertir esa transformada a un espectrograma legible, en decibelios.
- Dibujarlo y leer lo que muestra.
Todo el código de este tutorial vive también en un cuaderno Jupyter que puedes descargar y ejecutar con tu propio audio.
Instalación
pip install librosa numpy matplotlib
librosa trae numpy como dependencia, pero matplotlib hace falta aparte
para dibujar. Con esas tres librerías instaladas ya se puede reproducir todo
lo que sigue.
1. Cargar el audio
import librosa
import librosa.display
import numpy as np
import matplotlib.pyplot as plt
y, sr = librosa.load("tever-extracto.mp3")
print(f"Frecuencia de muestreo: {sr} Hz")
print(f"Duración: {librosa.get_duration(y=y, sr=sr):.1f} s")
librosa.load decodifica el fichero y devuelve dos cosas: y, un array de
numpy con la forma de onda, y sr (sample rate), la frecuencia de
muestreo. Por defecto, librosa remuestrea a 22050 Hz —suficiente para el
rango de interés en análisis musical, y más ligero de procesar que el
44100 Hz de un CD.
2. La transformada de Fourier de tiempo corto (STFT)
La forma de onda no dice fácilmente qué notas suenan: es la representación temporal, un valor de presión de aire por instante. Para ver qué frecuencias contiene hay que pasar al dominio de la frecuencia, y no de golpe sobre todo el audio, sino en ventanas cortas que se desplazan en el tiempo. Eso es la STFT (Short-Time Fourier Transform): muchas transformadas de Fourier pequeñas, una por ventana, apiladas una tras otra.
D = librosa.stft(y, n_fft=2048, hop_length=512)
Dos parámetros deciden la resolución del análisis:
| Parámetro | Qué controla |
|---|---|
n_fft | Tamaño de cada ventana de análisis, en muestras. 2048 es un valor habitual: resolución en frecuencia suficiente sin perder demasiada resolución temporal. |
hop_length | Cuánto se desplaza la ventana entre cálculos sucesivos. Con solape (hop_length menor que n_fft), el resultado queda más suave. |
D es una matriz de números complejos: cada columna es una ventana
temporal, cada fila una frecuencia, y el valor combina magnitud (cuánta
energía hay) y fase.
3. De magnitud a decibelios
Para el espectrograma solo hace falta la magnitud, no la fase. Y como el oído humano percibe la intensidad de forma logarítmica, se convierte a decibelios:
S_db = librosa.amplitude_to_db(np.abs(D), ref=np.max)
Así, las diferencias pequeñas en zonas de baja energía se distinguen tan bien como las grandes en zonas de alta energía —en una escala lineal, quedarían aplastadas.
4. Dibujar el espectrograma
fig, ax = plt.subplots(figsize=(12, 5))
img = librosa.display.specshow(
S_db, sr=sr, hop_length=512,
x_axis="time", y_axis="log", ax=ax, cmap="magma",
)
ax.set(title="Espectrograma (STFT, escala logarítmica)")
fig.colorbar(img, ax=ax, format="%+2.0f dB")
plt.show()
specshow interpreta los ejes de tiempo y frecuencia directamente a partir
de sr y hop_length, sin que tengas que calcularlos a mano. El eje Y en
escala logarítmica (y_axis="log") es el habitual en música: refleja mejor
cómo se reparten las notas en el rango audible que una escala lineal.

Espectrograma de un extracto de Fayendo, calculado con el código de este tutorial. Las bandas horizontales son los armónicos de cada nota; los huecos verticales, silencios entre frases.
Cómo leer el resultado
En el espectrograma de arriba se ven bandas horizontales que suben y bajan juntas: son la frecuencia fundamental de cada nota y sus armónicos —múltiplos enteros de esa frecuencia—. Ese patrón de bandas paralelas, y cómo se reparte la energía entre ellas, es una de las señales que un sistema de transcripción automática de música usa para decidir qué nota se está tocando. Los huecos verticales de silencio entre bandas corresponden a las respiraciones entre frases —algo característico del fraseo con instrumentos de viento continuo, como la gaita.
Siguientes pasos
Este tutorial se queda en el espectrograma como imagen. El cuaderno descargable apunta tres direcciones para seguir:
- Cromagrama (
librosa.feature.chroma_stft): agrupa la energía en las 12 clases de altura (C, C#, D…), útil para detectar acordes o tonalidad. - MFCCs (
librosa.feature.mfcc): una representación compacta del timbre, muy usada en clasificación de instrumentos y géneros. - Detección de onsets (
librosa.onset.onset_detect): encontrar el instante exacto en que empieza cada nota, primer paso hacia una transcripción automática real.
El cuaderno
Todo el código de este tutorial —cargar, transformar, dibujar y los
siguientes pasos comentados— está en un
cuaderno Jupyter descargable,
junto con el fragmento de
Fayendo usado como ejemplo. Ábrelo con
jupyter notebook o jupyter lab, o súbelo a
Google Colab si no quieres instalar
nada en local. Si nunca has usado uno, en
Qué es un cuaderno Jupyter explico por dónde
empezar.
Bibliografía
Las referencias en las que se apoya este artículo y por dónde seguir leyendo:
- McFee, B., Raffel, C., Liang, D., Ellis, D. P. W., McVicar, M., Battenberg, E., & Nieto, O. (2015). librosa: Audio and Music Signal Analysis in Python. Proceedings of the 14th Python in Science Conference, 18–24.
- Documentación oficial de librosa.
- Müller, M. (2015). Fundamentals of Music Processing: Audio, Analysis, Algorithms, Applications (cap. 2 y 3). Springer.