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

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.

Previous Next

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")

 Polski