Tever
AST

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.

Infografía sobre fondu azul escuru con un espectrograma en tonos magma y naranxa, col exe de frecuencia n'escala logarítmica y bandes horizontales d'harmónicos, xunto a un fragmentu de códigu Python coles llinies librosa.load, librosa.stft y librosa.display.specshow

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:

  1. Cargar l’audiu con librosa.load.
  2. Calcular la so transformada de Fourier de tiempu curtiu (STFT).
  3. Convertir esa transformada nun espectrograma lleíble, en decibelios.
  4. 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ámetruQué controla
n_fftTamañ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_lengthCuá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 real xeneráu con librosa a partir d'un estrautu de Fayendo: exe de frecuencia n'escala logarítmica, exe de tiempu en segundos, enerxía en decibelios representada en tonos magma y naranxa. Vense bandes horizontales d'harmónicos y güecos de silenciu ente frases.

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: