إنشاء نموذج تصنيف صوتي مسبق التدريب مخصّص

1. قبل البدء

وفي الدرس التطبيقي السابق، صمّمت تطبيقًا أساسيًا لتصنيف الصوت.

ماذا لو أردت تخصيص نموذج تصنيف الصوت للتعرّف على الصوت من فئات مختلفة غير متاحة في نموذج مدرّب مسبقًا؟ أو ماذا لو كنت تريد تخصيص النموذج باستخدام بياناتك الخاصة؟

في هذا الدرس التطبيقي، يمكنك تخصيص نموذج مصنّف مسبقًا لتصنيف الصوت، وذلك لرصد أصوات الطيور. يمكن تكرار الأسلوب نفسه باستخدام بياناتك.

المتطلّبات الأساسية

تم تصميم هذا الدرس التطبيقي حول الترميز لمطوّري البرامج المتوافقة مع الأجهزة الجوّالة الذين يريدون اكتساب خبرة في ما يتعلق بتعلُّم الآلة. ويجب أن تكون على دراية بما يلي:

  • تطوير برامج Android باستخدام Kotlin و"استوديو Android"
  • بنية Python الأساسية

ما ستتعرَّف عليه

  • كيفية نقل التعلّم للنطاق الصوتي
  • كيفية إنشاء بياناتك
  • كيفية نشر نموذجك الخاص على تطبيق Android

الأشياء التي تحتاج إليها

  • إصدار حديث من "استوديو Android" (الإصدار 4.1.2 أو الإصدارات الأحدث)
  • جهاز يعمل بنظام التشغيل Android بإصدار Android واجهة برمجة التطبيقات 23 (Android 6.0)
  • نموذج الرمز
  • المعرفة الأساسية بتطوير نظام التشغيل Android بلغة Kotlin

2. مجموعة بيانات الطيور

ستستخدم مجموعة بيانات Birdsong التي سبق أن تم إعدادها لتسهيل استخدامها. وتأتي كل الملفات الصوتية من موقع Xeno-canto الإلكتروني.

تحتوي مجموعة البيانات هذه على أغانٍ من:

الاسم: House Sparrow

الرمز: houspa

صورة لأنواع طيور "عصفور البيت" من تصميم "أليخاندرو باير تامايو" من أرمينيا، كولومبيا

[الصوت]

الاسم: Red Crossbill

الرمز: redcro

صورة لأنواع الطيور "كروسبل" الحمراء التي صمّمتها "إلين ويلسون"

[الصوت]

الاسم: أبيض فقاعات

الرمز: wbwwre1

صورة لمهندس خشبي يحمل الصدر

[الصوت]

الاسم: Antpitta متوج بالكستناء

الرمز: chcant2

صورة لآنتبا مكسو بالكستناء

[الصوت]

الاسم: Azara's Spinetail

الرمز: azaspi1

صورة لطائر الأزنار "سبانيتر".

[الصوت]

توجد مجموعة البيانات هذه في ملف ZIP ومحتواه هو:

  • metadata.csv تتضمن كل المعلومات عن كل ملف صوتي، مثل الشخص الذي سجّل المقطع الصوتي الذي تم تسجيله فيه وترخيص استخدامه واسم الطائر.
  • مسار وقطار تجريبي
  • داخل مجلدات القطار/الاختبار، هناك مجلد لكل رمز طائر. وداخل كلٍ منهما، تتوفّر جميع الملفات التي تتضمّن .wav على هذا الطائر.

وتكون جميع الملفات الصوتية بتنسيق التنسيق wav واتّبع المواصفات التالية:

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

لتسهيل العملية بالكامل، لن تحتاج إلى تنزيل مجموعة البيانات على جهازك، وستستخدمها على Google Colab (اللاحقة في هذا الدليل).

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

3- الحصول على نموذج الرمز

تنزيل الرمز

انقر على الرابط التالي لتنزيل كل رموز هذا الدرس التطبيقي حول الترميز:

أو يمكنك نسخ المستودع إذا كنت تفضّل ذلك:

git clone https://github.com/googlecodelabs/odml-pathways.git

فك ضغط ملف zip الذي تم تنزيله. سيؤدي ذلك إلى تفريغ مجلد جذر (odml-pathways) يضم جميع الموارد التي تحتاجها. بالنسبة إلى هذا الدرس التطبيقي حول الترميز، ستحتاج إلى المصادر في الدليل الفرعي audio_classification/codelab2/android فقط.

يحتوي الدليل الفرعي android في المستودع audio_classification/codelab2/android على دليلَين:

  • Android_studio_folder.png Starter - الرمز الذي يتم استخدامه في هذا الدرس التطبيقي حول الترميز.
  • Android_studio_folder.pngنهائي - اكتمل رمز نموذج التطبيق المكتمل.

استيراد تطبيق إجراء التفعيل

ابدأ باستيراد تطبيق إجراء التفعيل إلى "استوديو Android":

  1. افتح Android Studio واختَر استيراد مشروع (Gradle أو Eclipse ADT وغير ذلك)
  2. افتح مجلد starter (audio_classification/codelab2/android/starter) من رمز المصدر الذي نزّلته في وقت سابق.

7c0f27882a2698ac.png

للتأكد من توفر جميع الاعتماديات على تطبيقك، يجب مزامنة مشروعك مع ملفات Excel عند انتهاء عملية الاستيراد.

  1. اختَر مزامنة المشروع مع ملفات Gradle (b451ab2d04d835f9.png) من شريط أدوات "استوديو Android".

4. فهم تطبيق إجراء التفعيل

هذا التطبيق هو نفسه الذي تم إنشاؤه في الدرس التطبيقي الأول حول ترميز الصوت: أنشئ تطبيقًا أساسيًا لتصنيف الصوت.

لفهم الرمز بشكل أفضل، ننصحك بتنفيذ هذا الدرس التطبيقي قبل المتابعة.

تتوفّر جميع الرموز في MainActivity (للبساطة قدر الإمكان).

باختصار، يتجاوز الرمز مهام:

  • جارٍ تحميل النموذج
val classifier = AudioClassifier.createFromFile(this, modelPath)
  • إنشاء مسجِّل الصوت وبدء التسجيل
val tensor = classifier.createInputTensorAudio()

val format = classifier.requiredTensorAudioFormat
val recorderSpecs = "Number Of Channels: ${format.channels}\n" +
       "Sample Rate: ${format.sampleRate}"
recorderSpecsTextView.text = recorderSpecs

val record = classifier.createAudioRecord()
record.startRecording()
  • إنشاء سلسلة محادثات موقِّت لتشغيل الاستنتاج معلّمات الطريقة scheduleAtFixedRate هي المدة التي تنتظرها لبدء التنفيذ والوقت بين تنفيذ المهمة المتعاقبة. في الرمز الوارد أدناه، سيبدأ تشغيله خلال مللي ثانية وسيتم تشغيله مرة أخرى كل 500 مللي ثانية.
Timer().scheduleAtFixedRate(1, 500) {
...
}
  • تشغيل الاستنتاج على الصوت الذي تم التقاطه
val numberOfSamples = tensor.load(record)
val output = classifier.classify(tensor)
  • تصنيف الفلاتر للنتائج المنخفضة
val filteredModelOutput = output[0].categories.filter {
   it.score > probabilityThreshold
}
  • إظهار النتائج على الشاشة
val outputStr = filteredModelOutput.map { "${it.label} -> ${it.score} " }
   .joinToString(separator = "\n")

runOnUiThread {
   textView.text = outputStr
}

يمكنك الآن تشغيل التطبيق واللعب به كما هو، ولكن تذكر أنه يتم استخدامه باستخدام نموذج أكثر تدريبًا بشكل عام.

5. تدريب نموذج تصنيف الصوت المخصص باستخدام أداة إنشاء النماذج

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

كما ذكرنا سابقًا، ستكون متخصصًا في إعداد أصوات الطيور. في ما يلي مجموعة بيانات تحتوي على أصوات للطيور منظّمة من الموقع الإلكتروني Xeno-canto.

Colaboratory

بعد ذلك، انتقِل إلى Google Colab لتدريب النموذج المخصّص.

سيستغرق التدريب على النموذج المخصّص 30 دقيقة تقريبًا.

إذا كنت تريد تخطّي هذه الخطوة، يمكنك تنزيل النموذج الذي تم تدريبه على العمل التعاوني باستخدام مجموعة البيانات المقدَّمة والمتابعة إلى الخطوة التالية.

6- إضافة نموذج TFLite المخصّص إلى تطبيق Android

الآن بعد أن درَّبت نموذج التصنيف الصوتي الخاص بك واحفظه محليًا، عليك وضعه في مجلد مواد العرض في تطبيق Android.

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

  1. في "استوديو Android" ومن خلال عرض "مشروع Android"، انقر بزر الماوس الأيمن على مجلد مواد العرض.

7cca2c22ed8cf4c8.png

  1. ستظهر لك نافذة منبثقة تعرِض قائمة بالخيارات. وستكون إحدى هذه الخطوات هي فتح المجلد في نظام الملفات. ابحث عن التطبيق المناسب لنظام التشغيل وحدده. وعلى نظام التشغيل Mac، ستظهر علامة التبويب Revell in Finder (على نظام التشغيل Mac)، وOpen in Explorer (فتح في Explorer) على نظام التشغيل Windows، أمّا بالنسبة إلى Ubuntu، ستظهر في Files (الملفات).

95e0eca881d35f6b.png

  1. انسخ النموذج الذي تم تنزيله إلى المجلد.

بعد الانتهاء من ذلك، ارجع إلى "استوديو Android"، ويُفترض أن يظهر لك ملفك في مجلد "مواد العرض".

52bda66abe201fe5.png

7- تحميل النموذج الجديد على التطبيق الأساسي

يستخدم التطبيق الأساسي نموذجًا تم تدريبه مسبقًا. يمكنك استبداله بالمقطع الذي تم تدريبه للتو.

  1. قائمة المهام 1: لتحميل النموذج الجديد بعد إضافته إلى مجلد مواد العرض، يمكنك تغيير قيمة المتغير modelPath:
var modelPath = "my_birds_model.tflite"

يتضمن النموذج الجديد مخرجات (عناوين):

  • النتيجة الأصلية الأكثر عمومية من النموذج الأساسي الذي استخدمته، في هذه الحالة YAMNet.
  • المخرجات الثانوية الخاصة بالطيور التي استخدمتها في التدريب

وتُعدّ هذه الخطوة ضرورية لأنّ منصّة YAMNet تؤدي دورًا رائعًا في التعرّف على العديد من الصفوف المشتركة، مثل كتم الصوت مثلاً. باستخدام هذا، لا داعي للقلق بشأن جميع الصفوف الأخرى التي لم تضِفها إلى مجموعة البيانات.

ما الذي ستفعله الآن هو إذا أظهر تصنيف YAMNet درجة عالية لفئة الطيور، فإنك ستنظر في الطيور التي تكون في الإخراج الآخر.

37ce1c14e9e2d1b0.png

  1. قائمة المهام 2: اقرأها إذا كان رأس التصنيف الأول يؤكّد صوتها بدرجة عالية. ستغيّر هنا الفلترة لفلترة أي محتوى غير الطيور:
val filteredModelOuput = output[0].categories.filter {
   it.label.contains("Bird") && it.score > .3
}
  1. مهم 3: إذا اكتشف الرأس الأساسي للنموذج أنّ هناك صوتًا في الصوت لديه احتمال جيد، ستحصل على الطائر الذي يظهر في الرأس الثاني:
if (filteredModelOutput.isNotEmpty()) {
   Log.i("Yamnet", "bird sound detected!")
   filteredModelOutput = output[1].categories.filter {
       it.score > probabilityThreshold
   }
}

هَذَا كُلُّ شَيْءْ. تم تغيير تصميم النموذج لاستخدام النموذج الذي تم تدريبه للتو.

والخطوة التالية هي اختباره.

8- اختبار التطبيق باستخدام طرازك الجديد

لقد دمجت نموذج التصنيف الصوتي في التطبيق، لذا لنختبره.

  1. يمكنك الاتصال بجهاز Android، ثم النقر على "تشغيل" (تنفيذ) في شريط أدوات "استوديو Android".

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

bec397de3c8aaf32.png

9- تهانينا

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

المواضيع التي تناولناها

  • كيفية إعداد مجموعة البيانات الخاصة بك
  • كيفية نقل التعلّم لتصنيف الصوت باستخدام أداة إنشاء النماذج
  • كيفية استخدام النموذج على تطبيق Android

الخطوات التالية

  • تجربة البيانات الخاصة بك
  • مشاركة ما تنشئه معنا

مزيد من المعلومات

هل لديك أي أسئلة؟

الإبلاغ عن المشاكل