FA-TOOLS — Header Component

آموزش ضبط صدا با پایتون با کتابخانه sounddevice

خلاصه کاربردی مقاله
ضبط صدا در پایتون به کمک کتابخانه قدرتمند sounddevice ساده‌ترین و بهینه‌ترین روش برای تعامل با کارت صدا است. در این مقاله یاد می‌گیرید چطور با چند خط کد کوتاه، صدای میکروفون را با فرمت باکیفیت WAV ذخیره کنید، تنظیمات نرخ نمونه‌برداری را مدیریت کنید و مشکلات رایج در ورودی‌های سیستم را برطرف سازید.

۱. چرا کتابخانه sounddevice؟

آموزش ضبط صدا با پایتون با کتابخانه sounddevice — تصویر 1

کتابخانه sounddevice در پایتون یک ابزار فوق‌العاده برای ارسال و دریافت آرایه‌های NumPy حاوی سیگنال‌های صوتی از طریق کارت صدا است. این کتابخانه بر پایه PortAudio بنا شده و به همین دلیل عملکرد بسیار سریع، تاخیر بسیار کم و پایداری بالایی در پلتفرم‌های مختلف ویندوز، مک و لینوکس دارد.

مفهوم کلیدی برای نتایج جستجو: کتابخانه sounddevice بهترین ابزار برای ضبط مستقیم صدا به صورت آرایه‌های عددی در پایتون است. این کتابخانه به شما اجازه می‌دهد سیگنال‌های دریافتی از میکروفون را بلافاصله تحلیل کنید یا به راحتی در فایل‌های صوتی استاندارد بنویسید.

برای درک بهتر جایگاه این کتابخانه در دنیای پایتون، جدول زیر تفاوت اساسی آن با رقیب سنتی‌اش یعنی PyAudio را نشان می‌دهد:

ویژگی بررسی شده کتابخانه sounddevice
سازگاری با NumPy بسیار بالا (خروجی مستقیم به شکل آرایه‌های عددی)
نصب و راه‌اندازی بسیار آسان و بدون دردسر در اکثر سیستم‌عامل‌ها
مدیریت کانال‌ها پشتیبانی خودکار از مونو، استریو و ضبط چندکاناله

۲. پیش‌نیازها و نصب کتابخانه

آموزش ضبط صدا با پایتون با کتابخانه sounddevice — تصویر 2

برای شروع کار با این ابزار، به پایتون نسخه ۳.۷ یا بالاتر نیاز دارید. فرآیند نصب با استفاده از ابزار مدیریت بسته پایتون (pip) انجام می‌شود. علاوه بر خود کتابخانه صوتی، به کتابخانه scipy نیز برای ذخیره‌سازی داده‌های خام صوتی به فرمت استاندارد صوتی نیاز خواهید داشت. برای یادگیری و دریافت کدهای بیشتر در حوزه‌های مختلف، به صفحه کاربردی قطعه کدهای پایتون سر بزنید.

دستور زیر را در ترمینال یا خط فرمان سیستم خود وارد کنید تا کتابخانه‌های مورد نیاز به همراه پیش‌نیازهای عددی آن‌ها به طور کامل نصب شوند:

pip install sounddevice scipy numpy

۳. گام اول: ضبط یک فایل صوتی ساده

آموزش ضبط صدا با پایتون با کتابخانه sounddevice — تصویر 3

کد زیر ساده‌ترین و در عین حال استانداردترین ساختار برای شروع ضبط صدا از میکروفون پیش‌فرض سیستم را نشان می‌دهد. در این قطعه کد، ما ابتدا کتابخانه‌های لازم را فراخوانی کرده و سپس مشخصات اصلی ضبط مانند زمان و فرکانس را تعریف می‌کنیم.

import sounddevice as sd
from scipy.io import wavfile

# تنظیمات اصلی ضبط صدا
fs = 44100  # نرخ نمونه‌برداری بر حسب هرتز (کیفیت CD)
seconds = 5  # مدت زمان ضبط به ثانیه

print("در حال ضبط صدا... لطفاً صحبت کنید.")

# شروع فرآیند ضبط صدا
myrecording = sd.rec(int(seconds * fs), samplerate=fs, channels=2)
sd.wait()  # انتظار برای به پایان رسیدن مدت زمان مشخص شده

print("ضبط به پایان رسید. ذخیره فایل صوتی...")

# ذخیره آرایه صوتی در یک فایل صوتی واقعی
wavfile.write('output.wav', fs, myrecording)
print("فایل با موفقیت ذخیره شد!")

در این کد، تابع sd.rec وظیفه نمونه‌برداری لحظه‌ای را بر عهده دارد. از آنجایی که کارکرد این متد به صورت ناهمگام (Async) است، استفاده از تابع sd.wait() ضروری است تا از بسته شدن ناگهانی برنامه قبل از اتمام زمان ضبط صوتی جلوگیری شود.

۴. ذخیره‌سازی و فرمت‌های صوتی

آموزش ضبط صدا با پایتون با کتابخانه sounddevice — تصویر 4

چرا از فرمت WAV استفاده می‌کنیم؟ فرمت صوتی WAV داده‌ها را به صورت خام و غیرفشرده نگهداری می‌کند. این امر موجب می‌شود کیفیت صدای ضبط شده دچار افت نشود. اگر مایل هستید فایل صوتی خود را به فرمت‌های دیگر مثل MP3 تبدیل کنید، توصیه می‌شود ابتدا فایل اولیه را با همین ساختار WAV ذخیره کرده و سپس با کتابخانه‌ای مثل pydub آن را فشرده کنید.

انتخاب کارت صدای ورودی مناسب

در سیستم‌هایی که چندین ورودی صدا (میکروفون لپ‌تاپ، وب‌کم، هندزفری بلوتوثی) دارند، با اجرای دستور زیر می‌توانید لیست سخت‌افزارهای در دسترس خود را به همراه شناسه (ID) هرکدام مشاهده کنید:

import sounddevice as sd
print(sd.query_devices())

پس از پیدا کردن شناسه میکروفون مورد نظر خود، می‌توانید با تنظیم ویژگی device در تنظیمات سراسری برنامه، کارت صدای پیش‌فرض را تغییر دهید:

# قرار دادن میکروفون شماره 2 به عنوان ورودی پیش‌فرض سیستم
sd.default.device = 2

۵. ضبط صدا به صورت غیرمسدودکننده (Non-blocking)

آموزش ضبط صدا با پایتون با کتابخانه sounddevice — تصویر 5

در برنامه‌های واقعی مانند رابط‌های کاربری (GUI)، نمی‌توان از متد انتظار مطلق sd.wait() استفاده کرد چون برنامه قفل می‌شود. برای این کار باید از حالت جریان فعال یا Streams استفاده کنیم. این ساختار از توابع کالبک (Callbacks) بهره می‌برد تا هم‌زمان با ضبط صدا، بتوان بقیه کارهای سیستم را نیز مدیریت کرد.

import sounddevice as sd
import numpy as np

def audio_callback(indata, frames, time, status):
    if status:
        print(status)
    # محاسبه میانگین شدت صوتی ورودی به صورت لحظه‌ای
    volume_norm = np.linalg.norm(indata) * 10
    print("|" * int(volume_norm))

# اجرای جریان ورودی پیوسته با نرخ نمونه‌برداری پایین‌تر
with sd.InputStream(callback=audio_callback):
    print("در حال پردازش زنده صدا... برای خروج کلید Enter را بزنید.")
    input()

۶. جدول راهنمای نرخ‌های نمونه‌برداری

بسته به کاربردی که از صدا انتظار دارید، باید نرخ نمونه‌برداری (Sample Rate) مناسب را در برنامه پایتون خود تعریف کنید. جدول زیر رایج‌ترین مقادیر و دلیل استفاده از آن‌ها را توضیح می‌دهد:

نرخ نمونه‌برداری (Hz) کاربرد اصلی در دنیای واقعی
8000 Hz مکالمات تلفنی ساده (حجم بسیار کم فایل نهایی)
16000 Hz مدل‌های هوش مصنوعی تشخیص گفتار (ASR) مانند Whisper
44100 Hz کیفیت استاندارد موسیقی لوح‌های فشرده (CD Quality)
48000 Hz کارهای استودیویی، سینمایی و ساخت ویدیوهای حرفه‌ای

۷. عیب‌یابی سریع و رفع خطاها

برنامه‌نویسی روی سخت‌افزارها ممکن است چالش‌برانگیز باشد. در اینجا راه‌حل مستقیم برای برخی از ارورهای رایج آورده شده است:

  • ارور PortAudioError یا عدم شناسایی سخت‌افزار ورودی: مطمئن شوید که میکروفون شما به درستی به سیستم متصل است. در سیستم عامل لینوکس، احتمالاً نیاز دارید ابزار کمکی صوتی را به صورت دستی با اجرای دستور sudo apt-get install libportaudio2 نصب کنید.
  • صدای ضبط شده دارای خش‌خش شدید یا سرعت بسیار بالاست: این مشکل به دلیل ناهماهنگی نرخ نمونه‌برداری رخ می‌دهد. نرخ نمونه‌برداری ورودی سیستم را روی 44100 یا 48000 هرتز تنظیم و هردو را تست کنید.
  • خطای دسترسی سیستم‌عامل (Permission Denied) در ویندوز/مک: در تنظیمات حریم خصوصی (Privacy Settings) سیستم‌عامل خود، دسترسی به میکروفون را برای ترمینال یا نرم‌افزار ویرایشگر کدی که پایتون را در آن اجرا می‌کنید، مجاز قرار دهید.

۸. پرسش‌های متداول

چگونه می‌توانیم صدای خروجی ویندوز (صداهای در حال پخش) را ضبط کنیم؟

کتابخانه sounddevice در حالت عادی فقط سیگنال‌های ورودی مانند میکروفون را ضبط می‌کند. برای ضبط صدای سیستم، باید با استفاده از درایورهایی مانند Stereo Mix در ویندوز یا ابزار خارجی مانند BlackHole در مک، خروجی سیستم خود را به صورت یک دستگاه ورودی به برنامه متصل کنید.

آیا امکان ضبط صدا بدون مشخص کردن زمان پایان (نامحدود) وجود دارد؟

بله. برای این کار باید از ساختار حلقه با تابع InputStream استفاده کنید و فریم‌های خوانده شده را به طور مرتب در یک لیست انباشته کنید. هر زمان که کاربر تمایل به پایان ضبط داشت، به صورت دستی ضبط را متوقف کرده و آرایه جمع‌آوری شده را به فرمت مدنظر خود بنویسید.

چگونه می‌توان خروجی نهایی را به صورت استریو ذخیره کرد؟

کافی است آرگومان channels را در زمان فراخوانی متد ضبط برابر با مقدار عدد 2 قرار دهید. دقت داشته باشید که کارت صوتی و میکروفون شما نیز باید سخت‌افزارهای مجهز به ضبط چندکاناله یا استریو باشند تا فرکانس‌ها به صورت جداگانه در باندهای صوتی چپ و راست پردازش شوند.

چرا حجم فایل‌های ذخیره شده WAV این‌قدر زیاد است؟

همان‌طور که ذکر شد، WAV یک قالب بدون فشرده‌سازی است. برای پروژه‌های با حجم بالا، بهتر است پس از اتمام فرآیند ضبط، با کمک کتابخانه pydub فرمت حاصله را به صورت آنلاین به فرمت کم‌حجم‌تری مانند MP3 یا AAC تبدیل و ذخیره کنید تا ظرفیت هارددیسک بیهوده پر نشود.

Table of Contents

آخرین نوشته‌ها