
كيفية برمجة تطبيق تسجيل صوت باستخدام Python Tkinter
يعد تسجيل الصوت وظيفة أساسية في العديد من التطبيقات، من تدوين الملاحظات
الصوتية إلى إنشاء البودكاست. إذا كنت مهتمًا بتعلم كيفية برمجة تطبيق
بسيط لتسجيل الصوت باستخدام Python ومكتبة الواجهة الرسومية Tkinter
ومكتبة Sounddevice للتعامل مع أجهزة الصوت، فهذا الدليل الشامل سيأخذك
خطوة بخطوة خلال عملية إنشاء مسجل صوت أساسي. سنتناول كل شيء بدءًا
من تصميم واجهة مستخدم بسيطة بأزرار للتحكم في التسجيل، مرورًا بتمكين التطبيق
من تسجيل الصوت من الميكروفون وحفظه في ملف، وصولًا إلى إضافة وظائف
إيقاف التسجيل وعرض مدة التسجيل وإمكانية اختيار تنسيق التسجيل، وأخيرًا نشر
التطبيق ليتمكن الآخرون من استخدامه. انطلق معنا في هذه الرحلة لتعلم كيفية برمجة
تطبيق لتسجيل الصوت باستخدام Python Tkinter و Sounddevice بطريقة عملية ومنظمة.
* ملاحظة هامة : لتسجيل الصوت وتشغيله، سنستخدم مكتبة sounddevice التي
تعتمد على مكتبات صوتية نظام التشغيل (مثل PortAudio).
تأكد من تثبيت sounddevice وربما مكتبة صوتية مناسبة لنظامك إذا لزم الأمر:
pip install sounddevice soundfile
--
خطوات برمجة تطبيق تسجيل صوت بسيط باستخدام Python Tkinter
خطوات برمجة تطبيق تسجيل صوت باستخدام Python Tkinter و Sounddevice
الخطوة 1: إعداد بيئة التطوير وتثبيت المكتبات
تأكد من تثبيت Python على جهازك. ثم قم بتثبيت مكتبة Tkinter
(عادة ما تأتي مع Python) ومكتبتي sounddevice و soundfile:
pip install sounddevice soundfile
--
أنشئ ملف Python جديدًا باسم audio_recorder.py.
الخطوة 2: استيراد المكتبات وتهيئة التطبيق
في ملف audio_recorder.py، ابدأ باستيراد المكتبات الضرورية وتهيئة نافذة Tkinter:
Python
import tkinter as tkfrom tkinter import filedialog, messageboximport sounddevice as sdimport soundfile as sfimport timeimport threading
class AudioRecorder: def __init__(self, master): self.master = master master.title("مسجل الصوت البسيط")
self.recording = False self.start_time = 0 self.filename = "" self.audio_data = [] self.samplerate = 44100 # معدل أخذ العينات القياسي self.channels = 1 # تسجيل أحادي self.filetype = 'WAV' # تنسيق الملف الافتراضي
self.create_widgets()
--
الخطوة 3: إنشاء واجهة المستخدم (Widgets)
قم بإنشاء العناصر المرئية للتحكم في التسجيل :
Python
def create_widgets(self): self.record_button = tk.Button(self.master, text="تسجيل", command=self.start_recording) self.record_button.pack(pady=10)
self.stop_button = tk.Button(self.master, text="إيقاف", command=self.stop_recording, state=tk.DISABLED) self.stop_button.pack(pady=5)
self.duration_label = tk.Label(self.master, text="المدة: 00:00") self.duration_label.pack(pady=5)
self.filetype_label = tk.Label(self.master, text="التنسيق:") self.filetype_label.pack() self.filetype_var = tk.StringVar(self.master) self.filetype_var.set(self.filetype) # القيمة الافتراضية self.filetype_menu = tk.OptionMenu(self.master, self.filetype_var, 'WAV', 'FLAC', 'OGG') self.filetype_menu.pack()
self.save_button = tk.Button(self.master, text="حفظ", command=self.save_file, state=tk.DISABLED) self.save_button.pack(pady=10)
self.is_recording_label = tk.Label(self.master, text="", fg="red") self.is_recording_label.pack()
def update_duration(self): if self.recording: elapsed_time = int(time.time() - self.start_time) minutes = elapsed_time // 60 seconds = elapsed_time % 60 self.duration_label.config(text=f"المدة: {minutes:02d}:{seconds:02d}") self.master.after(1000, self.update_duration)
--
الخطوة 4: وظيفة بدء التسجيل
تبدأ عملية تسجيل الصوت من الميكروفون :
Python
def start_recording(self): self.recording = True self.start_time = time.time() self.audio_data = [] self.filetype = self.filetype_var.get()
self.record_button.config(state=tk.DISABLED) self.stop_button.config(state=tk.NORMAL) self.save_button.config(state=tk.DISABLED) self.is_recording_label.config(text="جاري التسجيل...")
self.recording_thread = threading.Thread(target=self._record_audio) self.recording_thread.start() self.update_duration()
def _record_audio(self): try: with sd.InputStream(samplerate=self.samplerate, channels=self.channels, callback=self._audio_callback): while self.recording: time.sleep(0.1) except sd.PortAudioError as e: messagebox.showerror("خطأ في الصوت", f"حدث خطأ في جهاز الصوت: {e}") self.stop_recording()
--
الخطوة 5: وظيفة معالجة بيانات الصوت أثناء التسجيل
يتم استدعاء هذه الدالة بشكل دوري لتلقي دفعات من بيانات الصوت :
Python
def _audio_callback(self, indata, frames, time, status):
if status:
print(f"Error in audio stream: {status}")
if self.recording:
self.audio_data.append(indata.copy())
--
الخطوة 6: وظيفة إيقاف التسجيل
توقف عملية تسجيل الصوت :
Python
def stop_recording(self):
self.recording = False
self.record_button.config(state=tk.NORMAL)
self.stop_button.config(state=tk.DISABLED)
self.save_button.config(state=tk.NORMAL)
self.is_recording_label.config(text="")
--
الخطوة 7: وظيفة حفظ الملف الصوتي
تسمح للمستخدم بحفظ التسجيل في ملف :
Python
def save_file(self): self.filename = filedialog.asksaveasfilename( defaultextension=f".{self.filetype.lower()}", filetypes=[(f"{self.filetype} files", f"*.{self.filetype.lower()}"), ("All files", "*.*")] ) if self.filename: try: audio_np_array = np.concatenate(self.audio_data, axis=0) sf.write(self.filename, audio_np_array, self.samplerate, format=self.filetype) messagebox.showinfo("تم الحفظ", f"تم حفظ التسجيل بنجاح في: {self.filename}") self.save_button.config(state=tk.DISABLED) except Exception as e: messagebox.showerror("خطأ في الحفظ", f"حدث خطأ أثناء حفظ الملف: {e}")
--
* ملاحظة : ستحتاج إلى استيراد مكتبة numpy للتعامل مع مصفوفات الصوت:
import numpy as np
--
الخطوة 8: إنشاء النافذة الرئيسية وتشغيل التطبيق
أضف الكود لإنشاء نافذة Tkinter وتشغيل تطبيق مسجل الصوت :
Python
if __name__ == "__main__":
root = tk.Tk()
recorder = AudioRecorder(root)
root.mainloop()
--
الخطوة 9: نشر التطبيق
لنشر تطبيق Tkinter يعتمد على مكتبات خارجية مثل
sounddevice و soundfile و numpy، يمكنك اتباع عدة طرق :
* توزيع الكود المصدري مع تعليمات التثبيت : يمكن للمستخدمين الذين
لديهم Python و Tkinter و sounddevice و soundfile و numpy مثبتين
تشغيل ملف audio_recorder.py مباشرة. قم بتضمين تعليمات مفصلة لتثبيت هذه المكتبات.
* إنشاء ملف تنفيذي باستخدام PyInstaller : يمكن لـ PyInstaller تجميع
برنامج Python وجميع تبعياته في ملف تنفيذي واحد قابل للتوزيع لأنظمة
تشغيل مختلفة (Windows، macOS، Linux). قد تحتاج إلى بعض
التكوين الإضافي لتضمين المكتبات الخارجية بشكل صحيح.
* التثبيت :
pip install pyinstaller
--
إنشاء الملف التنفيذي: انتقل إلى المجلد الذي يحتوي على ملف
audio_recorder.py وقم بتشغيل :
pyinstaller --onefile audio_recorder.py --hidden-import sounddevice --hidden-import soundfile --hidden-import numpy
--
سيتم إنشاء الملف التنفيذي في مجلد dist. قد تحتاج إلى تجربة خيارات
إضافية لضمان تضمين جميع المكتبات والملفات التابعة بشكل صحيح.
* استخدام cx_Freeze :
بديل آخر لـ PyInstaller لإنشاء ملفات تنفيذية.
قد يتطلب أيضًا بعض التكوين لتضمين المكتبات الخارجية.
* التثبيت :
pip install cx_Freeze
--
إنشاء ملف الإعداد (setup.py): قم بإنشاء ملف setup.py
يتضمن المكتبات المطلوبة في قائمة packages :
Python
import cx_Freeze
import sys
base = None
if sys.platform == "win32":
base = "Win32GUI"
cx_Freeze.setup(
name="SimpleAudioRecorder",
version="0.1",
description="تطبيق تسجيل صوت بسيط باستخدام Python Tkinter و Sounddevice",
executables=[cx_Freeze.Executable("audio_recorder.py", base=base)],
packages=["tkinter", "sounddevice", "soundfile", "numpy"]
)
--
* بناء الملف التنفيذي :
python setup.py build
--
سيتم إنشاء الملفات القابلة للتوزيع في مجلد build.
* الخلاصة :
لقد تعلمت الآن كيفية برمجة تطبيق بسيط لتسجيل الصوت باستخدام Python Tkinter
ومكتبتي sounddevice و soundfile. قمنا بإنشاء واجهة مستخدم أساسية،
ودمجنا وظائف بدء وإيقاف التسجيل، وعرض مدة التسجيل، و حفظ الملف الصوتي،
وإمكانية اختيار تنسيق التسجيل. كما تناولنا كيفية نشر التطبيق.
يمكنك الآن تطوير هذا التطبيق بإضافة المزيد من الميزات مثل عرض مستوى الصوت،
وتشغيل التسجيلات المحفوظة، وتعديل معدل أخذ العينات والقنوات، وتحسين
واجهة المستخدم. تذكر أن نشر التطبيقات التي تعتمد على مكتبات صوتية قد
يتطلب بعض الجهد الإضافي لضمان تضمين جميع المكتبات والملفات التابعة بشكل صحيح.
استمر في التجربة والتطوير!