Tutorial · Llaboratoriu DIY
Cómo calcular un espectrograma con librosa
Tutorial pasu ente pasu, con cuadernu Jupyter descargable, pa calcular un espectrograma con librosa: STFT, decibelios y lleer les bandes d'harmónicos.
librosa ye la llibrería de Python de referencia pa trabayar con audiu: calcula espectrogrames, estrai carauterístiques y da accesu direutu a la transformada de Fourier ensin que tengas qu’implementala tu. Esti tutorial pasa de la teoría a la práutica: cargamos un audiu real, calculamos el so espectrograma y deprendemos a lleelu. Al final tienes un cuadernu Jupyter descargable con tol códigu, llistu pa executar col to propiu audiu.
Qué vamos construyir
Partimos d’un estrautu d’audiu real —un fragmentu de Fayendo (2021), tema del EP Suañu de Gaita, grabación propia de gaita asturiana— y percorremos el camín completu fasta’l so espectrograma:
- Cargar l’audiu con
librosa.load. - Calcular la so transformada de Fourier de tiempu curtiu (STFT).
- Convertir esa transformada nun espectrograma lleíble, en decibelios.
- Dibuxalu y lleer lo que amuesa.
Tol códigu d’esti tutorial vive tamién nun cuadernu Jupyter que pues descargar y executar col to propiu audiu.
Instalación
pip install librosa numpy matplotlib
librosa trai numpy como dependencia, pero matplotlib fai falta aparte
pa dibuxar. Con eses trés llibreríes instalaes yá se pue reproducir too lo
que sigue.
1. Cargar l’audiu
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 descodifica’l ficheru y devuelve dos coses: y, un array de
numpy cola forma d’onda, y sr (sample rate), la frecuencia de
muestreo. Por defeutu, librosa remuestrea a 22050 Hz —abondo pal rangu
d’interés n’análisis musical, y más llixeru de procesar que’l 44100 Hz
d’un CD.
2. La transformada de Fourier de tiempu curtiu (STFT)
La forma d’onda nun diz fácilmente qué notes suenen: ye la representación temporal, un valor de presión d’aire por instante. Pa ver qué frecuencies contién hai que pasar al dominiu de la frecuencia, y non de golpe sobre tol audiu, sinón en ventanes curties que se muevan pel tiempu. Eso ye la STFT (Short-Time Fourier Transform): munches transformaes de Fourier pequeñes, una por ventana, apilaes una tres otra.
D = librosa.stft(y, n_fft=2048, hop_length=512)
Dos parámetros deciden la resolución del análisis:
| Parámetru | Qué controla |
|---|---|
n_fft | Tamañu de cada ventana d’análisis, en muestres. 2048 ye un valor habitual: resolución en frecuencia abondo ensin perder demasiada resolución temporal. |
hop_length | Cuánto se mueve la ventana ente cálculos socesivos. Con solape (hop_length menor qu’n_fft), el resultáu queda más suave. |
D ye una matriz de númberos complexos: cada columna ye una ventana
temporal, cada filera una frecuencia, y el valor combina magnitú (cuánta
enerxía hai) y fase.
3. De magnitú a decibelios
Pal espectrograma namás fai falta la magnitú, non la fase. Y como l’oyíu humanu percibe la intensidá de forma logarítmica, convertise a decibelios:
S_db = librosa.amplitude_to_db(np.abs(D), ref=np.max)
Asina, les diferencies pequeñes en zones de baxa enerxía distíngense tan bien como les grandes en zones d’alta enerxía —nuna escala llinial, quedaríen aplastaes.
4. Dibuxar 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 exes de tiempu y frecuencia direutamente a
partir de sr y hop_length, ensin que tengas que calculalos a mano.
L’exe Y n’escala logarítmica (y_axis="log") ye l’habitual en música:
reflexa meyor cómo se reparten les notes nel rangu audible qu’una escala
llinial.

Espectrograma d’un estrautu de Fayendo, calculáu col códigu d’esti tutorial. Les bandes horizontales son los harmónicos de cada nota; los güecos verticales, silencios ente frases.
Cómo lleer el resultáu
Nel espectrograma d’arriba vense bandes horizontales que xuben y baxen xuntes: son la frecuencia fundamental de cada nota y los sos harmónicos —múltiplos enteros d’esa frecuencia—. Esi patrón de bandes paraleles, y cómo se reparte la enerxía ente elles, ye una de les señales qu’un sistema de trescripción automática de música usa pa decidir qué nota se ta tocando. Los güecos verticales de silenciu ente bandes correspuenden a les respiraciones ente frases —daqué carauterístico del fraseo con instrumentos de vientu continuu, como la gaita.
Siguientes pasos
Esti tutorial queda nel espectrograma como imaxe. El cuadernu descargable apunta trés direiciones pa siguir:
- Cromagrama (
librosa.feature.chroma_stft): axunta la enerxía nes 12 clases d’altor (C, C#, D…), útil pa detectar acordes o tonalidá. - MFCCs (
librosa.feature.mfcc): una representación compauta del timbre, muncho usada en clasificación d’instrumentos y xéneros. - Detectar onsets (
librosa.onset.onset_detect): atopar l’instante exautu en qu’empieza cada nota, primer pasu haza una trescripción automática real.
El cuadernu
Tol códigu d’esti tutorial —cargar, tresformar, dibuxar y los siguientes
pasos comentaos— ta nun
cuadernu Jupyter descargable,
xunto col fragmentu de
Fayendo usáu como exemplu. Ábrelu con
jupyter notebook o jupyter lab, o súbelu a
Google Colab si nun quies instalar
nada en local. Si enxamás usasti ún, en
Qué ye un cuadernu Jupyter esplico per
ónde entamar.
Bibliografía
Les referencies nes que s’apoya esti artículu y per ónde siguir lleendo:
- 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.