Ανάλυση Ήχου και Μουσικής σε Πραγματικό Χρόνο μέσω Δωρεάν Python Βιβλιοθήκης
Το Aubio είναι μια ανοιχτή βιβλιοθήκη επεξεργασίας ήχου Python που χρησιμοποιείται από προγραμματιστές λογισμικού για ανίχνευση τόνου, παρακολούθηση κτύπων, εξαγωγή MFCC και επεξεργασία ήχου σε πραγματικό χρόνο.
Τι είναι το Aubio;
Οι σύγχρονες εφαρμογές ήχου — όπως εργαλεία παραγωγής μουσικής, πλατφόρμες ανάλυσης ήχου και συστήματα επεξεργασίας ήχου σε πραγματικό χρόνο — απαιτούν αποδοτικούς τρόπους ανάλυσης των ηχητικών σημάτων. Μία δημοφιλής λύση ανοιχτού κώδικα για αυτό το σκοπό είναι η Aubio, μια ελαφριά αλλά ισχυρή βιβλιοθήκη σχεδιασμένη για την εξαγωγή χρήσιμων πληροφοριών από ηχητικά σήματα. Η Aubio είναι μια βιβλιοθήκη ανοιχτού κώδικα που έχει σχεδιαστεί για την εξαγωγή σχολιασμών και μουσικών χαρακτηριστικών από ηχητικά σήματα. Αναλύει ροές ήχου και εντοπίζει γεγονότα όπως οι αρχικές στιγμές των νοτών, το ύψος, οι κτύποι και ο ρυθμός. Είναι γραμμένη κυρίως σε C για υψηλή απόδοση και λειτουργεί σε Linux, macOS και Windows.
Η βιβλιοθήκη είναι πολύ εύκολη στη χρήση και υποστηρίζει επεξεργασία ήχου σε πραγματικό χρόνο. Η βιβλιοθήκη μπορεί να ανιχνεύει μουσικά γεγονότα όπως όταν χτυπάει ένα τύμπανο, τη συχνότητα μιας μουσικής νότας και το tempo ή το ρυθμό ενός κομματιού. Μπορεί να λειτουργεί τόσο εκτός σύνδεσης (αρχείο ήχου) όσο και σε ροές ήχου σε πραγματικό χρόνο, καθιστώντας την κατάλληλη για επεξεργαστές ήχου, ψηφιακά όργανα και εργαλεία ανάλυσης ήχου. Με υποστήριξη για ανίχνευση τόνου, παρακολούθηση κτύπου, ανίχνευση έναρξης, εξαγωγή MFCC και επεξεργασία σήματος σε πραγματικό χρόνο, παρέχει στους προγραμματιστές τα εργαλεία που χρειάζονται για την κατασκευή προηγμένων εφαρμογών ήχου.
Ξεκινώντας με το Aubio
Ο πιο εύκολος τρόπος για να εγκαταστήσετε το Aubio είναι μέσω του Python Package Index (PyPI). Παρακαλώ χρησιμοποιήστε την παρακάτω εντολή για πλήρη εγκατάσταση.
Εγκατάσταση χρησιμοποιώντας το Aubio
pip install aubio Εγκατάσταση του Aubio από το GitHub
go get -u github.com/aubio/aubio.git Ανίχνευση Έναρξης μέσω Python
Ένα από τα πιο χρήσιμα χαρακτηριστικά της βιβλιοθήκης Aubio είναι η ανίχνευση αρχής (onset detection), η οποία εντοπίζει πότε αρχίζει μια μουσική νότα ή ένα ηχητικό γεγονός. Η ανίχνευση αρχής βρίσκει τη ακριβή στιγμή που ένα νέο ήχο ή μουσική νότα αρχίζει. Στη μουσική, το "onset" είναι η επίθεση μιας νότας — η στιγμή που χτυπάται ένα τύμπανο, κροτάται μια κιθάρα ή μια φωνή αρχίζει μια συλλαβή. Η Aubio περιλαμβάνει πολλαπλούς αλγόριθμους ανίχνευσης αρχής για διαφορετικές περιπτώσεις χρήσης. Το παρακάτω παράδειγμα δείχνει πώς να ανιχνεύσετε τα Onsets μέσα σε ένα αρχείο ήχου χρησιμοποιώντας κώδικα Python.
Πώς να ανιχνεύσετε τις αρχικές στιγμές σε ένα αρχείο ήχου μέσω βιβλιοθήκης 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)}")
Υποστήριξη Ανίχνευσης Τονικού Ύψους
Η ανίχνευση τόνου (pitch detection) είναι μια άλλη σημαντική δυνατότητα της ανοιχτής πηγής βιβλιοθήκης Aubio. Η ανίχνευση τόνου εντοπίζει τη θεμελιώδη συχνότητα (F0) ενός ήχου — ουσιαστικά, "ποια μουσική νότα είναι αυτή;" Είναι ο πυρήνας κάθε συντονιστή, εξαγωγέα μελωδίας ή εργαλείου ανάλυσης φωνής. Η Aubio υποστηρίζει πολλαπλούς αλγόριθμους ανίχνευσης τόνου όπως yin, yinfft, mcomb, fcomb, κ.λπ. Εδώ είναι ένα απλό παράδειγμα που δείχνει πώς να εκτελέσετε ανίχνευση τόνου σε πραγματικό χρόνο μέσα σε εφαρμογές Python.
Πώς να εκτελέσετε ανίχνευση τόνου σε πραγματικό χρόνο με τη 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)
Παρακολούθηση Ρυθμού και Ανίχνευση Κτύπων μέσω Python
Η ανοιχτού κώδικα βιβλιοθήκη Aubio μπορεί να αναλύσει ρυθμικά μοτίβα και να εντοπίσει κτύπους και ρυθμό στη μουσική μέσα σε εφαρμογές Python. Η Aubio μπορεί να ακούει ήχο και να «χτυπά» μαζί — εντοπίζοντας τον ρυθμό σε BPM (κτύποι ανά λεπτό) και προσδιορίζοντας τα μεμονωμένα χρονικά σημεία των κτύπων. Αυτό είναι ανεκτίμητο για οτιδήποτε, από λογισμικό DJ μέχρι συγχρονισμό μουσικής. Η βιβλιοθήκη καθορίζει τις θέσεις των κτύπων αναλύοντας τις φασματικές αλλαγές και τα ρυθμικά μοτίβα στο σήμα ήχου.
Ανάγνωση και Γραφή Αρχείων Ήχου μέσω Python
Η βιβλιοθήκη Python Aubio περιβάλλει την είσοδο/έξοδο αρχείων ήχου μέσω των αντικειμένων source και sink, υποστηρίζοντας πολλαπλές μορφές (WAV, FLAC, OGG, MP3 μέσω libav ή ffmpeg) και διαχειριζόμενη αυτόματα τη μετατροπή του ρυθμού δειγματοληψίας. Εδώ είναι ένα απλό παράδειγμα που δείχνει πώς οι προγραμματιστές λογισμικού μπορούν να διαβάσουν, επεξεργαστούν και γράψουν αρχεία ήχου χρησιμοποιώντας εντολές Python.
Πώς να διαβάσετε, επεξεργαστείτε και γράψετε αρχεία ήχου με τη 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")