ניתוח אודיו ומוזיקה בזמן אמת באמצעות ספריית פייתון חינמית
Aubio היא ספריית עיבוד אודיו פייתון קוד פתוח המשמשת מפתחי תוכנה לזיהוי גובה צליל, מעקב קצב, חילוץ MFCC, ועיבוד אודיו בזמן אמת.
מהו Aubio?
יישומים מודרניים של שמע—כגון כלי הפקת מוזיקה, פלטפורמות לניתוח אודיו ומערכות עיבוד קול בזמן אמת—דורשים דרכים יעילות לניתוח אותות קול. פתרון קוד פתוח פופולרי למטרה זו הוא Aubio, ספרייה קלה אך חזקה שנועדה לחלץ מידע משמעותי מאותות שמע. Aubio היא ספרייה בקוד פתוח שנועדה לחלץ אנוטציות ותכונות מוזיקליות מאותות שמע. היא מנתחת זרמי אודיו ומזהה אירועים כגון תחילת תווים, גובה צליל, קצב ו‑tempo. היא נכתבה בעיקר ב‑C לביצועים גבוהים ופועלת על גבי Linux, macOS ו‑Windows.
הספרייה קלה מאוד לשימוש ותומכת בעיבוד אודיו בזמן אמת. הספרייה יכולה לזהות אירועי מוזיקה כגון מתי מתרחשת מכה בתוף, תדירות של תו מוזיקלי וקצב או ריתמוס של רצועה. היא יכולה לפעול הן במצב לא מקוון (קבצי אודיו) והן בזרמי אודיו בזמן אמת, מה שהופך אותה למתאימה לעורכי אודיו, כלי נגינה דיגיטליים וכלי ניתוח קול. עם תמיכה בזיהוי גובה צליל, מעקב אחרי ביט, זיהוי תחילת צליל, חילוץ MFCC ועיבוד אות בזמן אמת, היא מספקת למפתחים את הכלים הדרושים לבניית יישומי אודיו מתקדמים.
התחלה עם Aubio
הדרך הקלה ביותר להתקנת Aubio היא באמצעות אינדקס החבילות של פייתון (PyPI). אנא השתמשו בפקודה הבאה להתקנה מלאה.
התקנה באמצעות Aubio
pip install aubio התקנת Aubio מ‑GitHub
go get -u github.com/aubio/aubio.git זיהוי התחלה באמצעות Python
אחת התכונות השימושיות ביותר של ספריית Aubio היא זיהוי התחלה (onset detection), אשר מזהה מתי נפתח תו מוזיקלי או אירוע קול. זיהוי התחלה מוצא את הרגע המדויק שבו צליל חדש או תו מוזיקלי מתחילים. במוזיקה, "onset" הוא ההתקפה של תו — הרגע שבו תוף נ struck, גיטרה נמתחת, או קול מתחיל תנועה. Aubio כוללת מספר אלגוריתמים לזיהוי התחלה למקרים שונים. הדוגמה הבאה מדגימה כיצד לאתר התחלות בתוך קובץ שמע באמצעות קוד פייתון.
איך לאתר תחילת תווים בקובץ שמע באמצעות ספריית פייתון?
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)}")
תמיכה בזיהוי גובה צליל
זיהוי גובה צליל הוא יכולת חשובה נוספת של ספריית Aubio בקוד פתוח. זיהוי גובה צליל מזהה את התדירות הבסיסית (F0) של צליל — בעצם, "איזה תו מוזיקלי זה?" זהו הליבה של כל מכוונן, מחלץ מנגינות, או כלי ניתוח קולי. Aubio תומכת במספר אלגוריתמים לזיהוי גובה צליל כגון yin, yinfft, mcomb, fcomb, וכן הלאה. הנה דוגמה פשוטה שמדגימה כיצד לבצע זיהוי גובה צליל בזמן אמת בתוך יישומי פייתון.
איך לבצע זיהוי גובה צליל בזמן אמת באמצעות פייתון?
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 יכולה לנתח תבניות ריתמיות ולזהות פעימות וקצב במוזיקה בתוך יישומי פייתון. Aubio יכולה להאזין לאודיו וללחוץ יחד — לזהות את הקצב ב‑BPM (פעימות לדקה) ולזהות חותמות זמן של כל פעולה בנפרד. זה יקר ערך לכל דבר מתוכנת DJ ועד סינכרון מוזיקה. הספרייה קובעת את מיקומי הפעימות על‑ידי ניתוח שינויים ספקטרליים ותבניות ריתמיות באות האודיו.
קריאת וכתיבת קבצי קול באמצעות Python
הספרייה הפייתונית Aubio עוטפת קלט/פלט של קבצי אודיו דרך אובייקטי המקור והיעד שלה, תומכת במגוון פורמטים (WAV, FLAC, OGG, MP3 דרך libav או ffmpeg) ומטפלת בהמרת קצב הדגימה באופן אוטומטי. הנה דוגמה פשוטה שמראה כיצד מפתחי תוכנה יכולים לבצע קריאת קובץ אודיו, עיבוד וכתיבה באמצעות פקודות פייתון.
איך לקרוא, לעבד ולכתוב קבצי שמע באמצעות פייתון?
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")