پایتون Python پروژه رزبری پای

آموزش ضبط صدا در رسپبری پای Raspberry Pi توسط پایتون Python

voice-recording-with-raspberry-pi-and-python-digispark
نوشته شده توسط نیلوفر مهرنیا

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

 


تجهیزات لازم برای ضبط صدا


اولین قدم فراهم کردن برد رسپبری پای می‌باشد. من از رسپبری ۳ مدل B استفاده کردم. برد رسپری پای به تنهایی قابل راه اندازی نیست و یک سری لوازم تکمیلی نیاز دارد. برای این منظور به می‌توانید به آموزش راه اندازی رزبری پای ۳ بی پلاس Raspberry Pi 3 B plus و یا آموزش راه اندازی رزبری پای ۴ Raspberry Pi مراجعه کنید. کلیه مراحل و نیازمندی‌ها توسط همکارم توضیح داده شده است. از آنجایی که این پروژه ضبط صدا توسط برد رزبری پای است، طبیعتا به یک میکروفن یا هدست نیاز داریم. من از میکروفن USB استفاده کردم. توجه داشته باشید که اگر میکروفن یا هدست شما دارای جک ۳٫۵ mm است باید از یک کارت صدا usb استفاده کنید. این کارت صداها بسیار ارزان و در دسترس هستند اما کیفیت صدای ضبط‌ شده معمولاً راضی‌کننده نیست. لازم به ذکر است که جک ۳٫۵ میلی متری روی برد رزبری پای برای خروجی صدا به کار می‌رود. بنابراین در این پروژه توسط این جک هیچ کارایی نخواهیم داشت.

 


کتابخانه پایتون ضبط صدا


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

sudo apt-get install python-pyaudio

 

میکروفن خود را متصل کنید. برای اینکه ببینید کارت صدا یا میکروفن توسط رسپبری شناسایی شده یا نه؛ می‌توانید از دستور زیر استفاده کنید. توسط این دستور میکروفن usb را در لیست نشان داده شده پیدا کنید.

arecord –l

میکروفن من با متن زیر در لیست نشان داده شده است.

Card 0: set[C_media USB Headphone set], device 0: USB Audio[USB Audio]

پس میکروفن من باید با دستور hw:0,0 برای ضبط صدا معرفی شود. عدد ۰ اول شماره کارت مورداستفاده و ۰ دوم شماره دیوایس می‌باشد. اگر بخواهیم بدون کد پایتون و در ترمینال اقدام به ضبط صدا به‌صورت مستقیم کنیم باید دستور زیر را استفاده کنیم.

arecord –D hw:0,0 –d 5 –f cd name.mp3 –c 1

برای اجرای این دستور کافیست از کلید inter استفاده کنید. پس از این اقدام، دستور اجرا شده و ۵ ثانیه صدا را دریافت می‌کند. سپس در مسیر اصلی به نام name با فرمت Mp3 ذخیره می‌کند.لازم به ذکر است که امکان ذخیره فرمت‌های دیگری از جمله .wav هم فراهم می‌باشد. و اما دستور –c 1 مربوط به Channel مورداستفاده می‌باشد، این مقدار باید ۱ باشد.

 


کد پایتون ضبط صدا در رسپبری پای


کدهای زیر به زبان پایتون، برای ضیط صدا توسط میکروفن USB در برد رزبری پای نوشته شده‌اند. کافیست میکروفن را به برد رسپبری پای متصل کرده و این کدها را اجرا کنید. چنانچه روش استفاده از پایتون در برد رزبری پای را نمی‌دانید، کافیست به آموزش‌های پایتون Python در دی دیجی اسپارک مراجعه کنید.

import pyaudio
import wave

form_1 = pyaudio.paInt16 # 16-bit resolution
chans = 1 # 1 channel
samp_rate = 44100 # 44.1kHz sampling rate
chunk = 4096 # 2^12 samples for buffer
record_secs = 5 # seconds to record
dev_index = 2 # device index found by p.get_device_info_by_index(ii)
wav_output_filename = 'name.wav' # name of .wav file


audio = pyaudio.PyAudio() # create pyaudio instantiation


#for i in range(audio.get_device_count());
#print(audio.get_device_info_by_index(i))

# create pyaudio stream
stream = audio.open(format = form_1, channels = chans, rate = samp_rate, \
input_device_index = dev_index,input = True, \
frames_per_buffer=chunk)
print("recording")
frames = []

# loop through stream and append audio chunks to frame array
for ii in range(0,int((samp_rate/chunk)*record_secs)):
data = stream.read(chunk)
frames.append(data)

print("finished recording")

# stop the stream, close it, and terminate the pyaudio instantiation
stream.stop_stream()
stream.close()
audio.terminate()

# save the audio frames as .wav file
wavefile = wave.open(wav_output_filename,'wb')
wavefile.setnchannels(chans)
wavefile.setsampwidth(audio.get_sample_size(form_1))
wavefile.setframerate(samp_rate)
wavefile.writeframes(b''.join(frames))
wavefile.close()

خروجی کدهای بالا به شکل زیر در مسیر مشخص شده ذخیره می‌شوند.

 


رفع مشکلات رایج در اجرای پایتون


پس از اجرای کد بالا ممکن است به خطوط زیادی ارور برخورد کنید. ارورهایی از جمله موارد زیر:

ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear

این ارور ها اهمیت زیادی ندارند و با کامنت کردن خط مربوطه در فایل alsa.conf حل می‌شوند. برای این کار باید در ترمینال دستور زیر را وارد کنید.

sudo nano /usr/share/alsa/alsa.conf

و برای مثال برای این ارور خط pcm.rear cards.pcm.rear را کامنت می‌کنیم. اگر به ارور زیر برخورد کردید:

ALSA lib confmisc.c:767:(parse_card) cannot find card '1'

در همان فایل Alsa.conf عدد مقابل خطوط زیر را به ۰ تغییر دهید.

Defaults.ctl.card     ۰

Defaults.pcm.card   ۰


همین‌طور اگر با ارور زیر مواجه شدید.

jack server is not running or cannot be started

کافی است در ترمینال دستور jack_control start را بنویسید تا فعال شود. و در آخر اگر ارور OSError دریافت کردید.

OSError: [Errno_9981] Input overflowed

مقدار متغیر chunk را که مقدار حافظه تخصیص داده‌شده است، زیادتر کنید؛ مثلاً ۳۲۷۶۸٫ مقدار samp_rate نوشته‌شده در برنامه، بستگی به کارت صدا دارد. من مقدار ۴۴۱۰۰ را قراردادم؛ اما ممکن است برای شما متفاوت باشد که در این صورت همان دستور ضبط صدا در ترمینال، یعنی:

arecord –D hw:0,0 –d 5 –f cd name.mp3 –c 1

این مقدار را به شما نشان می‌دهد که می‌توانید عدد آن را در کد جایگزین کنید.

 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید. در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

درباره نویسنده

نیلوفر مهرنیا

مهندس نرم افزار

تبادل نظر و رفع عیب با ثبت دیدگاه

۱۲ دیدگاه

    • سلام
      من از یک میکروفن usb مینی استفاده کردم. کیفیت این میکروفن ها به نسبت قیمتشان عالی است.
      میکروفن مینی usb یا میکروفن رومیزی را سرچ کنید.

  • سلام ممنون از آموزش خوبتان
    من خیلی علاقه مندم از raspberry pi برای ساخت یک ربات که قابلیت حرکت داشته باشه و با دسته ایکس باکس بشه کنترلش کرد و دوربین داشته باشه استفاده کنم
    آموزش های جسته گریخته در اینترنت هست اما نگرانم که آیا تجهیزاتشان در ایران هست یا خیر
    لطفا راهنمایی می کنید از کجا باید شروع کنم اگر پکیج قابل خریداری هست که صفر تا صد آموزش و قطعات همراهش باشه لطفا راهنمایی کنید از کجا می توانم خریداری کنم
    این هم شماره من هست
    ******
    با تشکر

  • سلام. مرسی از آموزش های خوبتون. من میخوام با چهار میکروفن همزمان با نرخ بالایی صدای محیط رو با استفده از برد رسپبری پای ثبت کنم. سرچ کردم توی سایت های داخلی کارت صدای اکسترنال مناسب و مخصوص رسپبری پای پیدا نکردم. گرچه در سایت آمازون موجوده. آیا از هر کارت صدای چهارکاناله ای میشه استفاده کرد یا باید مخصوص رسپبری پای باشه؟ آیا غیر از این راهی را پیشنهاد می کنین؟

  • سلام این دو برای چیه؟؟
    Traceback (most recent call last):
    File “/usr/lib/python3.7/ast.py”, line 35, in parse
    return compile(source, filename, mode, PyCF_ONLY_AST)
    File “/home/pi/Desktop/2.py”, line 28
    data = stream.read(chunk)
    ^
    IndentationError: expected an indented block
    >>>

  • سلام خانم مهندس. وقت شما بخیر. ممنون بابت مطلب مفیدی که قرار دادید. من یک کد پایتون را که در اون از یک کارت صدای USB اکسترنال داده صوتی میخوام قرائت کنم را روی رزبری ۴ اجرا میکنم. منتها در اولین خطی که اجرا میشه خطاهای زیادی میاره. من این خط را اجرا میکنم که در کد شما هم همین خط وجود داره (خط ۱۳)
    ()audio = pyaudio.PyAudio
    به محض اجرای این خط حدود ۳ صفحه خطا ارسال میشه!