تحليل البيانات الصوتية باستخدام بايثون: تقنيات استخراج الميزات من ملفات الصوت

الثلاثاء 06 محرم 1447ھ الثلاثاء 6 محرم 1447هـ 1-7-2025م
فيسبوك
إكس
واتساب
تيليجرام
لينكدإن

1٬687 كلمة

24 دقيقة

المحتوى

معالجة البيانات الصوتية هي فرع من فروع علوم الحاسوب والهندسة الذي يهتم بتحليل، تعديل، وفهم الإشارات الصوتية الرقمية. وكما تبدأ عملية معالجة الصوت بتحويل الإشارة الصوتية من شكلها التناظري إلى شكل رقمي يمكن للحاسوب التعامل معه، ثم يتم تطبيق تقنيات متنوعة لاستخراج المعلومات. ومع تزايد الاعتماد على التطبيقات المعتمدة على معالجة الصوت مثل التعرّف على الكلام، وتحليل الموسيقى، وتحديد المتحدث، أصبح من الضروري فهم الإشارات الصوتية وتحليلها بطريقة فعالة. وفي هذا الدرس سوف نوضح المفاهيم الأساسية حول معالجة البيانات الصوتية، وكيفية استخدامها مع خوارزميات تعلم الآلة.

audio data analysis python feature extraction a

يوضح لنا النموذج الخطوات الأساسية المتبعة لحل المشكلات التي تعتمد على البيانات الصوتية وخوارزميات تعلم الآلة. وفي هذا الدرس، نستخدم قاعدة البيانات الصوتية UrbanSound8K، والتي تحتوي على مجموعة من الملفات الصوتية المصنفة إلى عدة فئات (مثل: أصوات السيارات، الموسيقى، الإنذارات، إلخ).

تقنيات ما قبل المعالجة (Preprocessing)

تعد ما قبل المعالجة خطوة حاسمة في تحليل الصوت باستخدام الذكاء الاصطناعي، حيث تحول البيانات الصوتية الخام وغير المنظمة إلى تنسيقات نظيفة وقابلة للاستخدام، ومنها

تحويل التنسيق: وهي توحيد صيغ ملفات الصوت إلى صيغة موحدة مثل ‎(wav)‎، بالإضافة إلى ضبط جميع الملفات الصوتية لتكون ذات معدل عينات ثابت ‎(Sampling Rate)‎، وكما تعتبر خطوة أساسية لتجعل كل ملفات الصوت متشابهة من حيث الخصائص الفنية، مما يساعد على تحليلها بشكل دقيق باستخدام خوارزميات تعلم الآلة.

تنظيف الصوت: وهي خطوة لإزالة الضوضاء غير المرغوب فيها من الصوت الخام لضمان جودة الصوت وتحسينه قبل إجراء أي تحليل. وفي هذه المرحلة نستخدم مكتبة ‎(noisereduce)‎، وهي خوارزمية لتقليل الضوضاء مكتوبة بلغة بايثون، تُستخدم بشكل خاص لتقليل الضوضاء في الإشارات الزمنية. وتعتمد هذه الخوارزمية على تقنية تُعرف بــــ التحكم الطيفي ‎(Spectral Gating)‎، وهي شكل من أشكال بوابة الضوضاء ‎(Noise Gate)‎، حيث تعمل على تحليل الطيف الترددي للإشارة لتقدير عتبة ضوضاء لكل نطاق ترددي، ومن ثم تقليل المكونات التي تقع تحت هذه العتبة، مما يؤدي إلى تحسين جودة الإشارة الصوتية. وهنا مثال يوضح قبل وبعد إزالة الضوضاء من الصوت.

تثبيت المكتبة - Install the Library

				
					!pip install noisereduce
!pip install pydub
!pip install soundfile

				
			
				
					import librosa
import librosa.display
import matplotlib.pyplot as plt
import soundfile as sf
import numpy as np
import noisereduce as nr
from pydub import AudioSegment
import os
				
			

تحميل الملف الصوتي - Load Audio in Python

				
					# Load audio from (UrbanSound8k) dataset
audio_path = "/content/99812-1-2-0.wav"
				
			
				
					y,sr = librosa.load(audio_path)
				
			

التمثيل البصري للصوت - Visualize Audio

				
					plt.figure(figsize=(10, 4))
librosa.display.waveshow(y, sr=sr)
plt.title('Noisy Audio')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.tight_layout()
plt.show()
				
			
audio data analysis python feature extraction b

تنقيح الصوت - Clean Audio

				
					cleaned_audio = nr.reduce_noise(y=y, sr=sr)
plt.figure(figsize=(10, 4 ))
librosa.display.waveshow(cleaned_audio, sr=sr)
plt.title("Denoised Audio ")
plt.xlabel("Time (s)")
plt.ylabel("Amplitude")
plt.tight_layout()
plt.show()
				
			
audio data analysis python feature extraction c

إعادة العينة ‎(Resampling)‎: هي عملية تغيير معدل العينة لإشارة صوتية بهدف تحقيق التناسق بين مجموعات بيانات مختلفة. وكما تُعد هذه العملية مهمة بشكل خاص عند العمل مع ملفات صوتية مأخوذة من مصادر متعددة قد تحتوي على معدلات عينات مختلفة. وعلى سبيل المثال، إذا كانت بعض المقاطع الصوتية بمعدل ‎44.1‎ كيلوهرتز وأخرى بمعدل ‎22.05‎ كيلوهرتز، فإن إعادة تعيينها إلى معدل موحّد، مثل ‎22.05‎ كيلوهرتز، يضمن التجانس في جميع أجزاء مجموعة البيانات. وهي باختصار توحيد معدل العينة لجميع المدخلات الصوتية. وفي مكتبة ‎(librosa)‎، يمكن تنفيذ ذلك باستخدام الدالة ‎(librosa.resample)‎.

				
					y, original_sr = librosa.load('/content/99812-1-2-0.wav', sr=None)
target_sr = 22050
y_resampled = librosa.resample(y, orig_sr=original_sr, target_sr=target_sr)

print(f"Original sample rate: {original_sr}")
print(f"Resampled to: {target_sr}")
				
			
Original sample rate: 44100
Resampled to: 22050

التطبيع ‎(Normalization)‎: هو تقنية تُستخدم لضبط سعة الإشارة الصوتية ‎(Amplitude)‎ لتكون ضمن نطاق قياسي، عادةً بين ‎1‎ و ‎-1‎، ويهدف ذلك للتأكد من أن الصوت ليس عاليًا جدًا مما قد يؤدي إلى التشويه ولا منخفضًا جدًا. يُساهم تطبيع الصوت في توحيد مستوى الصوت بين جميع المقاطع، وهو أمر مفيد بشكل خاص عند إعداد البيانات الصوتية لنماذج تعلم الآلة. في مكتبة ‎(librosa)‎، يمكنك استخدام الدالة ‎(librosa.util.normalize)‎ لتطبيع الإشارة الصوتية.

				
					
y_normalized = librosa.util.normalize(y)

plt.figure(figsize=(10, 4))

plt.subplot(2, 1, 1)
librosa.display.waveshow(y, sr=sr)
plt.title('(Original Audio)')
plt.xlabel("Time")
plt.ylabel("Amplitude")


plt.subplot(2, 1, 2)
librosa.display.waveshow(y_normalized, sr=sr)
plt.title("Normalized Audio")
plt.xlabel("Time")
plt.ylabel("Amplitude")

plt.tight_layout()
plt.show()

				
			
audio data analysis python feature extraction d

التقسيم ‎(Segmentation)‎: وتعني تقسيم ملف صوتي إلى أجزاء أصغر. وتُعد هذه العملية مفيدة عند التعامل مع ملفات صوتية طويلة تحتاج إلى تحليلها على شكل مقاطع صغيرة. من خلال استخدام التقسيم، يمكننا التركيز على أجزاء محددة من الملف الصوتي دون الحاجة إلى معالجة الملف بالكامل دفعة واحدة، مما يجعل التحليل أكثر كفاءة. توفر مكتبة ‎(pydub)‎ طريقة لتقسيم الصوت بسهولة، خاصةً عندما تحتاج إلى تقسيم الملف الصوتي حسب المدة الزمنية مثل ‎(ثانيتان)‎، أو عند فترات الصمت تلقائيًا. وهنا الكود يوضح تقسيم الصوت لمدة ‎(2000 ms)‎ وحفظها.

				
					audio = AudioSegment.from_file(audio_path)

chunk_length_ms = 2000
os.makedirs("chunks", exist_ok=True)

for i, start in enumerate(range(0, len(audio), chunk_length_ms)):
    chunk = audio[start:start + chunk_length_ms]
    chunk.export(f"chunks/chunk_{i+1}.wav", format="wav")
				
			

وربما تكون قد رأيت أصواتًا مصوّرة على شكل موجي، حيث يتم رسم قيم العينات بمرور الوقت، مما يوضح تغيرات سعة الصوت. يُعرف هذا بالتمثيل باسم تمثيل الصوت في (المجال الزمني). وكما هذا النوع من التصور مفيد لتحديد السمات المحددة للإشارة الصوتية مثل توقيت الأحداث الصوتية الفردية، والصوت العام للإشارة، وأي مخالفات أو ضوضاء موجودة في الصوت. وفي حين تمثيل الصوت في المجال الترددي، فيُظهر توزيع مكونات التردد المختلفة التي يتكون منها الصوت، ويساعدنا على فهم النغمات والطبقات الصوتية داخل الإشارة. ويمكننا الانتقال بين المجال الزمني والمجال الترددي باستخدام أدوات رياضية مثل تحويل فورييه (Fourier Transform).

audio data analysis python feature extraction e

استخراج الميزات (Feature Extraction)

وهي تحويل البيانات الصوتية الخام إلى تمثيل عددي يمكن لخوارزميات تعلم الآلة التعامل معه، كما تُعد مكتبة (Librosa) أداة قوية ومفتوحة المصدر لتحليل الإشارات الصوتية. فهي لا تقتصر (Librosa) على استخراج الخصائص الرقمية (Features) من الصوت، كما تدعم التمثيل البصري للصوت من خلال رسم الشكل الموجي (Waveform) والمخططات الطيفية (Spectrograms)، باستخدام مكتبة مثل (Matplotlib)، وتكمن أهمية هذه التمثيلات في إمكانية تحويلها إلى صور تُستخدم في نماذج التعلم العميق لاستخراج الميزات تلقائيًا مما يُساهم في تسهيل فهم الإشارات الصوتية واكتشاف الأنماط والتغيرات داخلها في تمييز الأصوات والكلام. ثم تُستخدم هذه الميزات كمدخلات في نماذج تعلم الآلة لتدريب النموذج على تصنيف الأصوات تلقائيًا بدقة، مما يبرز أهمية الجمع بين معالجة الإشارات الرقمية والذكاء الاصطناعي في التطبيقات العملية.

تحميل الملف الصوتي - Load Audio

				
					import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np
				
			
				
					# Load (street_music) audio from (UrbanSound8k) dataset
audio_path = "/content/99710-9-0-16.wav"
				
			
				
					y,sr = librosa.load(audio_path)
				
			

y هو مصفوفة تحتوي على العينات الصوتية (البيانات الرقمية للصوت).

sr (معدل أخذ العينات Sampling Rate) (عدد العينات في الثانية).

الخصائص الرقمية (Features)

طاقة RMS (Root Mean Square Energy): هي مقياس رياضي يُستخدم لقياس قوة الإشارة الصوتية خلال فترة زمنية قصيرة. وهي تُحسب بأخذ الجذر التربيعي لمتوسط مربعات قيم الإشارة في إطار زمني معين. وكما يُشير إلى مقياس شدة الصوت أو طاقته في كل لحظة.

تحميل الملف الصوتي - Load Audio

				
					# Load (street_music) audio from (UrbanSound8k) dataset
audio_path = "/content/99710-9-0-16.wav"
				
			
				
					y,sr = librosa.load(audio_path)
				
			

طاقة الجذر التربيعي المتوسط - RMS Energy

				
					rms = librosa.feature.rms(y=y)

print("rms shape:", rms.shape)
print("rms :", rms[0][:5])
				
			
rms shape: (1, 173)
rms : [0.00325198 0.00376626 0.00413692 0.00384234 0.00368382]

معدل عبور الصفر (Zero-Crossing Rate): هو عدد المرات التي تتغير فيها الإشارة الصوتية من قيمة موجبة إلى سالبة أو العكس خلال إطار زمني محدد.

				
					zcr = librosa.feature.zero_crossing_rate(y)

print("ZCR shape:", zcr.shape)
print("ZCR :", zcr[0][:5])
				
			
ZCR shape: (1, 173)
ZCR : [0.06689453 0.09521484 0.12451172 0.13427734 0.13330078]

مركز الطيف (Spectral Centroid): هو مقياس يُستخدم في تحليل الصوت، ويُشير إلى "مركز كتلة" الطيف الترددي للإشارة الصوتية، وكما يُعبر عن مدى سطوع (Brightness) الصوت.

				
					centroid = librosa.feature.spectral_centroid(y=y, sr=sr)

print("Spectral Centroid shape:", centroid.shape)
print("Spectral Centroid :", centroid[0][:5])
				
			
Spectral Centroid shape: (1, 173)
Spectral Centroid : [1821.42377804 1894.83859665 1923.95718457 1886.46341011 2041.88977435]

التمثيل البصري للصوت

الموجة الصوتية (Waveform): هي التمثيل التقليدي للإشارة الصوتية، حيث تُظهر التغير في السعة (Amplitude) عبر الوقت. يُستخدم هذا الشكل لتوضيح بداية ونهاية الصوت بدقة، ويساعد في تحديد الفترات التي يكون فيها الصوت عاليًا أو منخفضًا. كما يمكن من خلاله تحليل فترات الصمت أو الضوضاء داخل التسجيل.

				
					plt.figure(figsize=(10, 4))
librosa.display.waveshow(y, sr=sr)
plt.title('Waveform')
plt.xlabel("Time (s)")
plt.ylabel("Amplitude")
plt.tight_layout()
plt.show()
				
			
audio data analysis python feature extraction f

الطيف الترددي (Spectrogram): هو تمثيل ثنائي الأبعاد يوضح كيف تتغير الترددات بمرور الوقت. في هذا التمثيل، كل نقطة تمثل ترددًا معينًا في لحظة زمنية محددة، وتُعرض شدة الإشارة أو طاقتها على شكل لون أو تدرج لوني. يُستخدم هذا النوع من التصور لفهم توزيع الطاقة عبر الترددات، وللكشف عن الأنماط الموسيقية أو الفونيمات في الكلام، مما يجعله أداة قوية في تحليل الصوت. ويُعد الطيف الترددي أحد أهم التمثيلات البصرية المستخدمة في تعلم الآلة، خاصة في مجالات مثل التعرف على الكلام وتصنيف الأصوات، لأنه يكشف عن تفاصيل لا يمكن رؤيتها من خلال الشكل الموجي.

				
					# Convert to Short-time Fourier Transform (STFT)
D = librosa.stft(y)
S_db = librosa.amplitude_to_db(np.abs(D), ref=np.max)

plt.figure(figsize=(10, 4))
librosa.display.specshow(S_db, sr=sr, x_axis='time', y_axis='linear')
plt.colorbar(format='%+2.0f dB')
plt.title('Spectrogram (Linear)')
plt.tight_layout()
plt.show()
				
			
audio data analysis python feature extraction g

الطيف الترددي بمقياس ميل (Mel Spectrogram): هو شكل من أشكال الطيف الترددي التقليدي، ولكنه يُحوّل الترددات إلى مقياس ميل (Mel Scale)، وهو مقياس غير خطي يحاكي طريقة استجابة الأذن البشرية للترددات. على عكس الطيف الترددي العادي الذي يعرض جميع الترددات بالتساوي، فإن مقياس ميل يُعرض الترددات التي يكون الإنسان أكثر حساسية لها، ويقلل من دقة التمثيل في النطاقات التي نسمعها أقل. ويُعتبر هذا التمثيل أقرب إلى الطريقة التي يسمع بها الإنسان الأصوات، لذلك يُستخدم بكثرة في أنظمة التعرف على الصوت والكلام، حيث يوفر تمثيلًا أكثر فاعلية للسمات الصوتية المهمة.

				
					S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128)
S_db = librosa.power_to_db(S, ref=np.max)

plt.figure(figsize=(10, 4))
librosa.display.specshow(S_db, sr=sr, x_axis='time', y_axis='mel')
plt.colorbar(format='%+2.0f dB')
plt.title('Mel Spectrogram')
plt.tight_layout()
plt.show()

				
			
audio data analysis python feature extraction h

معامل ميل الترددي (MFCC - Mel Frequency Cepstral Coefficients): وهو يمثل معاملات تردد الميل، أحد أهم التمثيلات الطيفية المستخدمة في تحليل الإشارات الصوتية. يتم استخراج هذه المعاملات من الطيف الترددي بمقياس ميل (Mel Spectrogram)، ولكن مع تطبيق تحويلات رياضية إضافية تُركّز على الخصائص الأكثر تعبيرًا عن محتوى الصوت. وكما يُعد من أقوى الميزات المستخدمة.

				
					mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)

plt.figure(figsize=(10, 4))
librosa.display.specshow(mfccs, x_axis='time')
plt.colorbar()
plt.title('MFCC')
plt.tight_layout()
plt.show()

				
			
audio data analysis python feature extraction i

نختم هذا الدرس بالمكتبات التي تساعد في التعرف على كيفية التعامل مع البيانات الصوتية. كما توفر لغة بايثون العديد من المكتبات لمعالجة البيانات الصوتية، مما يجعلها خيارًا مفضلًا للمطورين في هذا المجال.

تُعد Librosa مكتبة متعددة الاستخدامات لتحليل الصوت، حيث توفر أدوات لتحميل الملفات الصوتية واستخراج الميزات مثل MFCCs والمخططات الطيفية (Spectrograms)، بالإضافة إلى تنفيذ مهام مثل تقدير الإيقاع واكتشاف النغمة.

كما تُعد PyDub مكتبة لمعالجة ملفات الصوت، حيث تُبسط المهام مثل تقسيم المقاطع ودمجها وإعادة ضبط معدل العينة (Resampling).

من جهة أخرى، تم تطوير TorchAudio خصيصًا من أجل تطبيقات التعلم العميق، وهي تتكامل بسلاسة مع PyTorch، حيث تقدم أدوات لتحميل الصوت، وتطبيق التحويلات، واستخراج التمثيلات (Embeddings) الضرورية لبناء نماذج ذكاء اصطناعي صوتية متقدمة.

وأخيرًا، مكتبة SoundFile وهي مكتبة لقراءة وحفظ ملفات الصوت بجودة عالية وتنسيقات متعددة.

Google Colab
يمكنكم الاطلاع على ملف نوتبوك كامل يحتوي جميع الأكواد بالكامل وتجربته على منصة Google Colab عبر الرابط التالي

نـشـــرة فـهـــم البـريديـــة

لتبقى على اطلاع دائم على كل ما هو جديد مما تقدمه منصة فهم، انضم لنشرتنا البريدية.
خريجة دراسات عليا في علوم الحاسب الآلي من جامعة جدة، وعملتُ كعضو هيئة تدريس. مهتمة بمجال تطبيقات الذكاء الاصطناعي.