Tever
ES

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.

Infografía sobre fondo azul oscuro con un espectrograma en tonos magma y naranja, con el eje de frecuencia en escala logarítmica y bandas horizontales de armónicos, junto a un fragmento de código Python con las líneas librosa.load, librosa.stft y librosa.display.specshow

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:

  1. Cargar el audio con librosa.load.
  2. Calcular su transformada de Fourier de tiempo corto (STFT).
  3. Convertir esa transformada a un espectrograma legible, en decibelios.
  4. 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ámetroQué controla
n_fftTamañ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_lengthCuá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 real generado con librosa a partir de un extracto de Fayendo: eje de frecuencia en escala logarítmica, eje de tiempo en segundos, energía en decibelios representada en tonos magma y naranja. Se ven bandas horizontales de armónicos y huecos de silencio entre frases.

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: