Analiza dźwięku i muzyki w czasie rzeczywistym za pomocą darmowej biblioteki Pythona
Aubio to otwarta biblioteka przetwarzania dźwięku w Pythonie, używana przez programistów do wykrywania wysokości dźwięku, śledzenia rytmu, ekstrakcji MFCC oraz przetwarzania audio w czasie rzeczywistym.
Czym jest Aubio?
Współczesne aplikacje audio — takie jak narzędzia do produkcji muzyki, platformy analizy dźwięku oraz systemy przetwarzania dźwięku w czasie rzeczywistym — wymagają efektywnych metod analizy sygnałów dźwiękowych. Popularnym rozwiązaniem open‑source w tym zakresie jest Aubio, lekka, ale potężna biblioteka zaprojektowana do wyodrębniania istotnych informacji z sygnałów audio. Aubio jest biblioteką open‑source przeznaczoną do wyodrębniania adnotacji i cech muzycznych z sygnałów audio. Analizuje strumienie audio i identyfikuje zdarzenia takie jak początki nut, wysokość dźwięku, uderzenia i tempo. Została napisana głównie w języku C dla wysokiej wydajności i działa na systemach Linux, macOS i Windows.
Biblioteka jest bardzo łatwa w obsłudze i obsługuje przetwarzanie dźwięku w czasie rzeczywistym. Biblioteka może wykrywać zdarzenia muzyczne, takie jak uderzenie bębna, częstotliwość nuty oraz tempo lub rytm utworu. Może działać zarówno offline (pliki audio), jak i w strumieniach dźwiękowych w czasie rzeczywistym, co czyni ją odpowiednią dla edytorów audio, instrumentów cyfrowych i narzędzi analizy dźwięku. Dzięki wsparciu wykrywania wysokości dźwięku, śledzenia beatów, wykrywania ataków, ekstrakcji MFCC oraz przetwarzania sygnału w czasie rzeczywistym, zapewnia programistom narzędzia potrzebne do tworzenia zaawansowanych aplikacji audio.
Rozpoczęcie pracy z Aubio
Najłatwiejszy sposób instalacji Aubio to użycie Python Package Index (PyPI). Proszę użyć następującego polecenia, aby przeprowadzić pełną instalację.
Instalacja przy użyciu Aubio
pip install aubio Zainstaluj Aubio z GitHub
go get -u github.com/aubio/aubio.git Wykrywanie początków przy użyciu Pythona
Jedną z najbardziej przydatnych funkcji biblioteki Aubio jest wykrywanie początków (onset detection), które identyfikuje, kiedy zaczyna się nuta muzyczna lub zdarzenie dźwiękowe. Wykrywanie początków znajduje dokładny moment, w którym pojawia się nowy dźwięk lub nuta muzyczna. W muzyce "onset" to atak nuty — chwila, w której uderza bęben, szarpie się gitara lub głos rozpoczyna sylabę. Aubio zawiera wiele algorytmów wykrywania początków dla różnych zastosowań. Poniższy przykład demonstruje, jak wykrywać początki w pliku audio przy użyciu kodu w Pythonie.
Jak wykrywać początki dźwięku w pliku audio przy użyciu biblioteki 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)}")
Wsparcie wykrywania wysokości dźwięku
Wykrywanie wysokości dźwięku (pitch detection) to kolejna ważna funkcja otwartoźródłowej biblioteki Aubio. Wykrywanie wysokości identyfikuje podstawową częstotliwość (F0) dźwięku — w zasadzie, "jaka to nuta?". Jest to podstawa każdego tunera, ekstraktora melodii lub narzędzia do analizy wokalu. Aubio obsługuje wiele algorytmów wykrywania wysokości, takich jak yin, yinfft, mcomb, fcomb i inne. Oto prosty przykład, który demonstruje, jak przeprowadzić wykrywanie wysokości dźwięku w czasie rzeczywistym w aplikacjach Pythona.
Jak wykonać wykrywanie wysokości dźwięku w czasie rzeczywistym przy użyciu Pythona?
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)
Śledzenie tempa i wykrywanie beatów przy użyciu Pythona
Biblioteka open source Aubio może analizować wzorce rytmiczne oraz wykrywać uderzenia i tempo w muzyce w aplikacjach Python. Aubio potrafi słuchać dźwięku i „klikać” w rytm — wykrywając tempo w BPM (uderzenia na minutę) oraz określając dokładne znaczniki czasowe poszczególnych uderzeń. Jest to nieocenione w zastosowaniach od oprogramowania DJ-skiego po synchronizację muzyki. Biblioteka określa położenie uderzeń, analizując zmiany spektralne i wzorce rytmiczne w sygnale audio.
Odczyt i zapis plików dźwiękowych przy użyciu Pythona
Biblioteka Python Aubio opakowuje operacje I/O plików audio za pomocą obiektów source i sink, obsługując wiele formatów (WAV, FLAC, OGG, MP3 poprzez libav lub ffmpeg) i automatycznie konwertując częstotliwość próbkowania. Oto prosty przykład, który pokazuje, jak programiści mogą odczytywać, przetwarzać i zapisywać pliki audio przy użyciu poleceń Pythona.
Jak odczytywać, przetwarzać i zapisywać pliki audio przy użyciu Pythona?
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")