ساخت اسکریپت برای تبدیل فایل‌های صوتی با پایتون

ساخت اسکریپت برای تبدیل فایل‌های صوتی با پایتون

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

پیش‌نیازها

قبل از شروع، اطمینان حاصل کنید که موارد زیر را دارید:

  • پایتون نصب شده باشد (نسخه 3.6 یا بالاتر توصیه می‌شود).
  • کتابخانه pydub نصب شده باشد. برای نصب آن از دستور pip install pydub در خط فرمان استفاده کنید.
  • ffmpeg یا libav نصب شده باشد. این برنامه‌ها برای پردازش فایل‌های صوتی توسط pydub ضروری هستند. نحوه نصب آن‌ها بسته به سیستم عامل شما متفاوت است.

مقدمه‌ای بر کتابخانه Pydub

pydub یک کتابخانه پایتون است که امکان دستکاری فایل‌های صوتی را به سادگی فراهم می‌کند. این کتابخانه به شما اجازه می‌دهد تا فایل‌های صوتی را بارگیری کنید، آن‌ها را ویرایش کنید (مانند برش، ترکیب، تغییر حجم صدا)، و آن‌ها را به فرمت‌های مختلف تبدیل کنید. pydub به طور مستقیم فایل‌های صوتی را پردازش نمی‌کند، بلکه از برنامه‌های خارجی مانند ffmpeg یا libav برای این کار استفاده می‌کند.

ساخت اسکریپت پایه تبدیل فایل صوتی

در این بخش، یک اسکریپت پایه برای تبدیل یک فایل صوتی از فرمت MP3 به فرمت WAV ایجاد می‌کنیم.

from pydub import AudioSegment

def convert_audio(input_file, output_file):
    """
    فایل صوتی را از یک فرمت به فرمت دیگر تبدیل می‌کند.
    """
    try:
        audio = AudioSegment.from_mp3(input_file)
        audio.export(output_file, format="wav")
        print(f"فایل {input_file} با موفقیت به {output_file} تبدیل شد.")
    except Exception as e:
        print(f"خطا در تبدیل فایل: {e}")

if __name__ == "__main__":
    input_file = "input.mp3"  # نام فایل ورودی
    output_file = "output.wav"  # نام فایل خروجی
    convert_audio(input_file, output_file)

در این کد:

  • AudioSegment.from_mp3(input_file) فایل MP3 را بارگیری می‌کند.
  • audio.export(output_file, format="wav") فایل صوتی را به فرمت WAV تبدیل کرده و در فایل خروجی ذخیره می‌کند.
  • بخش try...except برای مدیریت خطاها استفاده شده است.
  • بخش if __name__ == "__main__": تضمین می‌کند که کد فقط زمانی اجرا شود که اسکریپت به طور مستقیم اجرا شود، نه زمانی که به عنوان یک ماژول وارد شود.

تعمیم اسکریپت برای پشتیبانی از فرمت‌های مختلف

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

from pydub import AudioSegment

def convert_audio(input_file, output_file, output_format):
    """
    فایل صوتی را از یک فرمت به فرمت دیگر تبدیل می‌کند.
    """
    try:
        if input_file.endswith(".mp3"):
            audio = AudioSegment.from_mp3(input_file)
        elif input_file.endswith(".wav"):
            audio = AudioSegment.from_wav(input_file)
        elif input_file.endswith(".ogg"):
            audio = AudioSegment.from_ogg(input_file)
        else:
            print("فرمت فایل ورودی پشتیبانی نمی‌شود.")
            return

        audio.export(output_file, format=output_format)
        print(f"فایل {input_file} با موفقیت به {output_file} تبدیل شد.")
    except Exception as e:
        print(f"خطا در تبدیل فایل: {e}")

if __name__ == "__main__":
    input_file = "input.mp3"  # نام فایل ورودی
    output_file = "output.wav"  # نام فایل خروجی
    output_format = "wav"  # فرمت فایل خروجی
    convert_audio(input_file, output_file, output_format)

در این نسخه:

  • از input_file.endswith(".mp3") و سایر توابع مشابه برای تشخیص فرمت فایل ورودی استفاده می‌کنیم.
  • بر اساس فرمت فایل ورودی، از تابع مناسب برای بارگیری فایل استفاده می‌کنیم (from_mp3، from_wav، from_ogg).
  • فرمت فایل خروجی را به عنوان یک آرگومان به تابع convert_audio ارسال می‌کنیم.

اضافه کردن قابلیت پردازش دسته‌ای (Batch Processing)

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

from pydub import AudioSegment
import os

def convert_audio(input_file, output_file, output_format):
    """
    فایل صوتی را از یک فرمت به فرمت دیگر تبدیل می‌کند.
    """
    try:
        if input_file.endswith(".mp3"):
            audio = AudioSegment.from_mp3(input_file)
        elif input_file.endswith(".wav"):
            audio = AudioSegment.from_wav(input_file)
        elif input_file.endswith(".ogg"):
            audio = AudioSegment.from_ogg(input_file)
        else:
            print("فرمت فایل ورودی پشتیبانی نمی‌شود.")
            return

        audio.export(output_file, format=output_format)
        print(f"فایل {input_file} با موفقیت به {output_file} تبدیل شد.")
    except Exception as e:
        print(f"خطا در تبدیل فایل: {e}")

def batch_convert_audio(input_directory, output_directory, output_format):
    """
    تمام فایل‌های صوتی در یک دایرکتوری را به فرمت مشخص تبدیل می‌کند.
    """
    for filename in os.listdir(input_directory):
        if filename.endswith((".mp3", ".wav", ".ogg")):
            input_file = os.path.join(input_directory, filename)
            output_file = os.path.join(output_directory, filename.replace(os.path.splitext(filename)[1], "." + output_format))
            convert_audio(input_file, output_file, output_format)

if __name__ == "__main__":
    input_directory = "input_files"  # دایرکتوری فایل‌های ورودی
    output_directory = "output_files"  # دایرکتوری فایل‌های خروجی
    output_format = "wav"  # فرمت فایل خروجی

    # ایجاد دایرکتوری خروجی اگر وجود نداشته باشد
    if not os.path.exists(output_directory):
        os.makedirs(output_directory)

    batch_convert_audio(input_directory, output_directory, output_format)

در این نسخه:

  • تابع batch_convert_audio تمام فایل‌های صوتی در یک دایرکتوری را پردازش می‌کند.
  • از os.listdir برای لیست کردن فایل‌های موجود در دایرکتوری ورودی استفاده می‌کنیم.
  • از os.path.join برای ساخت مسیر کامل فایل ورودی و خروجی استفاده می‌کنیم.
  • از filename.replace برای تغییر پسوند فایل خروجی استفاده می‌کنیم.
  • از os.makedirs برای ایجاد دایرکتوری خروجی در صورت عدم وجود استفاده می‌کنیم.

بهبود مدیریت خطاها

مدیریت خطاها در اسکریپت‌های اتوماسیون بسیار مهم است. می‌توانیم مدیریت خطاها را با ثبت خطاها در یک فایل لاگ بهبود دهیم.

import logging
from pydub import AudioSegment
import os

# تنظیمات لاگ
logging.basicConfig(filename='conversion.log', level=logging.ERROR, format='%(asctime)s - %(levelname)s - %(message)s')

def convert_audio(input_file, output_file, output_format):
    """
    فایل صوتی را از یک فرمت به فرمت دیگر تبدیل می‌کند.
    """
    try:
        if input_file.endswith(".mp3"):
            audio = AudioSegment.from_mp3(input_file)
        elif input_file.endswith(".wav"):
            audio = AudioSegment.from_wav(input_file)
        elif input_file.endswith(".ogg"):
            audio = AudioSegment.from_ogg(input_file)
        else:
            logging.error(f"فرمت فایل ورودی پشتیبانی نمی‌شود: {input_file}")
            print("فرمت فایل ورودی پشتیبانی نمی‌شود.")
            return

        audio.export(output_file, format=output_format)
        print(f"فایل {input_file} با موفقیت به {output_file} تبدیل شد.")
    except Exception as e:
        logging.error(f"خطا در تبدیل فایل {input_file}: {e}")
        print(f"خطا در تبدیل فایل: {e}")

def batch_convert_audio(input_directory, output_directory, output_format):
    """
    تمام فایل‌های صوتی در یک دایرکتوری را به فرمت مشخص تبدیل می‌کند.
    """
    for filename in os.listdir(input_directory):
        if filename.endswith((".mp3", ".wav", ".ogg")):
            input_file = os.path.join(input_directory, filename)
            output_file = os.path.join(output_directory, filename.replace(os.path.splitext(filename)[1], "." + output_format))
            convert_audio(input_file, output_file, output_format)

if __name__ == "__main__":
    input_directory = "input_files"  # دایرکتوری فایل‌های ورودی
    output_directory = "output_files"  # دایرکتوری فایل‌های خروجی
    output_format = "wav"  # فرمت فایل خروجی

    # ایجاد دایرکتوری خروجی اگر وجود نداشته باشد
    if not os.path.exists(output_directory):
        os.makedirs(output_directory)

    batch_convert_audio(input_directory, output_directory, output_format)

در این نسخه:

  • از ماژول logging برای ثبت خطاها استفاده می‌کنیم.
  • خطاها در فایل conversion.log ثبت می‌شوند.
  • سطح لاگ را روی logging.ERROR تنظیم کرده‌ایم تا فقط خطاها ثبت شوند.

نتیجه‌گیری

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

بدون دیدگاه

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *