کار با صدا در پایتون

November 2021

کار با صدا در پایتون

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

 

 

 #  پخش صدا در پایتون

در بخش بعد، چند کتابخانه محبوب پایتون را خواهید دید که برای پخش صدا استفاده میشوند. برخی از این کتابخانه‌ها به شما اجازه میدهند طیف گسترده‌ای از فرمت‌ها مانن mp3 یا wav را پخش کنید.

 

 

بیایید نگاهی به تک تک این کتابخانه ها برای پخش صوت بیاندازیم.

 

دوره پیشنهادی: دوره آموزش پایتون (python)

 

 +  playsound

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

from playsound import playsound

playsound('myfile.wav')

 

طبق مستندات، این پکیج برای فایل‌های mp3 و wav تست شده‌ است اما ممکن است برای دیگر فرمت‌ها نیز کار کند. آخرین آپدیت این پکیج مربوط به سال 2017 است و مشخص نیست که آیا با نسخه‌های جدیدتر پایتون کار خواهد کرد یا نه.

 

 

 +  simpleaudio

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

import simpleaudio as sa

filename = 'myfile.wav'
wave_obj = sa.WaveObject.from_wave_file(filename)
play_obj = wave_obj.play()
play_obj.wait_done()  # Wait until sound has finished playing

 

 

 +  winsound

اگر در ویندوز هستید میتوانید از winsound که در کتابخانه استاندارد پایتون است، استفاده کنید. اجرای فایل‌های wav فقط با چند خط کد امکان پذیر است:

import winsound

filename = 'myfile.wav'
winsound.PlaySound(filename, winsound.SND_FILENAME)

 

winsound از پخش هیچ فایلی غیر از فایل های WAV پشتیبانی نمی کند. همچنین با winsound میتوانید بلندگوی خود را Beep کنید. به عنوان مثال، با کد زیر می توانید یک صدای 1000 هرتز را به مدت 100 میلی ثانیه Beep کنید:

import winsound

winsound.Beep(1000, 100)  # Beep at 1000 Hz for 100 ms

 

مقاله پیشنهادی: آموزش دستور import در پایتون

 

 +  python-sounddevice

همانطور که در مستندات python-sounddevice گفته شده، اتصالی را برای کتابخانه PortAudio ایجاد کرده و چند فانکشن برای پخش و ضبط آرایه های NumPy حاوی سیگنال های صوتی فراهم می کند. برای استفاده از python-sounddevice باید Numpy و soundfile را نصب کنید:

import sounddevice as sd
import soundfile as sf

filename = 'myfile.wav'
# Extract data and sampling rate from file
data, fs = sf.read(filename, dtype='float32')  
sd.play(data, fs)
status = sd.wait()  # Wait until file is done playing

 

 

 +  pydub

از pydub میتوانید برای باز کردن و ذخیره فایل‌های wav استفاده کنید. اما اگر بخواهید یک فایل صوتی را پخش کنید، نیاز است که در کنار آن، پکیج simpleaudio را نیز نصب کنید. از کد زیر میتوانید برای پخش یک فایل صوتی wav استفاده کنید:

from pydub import AudioSegment
from pydub.playback import play

sound = AudioSegment.from_wav('myfile.wav')
play(sound)

 

اگر بخواهید فرمت‌های دیگر مانند mp3 را پخش کنید، باید ffmpeg یا libav را نصب کنید. برای کمک میتوانید به مستندات pydub مراجعه کنید. به جای انجام مراحلی که در مستندات گفته شده، میتوانید پکیج ffmpeg-python را نصب کنید که با دستور زیر نصب میشود:

$ pip install ffmpeg-python

 

با کمک ffmpeg میتوانید فایل‌ها mp3 را اجرا کنید:

from pydub import AudioSegment
from pydub.playback import play

sound = AudioSegment.from_mp3('myfile.mp3')
play(sound)

 

 

 +  pyaudio

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

import pyaudio
import wave

filename = 'myfile.wav'

# Set chunk size of 1024 samples per data frame
chunk = 1024  

# Open the sound file 
wf = wave.open(filename, 'rb')

# Create an interface to PortAudio
p = pyaudio.PyAudio()

# Open a .Stream object to write the WAV file to
# 'output = True' indicates that the sound will be played rather than recorded
stream = p.open(format = p.get_format_from_width(wf.getsampwidth()),
                channels = wf.getnchannels(),
                rate = wf.getframerate(),
                output = True)

# Read data in chunks
data = wf.readframes(chunk)

# Play the sound by writing the audio data to the stream
while data != '':
    stream.write(data)
    data = wf.readframes(chunk)

# Close and terminate the stream
stream.close()
p.terminate()

 

همانطور که دیدید استفاده از پکیج pyaudio نسبت به بقیه پکیج ها پیچیده‌تر است،‌ پس اگر فقط میخواهید یک فایل ساده را پخش کنید از این پکیج استفاده نکنید. این پکیج امکانات سطح پایین بسیاری را در اختیار شما قرار میدهد مثلا میتوانید میزان کار cpu را ببینید.

 

مقاله پیشنهادی: پایتون سریعتر با PyPy

 

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

با کتابخانه‌‌های pyaudio و python-sounddevice میتوانید اقدام به ضبط صدا کنید. python-sounddevice اطلاعات را در آرایه‌های numpy و pyaudio اطلاعات را در byte ذخیره میکند.

 

 

 +  python-sounddevice

python-sounddevice به شما اجازه میدهد تا صدا را از میکروفون خود ضبط کنید و اطلاعات را در یک آرایه numpy ذخیره کنید. با استفاده از این نوع داده میتوانید اطلاعات را پردازش کرده و با scipy.io.wavfile به فرمت wav ذخیره کنید. قبل از شروع کار مطمئن شوید که scipy را با دستور pip install scipy نصب کرده باشید:

import sounddevice as sd
from scipy.io.wavfile import write

fs = 44100  # Sample rate
seconds = 3  # Duration of recording

myrecording = sd.rec(int(seconds * fs), samplerate=fs, channels=2)
sd.wait()  # Wait until recording is finished
write('output.wav', fs, myrecording)  # Save as WAV file 

 

 

 +  pyaudio

در بخش قبل دیدید که چطور با خواندن از pyaudio.stream توانستیم یک فایل صوتی را پخش کنیم. حالا برای ضبط صدا باید در pyaudio.stream بنویسیم:

import pyaudio
import wave

chunk = 1024  # Record in chunks of 1024 samples
sample_format = pyaudio.paInt16  # 16 bits per sample
channels = 2
fs = 44100  # Record at 44100 samples per second
seconds = 3
filename = "output.wav"

p = pyaudio.PyAudio()  # Create an interface to PortAudio

print('Recording')

stream = p.open(format=sample_format,
                channels=channels,
                rate=fs,
                frames_per_buffer=chunk,
                input=True)

frames = []  # Initialize array to store frames

# Store data in chunks for 3 seconds
for i in range(0, int(fs / chunk * seconds)):
    data = stream.read(chunk)
    frames.append(data)

# Stop and close the stream 
stream.stop_stream()
stream.close()
# Terminate the PortAudio interface
p.terminate()

print('Finished recording')

# Save the recorded data as a WAV file
wf = wave.open(filename, 'wb')
wf.setnchannels(channels)
wf.setsampwidth(p.get_sample_size(sample_format))
wf.setframerate(fs)
wf.writeframes(b''.join(frames))
wf.close()

 

مقاله پیشنهادی: درک فانکشن main در پایتون

 

 #  ذخیره و تبدیل صدا در پایتون

در بخش‌های قبل دیدید که از ماژول scipy.io.wavfile برای ذخیره اطلاعات در یک آرایه numpy استفاده کردیم. ماژول wavio به شما اجازه میدهد، داده‌ها را بین WAV و آرایه numpy تبدیل کنید. اگر میخواهید اطلاعات را در طیف گسترده‌ای از فرمت‌ها ذخیره کنید،‌ میتوانید از pydub و soundfile استفاده کنید که به شما اجازه کار با فرمت‌هایی مانند mp3, flac, wma, flv را میدهند.

 

 

 +  wavio

این ماژول براساس numpy کار کرده و به شما اجازه خواندن و نوشتن فایل‌های wav از آرایه‌های numpy را میدهد. برای ذخیره آرایه numpy به فرمت wav میتوانید از کد زیر استفاده کنید:

import wavio

wavio.write("myfile.wav", my_np_array, fs, sampwidth=2)

 

 

 +  soundfile

کتابخانه soundfile میتواند با تمام فرمت‌هایی که libsndfile پشتیانی میکند، کار کند. همچنین با این پکیج نمیتوانید اقدام به پخش صدا کنید. فقط میتوانید برای تبدیل فرمت‌های FLAC, AIFF و چند فرمت کمتر شناخته شده استفاده کنید. مثلا برای تبدیل WAV به FLAC میتوانید از کد زیر استفاده کنید:

import soundfile as sf

# Extract audio data and sampling rate from file 
data, fs = sf.read('myfile.wav') 
# Save as FLAC file at correct sampling rate
sf.write('myfile.flac', data, fs)  

 

مقاله پیشنهادی: ماژول‌ها و پکیج‌های پایتون

 

 +  pydub

از pydub برای ذخیره تمام فرمت‌هایی که ffmpeg پشتیبانی میکند میتوانید استفاده کنید. مثلا در برای تبدیل WAV به MP3 میتوانید از کدی مانند زیر استفاده کنید:

from pydub import AudioSegment
sound = AudioSegment.from_wav('myfile.wav')

sound.export('myfile.mp3', format='mp3')

 

 

 #  نتیجه گیری

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

مقالات مرتبط

ریز نکات پایتونی که همه باید بدانید

آموزش اتصال به mongodb با پایتون

نوع داده None در پایتون

آموزش self در پایتون