Análisis de audio y música en tiempo real mediante biblioteca Python gratuita
Aubio es una biblioteca de procesamiento de audio Python de código abierto utilizada por desarrolladores de software para la detección de tono, el seguimiento de ritmo, la extracción de MFCC y el procesamiento de audio en tiempo real.
¿Qué es Aubio?
Las aplicaciones de audio modernas—como herramientas de producción musical, plataformas de análisis de audio y sistemas de procesamiento de sonido en tiempo real—requieren métodos eficientes para analizar señales de sonido. Una solución de código abierto popular para este propósito es Aubio, una biblioteca ligera pero poderosa diseñada para extraer información significativa de las señales de audio. Aubio es una biblioteca de código abierto diseñada para extraer anotaciones y características musicales de las señales de audio. Analiza flujos de audio e identifica eventos como inicios de notas, tono, pulsos y tempo. Está escrita principalmente en C para alto rendimiento y funciona en Linux, macOS y Windows.
La biblioteca es muy fácil de manejar y soporta procesamiento de audio en tiempo real. La biblioteca puede detectar eventos musicales como cuando ocurre un golpe de tambor, la frecuencia de una nota musical y el tempo o ritmo de una pista. Puede operar tanto offline (archivos de audio) como en flujos de audio en tiempo real, lo que la hace adecuada para editores de audio, instrumentos digitales y herramientas de análisis de sonido. Con soporte para detección de tono, seguimiento de beats, detección de onset, extracción de MFCC y procesamiento de señales en tiempo real, brinda a los desarrolladores las herramientas necesarias para crear aplicaciones de audio avanzadas.
Comenzando con Aubio
La forma más fácil de instalar Aubio es usando el Python Package Index (PyPI). Por favor, use el siguiente comando para una instalación completa.
Instalar usando Aubio
pip install aubio Instalar Aubio desde GitHub
go get -u github.com/aubio/aubio.git Detección de onset mediante Python
Una de las características más útiles de la biblioteca Aubio es la detección de onsets, que identifica cuándo comienza una nota musical o un evento sonoro. La detección de onsets encuentra el momento preciso en que un nuevo sonido o nota musical comienza. En música, un "onset" es el ataque de una nota — el instante en que se golpea un tambor, se pulsa una guitarra o una voz comienza una sílaba. Aubio incluye múltiples algoritmos de detección de onsets para diferentes casos de uso. El siguiente ejemplo muestra cómo detectar onsets dentro de un archivo de audio usando código Python.
¿Cómo detectar inicios en un archivo de audio mediante una biblioteca de 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)}")
Soporte de detección de tono
La detección de tono es otra capacidad importante de la biblioteca de código abierto Aubio. La detección de tono identifica la frecuencia fundamental (F0) de un sonido — esencialmente, "¿qué nota musical es esta?" Es el núcleo de cualquier afinador, extractor de melodías o herramienta de análisis vocal. Aubio soporta múltiples algoritmos de detección de tono como yin, yinfft, mcomb, fcomb, entre otros. Aquí hay un ejemplo sencillo que muestra cómo realizar la detección de tono en tiempo real dentro de aplicaciones Python.
¿Cómo realizar la detección de tono en tiempo real con 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)
Seguimiento del tempo y detección de pulsos mediante Python
La biblioteca de código abierto Aubio puede analizar patrones rítmicos y detectar pulsos y tempo en la música dentro de aplicaciones Python. Aubio puede escuchar audio y seguir el ritmo — detectando el tempo en BPM (pulsos por minuto) y localizando marcas de tiempo de cada pulso. Esto es invaluable para cualquier cosa, desde software de DJ hasta sincronización musical. La biblioteca determina la ubicación de los pulsos analizando cambios espectrales y patrones rítmicos en la señal de audio.
Lectura y escritura de archivos de sonido mediante Python
La biblioteca Python Aubio envuelve la E/S de archivos de audio mediante sus objetos source y sink, soportando múltiples formatos (WAV, FLAC, OGG, MP3 a través de libav o ffmpeg) y manejando la conversión de la tasa de muestreo automáticamente. Aquí hay un ejemplo sencillo que muestra cómo los desarrolladores de software pueden leer, procesar y escribir archivos de audio usando comandos Python.
¿Cómo leer, procesar y escribir archivos de audio con 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")