Analyse audio et musicale en temps réel via une bibliothèque Python gratuite
Aubio est une bibliothèque Python de traitement audio open source utilisée par les développeurs logiciels pour la détection de hauteur, le suivi du tempo, l'extraction de MFCC et le traitement audio en temps réel.
Qu'est-ce qu'Aubio ?
Les applications audio modernes—telles que les outils de production musicale, les plateformes d'analyse audio et les systèmes de traitement du son en temps réel—nécessitent des méthodes efficaces pour analyser les signaux sonores. Une solution open source populaire à cet effet est Aubio, une bibliothèque légère mais puissante conçue pour extraire des informations significatives des signaux audio. Aubio est une bibliothèque open source conçue pour extraire des annotations et des caractéristiques musicales des signaux audio. Elle analyse les flux audio et identifie des événements tels que les attaques de notes, la hauteur, les battements et le tempo. Elle est principalement écrite en C pour des performances élevées et fonctionne sous Linux, macOS et Windows.
La bibliothèque est très facile à manipuler et prend en charge le traitement audio en temps réel. Elle peut détecter des événements musicaux tels que le moment où un coup de caisse claire se produit, la fréquence d’une note musicale et le tempo ou le rythme d’une piste. Elle peut fonctionner à la fois hors ligne (fichiers audio) et en flux audio en temps réel, ce qui la rend adaptée aux éditeurs audio, aux instruments numériques et aux outils d’analyse sonore. Avec le support de la détection de hauteur, du suivi du tempo, de la détection d’attaque, de l’extraction de MFCC et du traitement du signal en temps réel, elle fournit aux développeurs les outils nécessaires pour créer des applications audio avancées.
Premiers pas avec Aubio
La façon la plus simple d'installer Aubio est d'utiliser le Python Package Index (PyPI). Veuillez utiliser la commande suivante pour une installation complète.
Installer avec Aubio
pip install aubio Installer Aubio depuis GitHub
go get -u github.com/aubio/aubio.git Détection d'attaque via Python
Une des fonctionnalités les plus utiles de la bibliothèque Aubio est la détection d'attaque, qui identifie quand une note musicale ou un événement sonore commence. La détection d'attaque trouve le moment précis où un nouveau son ou une nouvelle note musicale débute. En musique, une « attaque » est le commencement d'une note — l'instant où un tambour est frappé, une guitare est pincée, ou une voix commence une syllabe. Aubio inclut plusieurs algorithmes de détection d'attaque pour différents cas d'utilisation. L'exemple suivant montre comment détecter les attaques dans un fichier audio à l'aide de code Python.
Comment détecter les attaques dans un fichier audio via la bibliothèque Python ?
import aubio
import numpy as np
# Configuration
filename = "audio_sample.wav"
win_s = 512 # FFT window size
hop_s = 256 # Hop size (frames between analysis windows)
# Open the audio source
src = aubio.source(filename, hop_size=hop_s)
samplerate = src.samplerate
# Create the onset detector (using 'complex' method)
onset = aubio.onset("complex", win_s, hop_s, samplerate)
# Set detection threshold (0.0 to 1.0 — lower = more sensitive)
onset.set_threshold(0.3)
onsets = []
# Process audio frame by frame
while True:
samples, read = src() # Read one hop of audio
if onset(samples): # Returns True when onset detected
print(f"Onset at: {onset.get_last_s():.3f} seconds")
onsets.append(onset.get_last_s())
if read < hop_s: # End of file
break
print(f"\nTotal onsets detected: {len(onsets)}")
Support de la détection de hauteur
La détection de hauteur est une autre capacité importante de la bibliothèque open source Aubio. La détection de hauteur identifie la fréquence fondamentale (F0) d'un son — essentiellement, « quelle note musicale est‑ce ? » C’est le cœur de tout accordeur, extracteur de mélodie ou outil d'analyse vocale. Aubio prend en charge plusieurs algorithmes de détection de hauteur tels que yin, yinfft, mcomb, fcomb, etc. Voici un exemple simple qui montre comment réaliser une détection de hauteur en temps réel dans des applications Python.
Comment réaliser la détection de hauteur en temps réel via Python ?
import aubio
import numpy as np
samplerate = 44100
win_s = 1024
hop_s = 512
pitch_o = aubio.pitch("yin", win_s, hop_s, samplerate)
pitch_o.set_unit("Hz")
pitch_o.set_silence(-40)
samples = np.random.rand(hop_s).astype(np.float32)
pitch = pitch_o(samples)
print("Detected pitch:", pitch)
Suivi du tempo et détection de battements via Python
La bibliothèque open source Aubio peut analyser les motifs rythmiques et détecter les temps et le tempo dans la musique au sein des applications Python. Aubio peut écouter l'audio et suivre le rythme — détectant le tempo en BPM (battements par minute) et repérant les horodatages individuels des temps. Cela est inestimable pour tout, des logiciels DJ à la synchronisation musicale. La bibliothèque détermine les emplacements des temps en analysant les changements spectraux et les motifs rythmiques du signal audio.
Lecture et écriture de fichiers audio via Python
La bibliothèque Python Aubio encapsule les entrées/sorties de fichiers audio via ses objets source et sink, prenant en charge plusieurs formats (WAV, FLAC, OGG, MP3 via libav ou ffmpeg) et gérant automatiquement la conversion du taux d'échantillonnage. Voici un exemple simple qui montre comment les développeurs peuvent lire, traiter et écrire des fichiers audio en utilisant des commandes Python.
Comment lire, traiter et écrire des fichiers audio via Python ?
import aubio
import numpy as np
input_file = "input.wav"
output_file = "output.wav"
target_samplerate = 22050 # Downsample to 22.05 kHz
hop_s = 512
# Open source — resamples automatically to target samplerate
src = aubio.source(input_file, samplerate=target_samplerate, hop_size=hop_s)
actual_sr = src.samplerate
num_channels = src.channels
# Open sink for writing
sink = aubio.sink(output_file, actual_sr, channels=1)
while True:
samples, read = src()
# Write mono (sink expects 1D array for mono output)
if num_channels > 1:
mono = samples.reshape(num_channels, -1).mean(axis=0)
else:
mono = samples
sink(mono[:read], read)
if read < hop_s:
break
del sink # Flushes and closes file
print(f"Written {output_file} at {actual_sr} Hz")