---
title: "Cómo calcular un espectrograma con librosa"
slug: espectrograma-con-librosa
kind: tutorial
summary: "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."
publishedAt: 2026-07-10
---
import { Image } from "astro:assets";
import infografiaEspectrograma from "../../assets/blog/posts/infografias/infografia-espectrograma-librosa.jpg";

**[librosa](/concepto/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](/blog/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](/notebooks/espectrograma-con-librosa.ipynb)
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*](https://tever.es/musica#recording-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](/blog/cuadernos-jupyter) que puedes descargar y ejecutar
con tu propio audio.

## Instalación

```bash
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

```python
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.

```python
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:

```python
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

```python
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.

<figure>
  <Image
    src={infografiaEspectrograma}
    alt="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."
    width={1100}
    height={490}
  />
  <figcaption>
    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.
  </figcaption>
</figure>

## 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](/blog/que-es-amt) 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](/notebooks/espectrograma-con-librosa.ipynb) 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](/notebooks/espectrograma-con-librosa.ipynb),
junto con el fragmento de
[*Fayendo*](/notebooks/tever-extracto.mp3) usado como ejemplo. Ábrelo con
`jupyter notebook` o `jupyter lab`, o súbelo a
[Google Colab](https://colab.research.google.com/) si no quieres instalar
nada en local. Si nunca has usado uno, en
[*Qué es un cuaderno Jupyter*](/blog/cuadernos-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](https://doi.org/10.25080/Majora-7b98e3ed-003). *Proceedings of the 14th Python in Science Conference*, 18–24.
- [Documentación oficial de librosa](https://librosa.org/doc/latest/index.html).
- Müller, M. (2015). [*Fundamentals of Music Processing: Audio, Analysis, Algorithms, Applications*](https://doi.org/10.1007/978-3-319-21945-5) (cap. 2 y 3). Springer.
