1. Produse
  2.   Audio
  3.   Python
  4.   Aubio
 
  

Analiză audio și muzicală în timp real prin bibliotecă Python gratuită

Aubio este o bibliotecă open source de procesare audio Python utilizată de dezvoltatorii de software pentru detectarea înălțimii, urmărirea bătăilor, extragerea MFCC și procesarea audio în timp real.

Ce este Aubio?

Aplicațiile moderne de audio — cum ar fi instrumentele de producție muzicală, platformele de analiză audio și sistemele de procesare a sunetului în timp real — necesită metode eficiente pentru a analiza semnalele sonore. O soluție open-source populară pentru acest scop este Aubio, o bibliotecă ușoară, dar puternică, concepută pentru a extrage informații semnificative din semnalele audio. Aubio este o bibliotecă open-source proiectată să extragă adnotări și caracteristici muzicale din semnalele audio. Analizează fluxurile audio și identifică evenimente precum începuturile notelor, înălțimea sunetului, bătăile și tempo-ul. Este scrisă în principal în C pentru performanță ridicată și funcționează pe Linux, macOS și Windows.

Biblioteca este foarte ușor de utilizat și suportă procesarea audio în timp real. Biblioteca poate detecta evenimente muzicale, cum ar fi când apare o lovitură de tobă, frecvența unei note muzicale și tempo-ul sau ritmul unei piese. Poate funcționa atât offline (fișiere audio), cât și în fluxuri audio în timp real, făcând-o potrivită pentru editori audio, instrumente digitale și instrumente de analiză a sunetului. Cu suport pentru detectarea înălțimii, urmărirea bătăilor, detectarea onset-ului, extragerea MFCC și procesarea semnalului în timp real, oferă dezvoltatorilor instrumentele necesare pentru a construi aplicații audio avansate.

Previous Next

Începerea cu Aubio

Cea mai simplă modalitate de a instala Aubio este prin utilizarea Python Package Index (PyPI). Vă rugăm să folosiți comanda următoare pentru instalarea completă.

Instalați folosind Aubio

pip install aubio 

Instalați Aubio de pe GitHub

go get -u github.com/aubio/aubio.git 

Detectarea de început prin Python

Una dintre cele mai utile caracteristici ale bibliotecii Aubio este detectarea onset-urilor, care identifică momentul în care începe o notă muzicală sau un eveniment sonor. Detectarea onset-urilor găsește momentul precis în care începe un sunet nou sau o notă muzicală. În muzică, un „onset” este atacul unei note — instantul în care un toboșar lovește o tobă, o chitară este ciupită sau o voce începe o silabă. Aubio include multiple algoritmi de detectare a onset-urilor pentru diferite cazuri de utilizare. Exemplul următor demonstrează cum să detectezi onset-urile într-un fișier audio folosind cod Python.

Cum să detectați începuturile într-un fișier audio printr-o bibliotecă 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)}")

Suport pentru detectarea înălțimii

Detectarea înălțimii (pitch) este o altă capacitate importantă a bibliotecii open source Aubio. Detectarea înălțimii identifică frecvența fundamentală (F0) a unui sunet — practic, „ce notă muzicală este aceasta?”. Este nucleul oricărui acordor, extractor de melodii sau instrument de analiză vocală. Aubio suportă multiple algoritmi de detectare a înălțimii, cum ar fi yin, yinfft, mcomb, fcomb și altele. Iată un exemplu simplu care demonstrează cum să efectuezi detectarea în timp real a înălțimii în aplicații Python.

Cum să realizați detectarea în timp real a înălțimii sunetului cu 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)

Urmărirea tempo-ului și detectarea bătăilor prin Python

Biblioteca open source Aubio poate analiza modele ritmice și detecta bătăile și tempo-ul în muzică în cadrul aplicațiilor Python. Aubio poate asculta audio și poate bate ritmul — detectând tempo-ul în BPM (bătăi pe minut) și identificând marcajele temporale ale fiecărei bătăi. Aceasta este de neprețuit pentru orice, de la software de DJ la sincronizarea muzicii. Biblioteca determină locațiile bătăilor prin analizarea schimbărilor spectrale și a modelelor ritmice din semnalul audio.

Citirea și scrierea fișierelor audio prin Python

Biblioteca Python Aubio înfășoară I/O-ul fișierelor audio prin obiectele sale source și sink, suportând multiple formate (WAV, FLAC, OGG, MP3 prin libav sau ffmpeg) și gestionând automat conversia ratei de eșantionare. Iată un exemplu simplu care arată cum dezvoltatorii de software pot efectua citirea, procesarea și scrierea fișierelor audio utilizând comenzi Python.

Cum să citiți, procesați și scrieți fișiere audio cu 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")

 Română