دليل شامل لإنشاء نظام التعرف على الكلام باستخدام Keras وTensorFlow

Amine
05/09/2024

1. مقدمة حول نظام التعرف على الكلام

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

2. إعداد بيئة العمل

قبل الشروع في بناء النموذج، نحتاج إلى إعداد بيئة العمل. سنقوم بتثبيت المكتبات الضرورية مثل TensorFlow، Keras، ومكتبة LibROSA لتحليل الصوت.

pip install tensorflow keras librosa numpy matplotlib

3. معالجة الصوت واستخراج الميزات

الخطوة الأولى في نظام التعرف على الكلام هي معالجة الصوت واستخراج الميزات منه. نستخدم **Melspectrogram** وهي تقنية لتحويل الإشارة الصوتية إلى تمثيل طيفي (Spectrogram) مع الأخذ بعين الاعتبار ترددات ميل (Mel frequencies).

نقوم بتحميل ملفات الصوت باستخدام مكتبة **LibROSA** ثم نحولها إلى Melspectrogram لاستخدامه كمدخلات للنموذج.

import librosa
import numpy as np
import matplotlib.pyplot as plt

# تحميل ملف صوتي باستخدام LibROSA
audio_path = 'path_to_audio_file.wav'
audio, sample_rate = librosa.load(audio_path, sr=None)

# استخراج Melspectrogram
melspec = librosa.feature.melspectrogram(y=audio, sr=sample_rate, n_mels=128)

# تحويل المصفوفة إلى الشكل اللوجاريتمي لتكون أكثر وضوحًا
melspec_db = librosa.power_to_db(melspec, ref=np.max)

# عرض Melspectrogram
plt.figure(figsize=(10, 4))
librosa.display.specshow(melspec_db, sr=sample_rate, x_axis='time', y_axis='mel')
plt.colorbar(format='%+2.0f dB')
plt.title('Mel-spectrogram')
plt.tight_layout()
plt.show()

4. بناء نموذج التعرف على الكلام باستخدام CNN وRNN

سنقوم الآن ببناء نموذج للتعرف على الكلام باستخدام شبكات **Convolutional Neural Networks (CNN)** مع **Recurrent Neural Networks (RNN)** مثل **LSTM** أو **GRU**. النموذج يعتمد على **CNN** لاستخراج الميزات المكانية من Melspectrogram، ثم استخدام **RNN** لتحليل التسلسلات الزمنية.

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, LSTM, Dense, TimeDistributed, Reshape, Dropout

def build_model(input_shape):
    model = Sequential()
    
    # طبقة تلافيفية (Convolutional Layer)
    model.add(Conv2D(32, (3, 3), activation='relu', padding='same', input_shape=input_shape))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    
    # طبقة تلافيفية أخرى
    model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    
    # تحويل إلى تسلسل زمني لاستخدامه مع LSTM
    model.add(Reshape((-1, 64)))
    
    # طبقة LSTM لتحليل التسلسل الزمني
    model.add(LSTM(128, return_sequences=False))
    
    # إضافة طبقة Dropout لتجنب الإفراط في التكيف
    model.add(Dropout(0.5))
    
    # طبقة التصنيف النهائية
    model.add(Dense(10, activation='softmax'))  # نفترض هنا أن لدينا 10 كلمات نريد التعرف عليها
    
    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
    return model

# تحديد شكل الإدخال (عدد القنوات × الطول × العرض)
input_shape = (128, 44, 1)  # 128 Mel bins × 44 time steps
model = build_model(input_shape)
model.summary()

5. تدريب النظام

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

نفترض أن لدينا مجموعة بيانات تحتوي على الملفات الصوتية والكلمات المقابلة لها، وسنقوم بتحميلها وتدريب النموذج.

from sklearn.preprocessing import LabelBinarizer

# نفترض أن لدينا بيانات جاهزة للتدريب
X_train = np.array([...])  # تمثيلات Mel-spectrogram
y_train = np.array([...])  # التسميات المقابلة للكلمات

# تحويل التسميات إلى صيغة One-hot
lb = LabelBinarizer()
y_train_onehot = lb.fit_transform(y_train)

# تدريب النموذج
model.fit(X_train, y_train_onehot, epochs=20, batch_size=32, validation_split=0.2)

6. اختبار النموذج على تسجيلات جديدة

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

# تحميل ملف صوتي جديد
new_audio_path = 'path_to_new_audio.wav'
new_audio, new_sample_rate = librosa.load(new_audio_path, sr=None)

# استخراج Melspectrogram للتسجيل الجديد
new_melspec = librosa.feature.melspectrogram(y=new_audio, sr=new_sample_rate, n_mels=128)
new_melspec_db = librosa.power_to_db(new_melspec, ref=np.max)
new_melspec_db = np.expand_dims(new_melspec_db, axis=-1)  # إضافة بعد القناة

# توقع الكلمة المنطوقة باستخدام النموذج المدرب
prediction = model.predict(np.expand_dims(new_melspec_db, axis=0))
predicted_label = lb.inverse_transform(prediction)
print("Predicted Word:", predicted_label[0])

الخاتمة

في هذا الدليل، قمنا بإنشاء نظام التعرف على الكلام باستخدام Keras وTensorFlow. تعلمنا كيفية معالجة الملفات الصوتية واستخراج Melspectrogram منها، ثم قمنا ببناء نموذج يعتمد على CNN وLSTM لتحليل الميزات الصوتية والتعرف على الكلمات. يمكنك توسيع هذا النظام وتحسينه باستخدام مجموعات بيانات أكبر أو تقنيات أخرى مثل تحويلات الصوت المتقدمة.

التعليقات

اترك تعليقاً