Le spectrogramme – variations spectrales du son dans le temps

Machine Learning pour les données chronologiques en Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

Transformées de Fourier

  • Les séries chronologiques combinent des composantes qui changent vite et d'autres qui changent lentement
  • À chaque instant, on peut décrire la présence relative de ces composantes rapides et lentes
  • La façon la plus simple de le faire s'appelle la transformée de Fourier
  • Elle convertit une seule série chronologique en un tableau décrivant la série comme une combinaison d'oscillations
Machine Learning pour les données chronologiques en Python

Une transformée de Fourier (FFT)

Machine Learning pour les données chronologiques en Python

Spectrogrammes : combinaisons de fenêtres de transformées de Fourier

  • Un spectrogramme est un ensemble de transformées de Fourier fenêtrées dans le temps
  • Comme pour une moyenne mobile :
    1. Choisir une taille et une forme de fenêtre
    2. À un instant donné, calculer la FFT pour cette fenêtre
    3. Glisser la fenêtre d'un cran
    4. Regrouper les résultats
  • C'est la transformée de Fourier à court terme (STFT)
Machine Learning pour les données chronologiques en Python

Machine Learning pour les données chronologiques en Python

Calculer la STFT

  • On peut calculer la STFT avec librosa
  • Plusieurs paramètres sont ajustables (p. ex. la taille de fenêtre)
  • Ici, on convertira en décibels pour normaliser la moyenne des fréquences
  • On peut ensuite le visualiser avec la fonction specshow()
Machine Learning pour les données chronologiques en Python

Calculer la STFT en code

# Import the functions we'll use for the STFT
from librosa.core import stft, amplitude_to_db
from librosa.display import specshow
import matplotlib.pyplot as plt

# Calculate our STFT
HOP_LENGTH = 2**4
SIZE_WINDOW = 2**7
audio_spec = stft(audio, hop_length=HOP_LENGTH, n_fft=SIZE_WINDOW)

# Convert into decibels for visualization
spec_db = amplitude_to_db(audio_spec)

# Visualize
fig, ax = plt.subplots()
specshow(spec_db, sr=sfreq, x_axis='time', 
         y_axis='hz', hop_length=HOP_LENGTH, ax=ax)
Machine Learning pour les données chronologiques en Python

Ingénierie des caractéristiques spectrales

  • Chaque série chronologique a une signature spectrale différente.
  • On peut obtenir ces signatures en analysant le spectrogramme.
  • Par exemple, la largeur de bande spectrale et les centroïdes spectraux indiquent où se trouve l'essentiel de l'énergie à chaque instant

Machine Learning pour les données chronologiques en Python

Calculer des caractéristiques spectrales

# Calculate the spectral centroid and bandwidth for the spectrogram
bandwidths = lr.feature.spectral_bandwidth(S=spec)[0]
centroids = lr.feature.spectral_centroid(S=spec)[0]

# Display these features on top of the spectrogram
fig, ax = plt.subplots()
specshow(spec, x_axis='time', y_axis='hz', hop_length=HOP_LENGTH, ax=ax)
ax.plot(times_spec, centroids)
ax.fill_between(times_spec, centroids - bandwidths / 2, 
                centroids + bandwidths / 2, alpha=0.5)
Machine Learning pour les données chronologiques en Python

Combiner caractéristiques spectrales et temporelles dans un classifieur

centroids_all = []
bandwidths_all = []
for spec in spectrograms:
    bandwidths = lr.feature.spectral_bandwidth(S=lr.db_to_amplitude(spec))
    centroids = lr.feature.spectral_centroid(S=lr.db_to_amplitude(spec))
    # Calculate the mean spectral bandwidth
    bandwidths_all.append(np.mean(bandwidths))  
    # Calculate the mean spectral centroid
    centroids_all.append(np.mean(centroids))  

# Create our X matrix
X = np.column_stack([means, stds, maxs, tempo_mean, 
                     tempo_max, tempo_std, bandwidths_all, centroids_all])
Machine Learning pour les données chronologiques en Python

Passons à la pratique !

Machine Learning pour les données chronologiques en Python

Preparing Video For Download...