تحلیل صوتی و موسیقی زمان واقعی با کتابخانه رایگان پایتون
Aubio یک کتابخانه منبع باز پایتون برای پردازش صوتی است که توسط توسعهدهندگان نرمافزار برای تشخیص ارتفاع صدا، ردیابی ضربه، استخراج MFCC و پردازش صوتی زمان واقعی استفاده میشود.
آوبیو چیست؟
برنامههای صوتی مدرن—مانند ابزارهای تولید موسیقی، پلتفرمهای تحلیل صوت و سیستمهای پردازش صدا بهصورت زمان واقعی—به روشهای کارآمدی برای تجزیه و تحلیل سیگنالهای صوتی نیاز دارند. یکی از راهحلهای متنباز محبوب برای این منظور Aubio است، کتابخانهای سبک وزن اما قدرتمند که برای استخراج اطلاعات معنادار از سیگنالهای صوتی طراحی شده است. Aubio کتابخانهای متنباز است که برای استخراج حاشیهنویسیها و ویژگیهای موسیقیایی از سیگنالهای صوتی ساخته شده. این کتابخانه جریانهای صوتی را تجزیه و تحلیل میکند و رویدادهایی مانند شروع نتها، ارتفاع صدا، ضربها و تمپو را شناسایی مینماید. این کتابخانه عمدتاً به زبان C نوشته شده است تا عملکرد بالایی داشته باشد و بر روی لینوکس، macOS و ویندوز کار میکند.
کتابخانه بسیار آسان برای استفاده است و از پردازش صوتی زمان واقعی پشتیبانی میکند. این کتابخانه میتواند رویدادهای موسیقیایی مانند ضربه درام، فرکانس یک نت موسیقی و تمپو یا ریتم یک قطعه را تشخیص دهد. میتواند هم به صورت آفلاین (فایلهای صوتی) و هم در جریانهای صوتی زمان واقعی کار کند، که آن را برای ویرایشگرهای صوتی، سازهای دیجیتال و ابزارهای تحلیل صدا مناسب میسازد. با پشتیبانی از تشخیص ارتفاع صدا، ردیابی بیت، تشخیص آغاز، استخراج MFCC و پردازش سیگنال زمان واقعی، ابزارهای لازم برای ساخت برنامههای پیشرفته صوتی را در اختیار توسعهدهندگان قرار میدهد.
شروع کار با آوبیو
آسانترین روش برای نصب آوبیو استفاده از مخزن بستههای پایتون (PyPI) است. لطفاً برای نصب کامل، دستور زیر را اجرا کنید.
نصب با استفاده از آوبیو
pip install aubio نصب آوبیو از گیتهاب
go get -u github.com/aubio/aubio.git تشخیص آغاز با پایتون
یکی از مفیدترین ویژگیهای کتابخانه Aubio، تشخیص آغاز (onset detection) است که زمان شروع یک نت موسیقی یا رویداد صوتی را شناسایی میکند. تشخیص آغاز لحظه دقیق شروع یک صدای جدید یا نت موسیقی را پیدا میکند. در موسیقی، «آغاز» (onset) به حمله یک نت اشاره دارد — لحظهای که یک درام زده میشود، یک گیتار کشیده میشود یا یک صدا یک هجا را آغاز میکند. Aubio شامل الگوریتمهای متعددی برای تشخیص آغاز برای موارد استفاده مختلف است. مثال زیر نشان میدهد که چگونه میتوان آغازها را داخل یک فایل صوتی با استفاده از کد Python تشخیص داد.
چگونه میتوان شروعها (Onsets) را در یک فایل صوتی با استفاده از کتابخانه پایتون تشخیص داد؟
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 انجام داد.
چگونه میتوان تشخیص ارتفاع صدا بهصورت زمان واقعی را با پایتون انجام داد؟
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)
ردیابی تمپو و تشخیص ضرب با پایتون
کتابخانه منبع باز Aubio میتواند الگوهای ریتمیک را تجزیه و تحلیل کرده و ضربها و تمپو را در موسیقی داخل برنامههای پایتون شناسایی کند. Aubio میتواند صدا را گوش دهد و بهصورت همزمان ضربها را تشخیص دهد — تمپو را بر حسب BPM (ضربه در دقیقه) شناسایی کرده و زمانمهرهای تکتک ضربها را مشخص میکند. این برای هر چیزی از نرمافزارهای دیجی تا همگامسازی موسیقی بسیار ارزشمند است. کتابخانه مکانهای ضربها را با تجزیه و تحلیل تغییرات طیفی و الگوهای ریتمیک در سیگنال صوتی تعیین میکند.
خواندن و نوشتن فایل صوتی با پایتون
کتابخانه پایتون Aubio ورودی/خروجی فایلهای صوتی را از طریق اشیاء source و sink خود میپیچاند، از فرمتهای متعدد (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")