التعرف على الصوت والكلمات لنظام Android

يوضح لك هذا البرنامج التعليمي كيفية استخدام TensorFlow Lite مع نماذج التعلم الآلي المعدة مسبقًا للتعرف على الأصوات والكلمات المنطوقة في تطبيق Android. يمكن استخدام نماذج تصنيف الصوت مثل تلك الموضحة في هذا البرنامج التعليمي لاكتشاف النشاط أو تحديد الإجراءات أو التعرف على الأوامر الصوتية.

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

تصنيف الصوت مع التعلم الآلي

يتعرف نموذج التعلم الآلي الموجود في هذا البرنامج التعليمي على الأصوات أو الكلمات من العينات الصوتية المسجلة باستخدام ميكروفون على جهاز Android. يتيح لك التطبيق النموذجي في هذا البرنامج التعليمي التبديل بين YAMNet/classifier ، وهو نموذج يتعرف على الأصوات، ونموذج يتعرف على كلمات منطوقة محددة، تم تدريبه باستخدام أداة TensorFlow Lite Model Maker . تقوم النماذج بتشغيل تنبؤات على المقاطع الصوتية التي تحتوي على 15600 عينة فردية لكل مقطع ويبلغ طولها حوالي ثانية واحدة.

مثال الإعداد والتشغيل

بالنسبة للجزء الأول من هذا البرنامج التعليمي، يمكنك تنزيل العينة من GitHub وتشغيلها باستخدام Android Studio. تستكشف الأقسام التالية من هذا البرنامج التعليمي الأقسام ذات الصلة من المثال، حتى تتمكن من تطبيقها على تطبيقات Android الخاصة بك.

متطلبات النظام

  • إصدار Android Studio 2021.1.1 (Bumblebee) أو أعلى.
  • Android SDK الإصدار 31 أو أعلى
  • جهاز Android مزود بإصدار نظام التشغيل الأدنى SDK 24 (Android 7.0 - Nougat) مع تمكين وضع المطور.

احصل على رمز المثال

قم بإنشاء نسخة محلية من رمز المثال. ستستخدم هذا الرمز لإنشاء مشروع في Android Studio وتشغيل نموذج التطبيق.

لاستنساخ رمز المثال وإعداده:

  1. استنساخ مستودع git
    git clone https://github.com/tensorflow/examples.git
    
  2. بشكل اختياري، قم بتكوين مثيل git الخاص بك لاستخدام الدفع المتناثر، بحيث يكون لديك فقط الملفات الخاصة بالتطبيق النموذجي:

    cd examples
    git sparse-checkout init --cone
    git sparse-checkout set lite/examples/audio_classification/android
    

استيراد وتشغيل المشروع

قم بإنشاء مشروع من رمز المثال الذي تم تنزيله، وقم ببناء المشروع، ثم قم بتشغيله.

لاستيراد وإنشاء مشروع التعليمات البرمجية النموذجي:

  1. ابدأ تشغيل أندرويد ستوديو .
  2. في Android Studio، اختر File > New > Import Project .
  3. انتقل إلى دليل التعليمات البرمجية النموذجي الذي يحتوي على ملف build.gradle ( .../examples/lite/examples/audio_classification/android/build.gradle ) وحدد هذا الدليل.

إذا قمت بتحديد الدليل الصحيح، فسيقوم Android Studio بإنشاء مشروع جديد وإنشائه. يمكن أن تستغرق هذه العملية بضع دقائق، اعتمادًا على سرعة جهاز الكمبيوتر الخاص بك وما إذا كنت قد استخدمت Android Studio لمشاريع أخرى. عند اكتمال البناء، يعرض Android Studio رسالة BUILD SUCCESSFUL في لوحة حالة إخراج البناء .

لتشغيل المشروع:

  1. من Android Studio، قم بتشغيل المشروع عن طريق تحديد Run > Run 'app' .
  2. حدد جهاز Android متصلًا به ميكروفون لاختبار التطبيق.

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

إضافة تبعيات المشروع

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

يستخدم تطبيق المثال مكتبات TensorFlow Lite التالية:

توضح الإرشادات التالية كيفية إضافة تبعيات المشروع المطلوبة إلى مشروع تطبيق Android الخاص بك.

لإضافة تبعيات الوحدة النمطية:

  1. في الوحدة التي تستخدم TensorFlow Lite، قم بتحديث ملف build.gradle الخاص بالوحدة ليشمل التبعيات التالية. في رمز المثال، يوجد هذا الملف هنا: .../examples/lite/examples/audio_classification/android/build.gradle

    dependencies {
    ...
        implementation 'org.tensorflow:tensorflow-lite-task-audio'
    }
    
  2. في Android Studio، قم بمزامنة تبعيات المشروع عن طريق تحديد: File > Sync Project with Gradle Files .

تهيئة نموذج ML

في تطبيق Android الخاص بك، يجب عليك تهيئة نموذج التعلم الآلي TensorFlow Lite باستخدام المعلمات قبل تشغيل التنبؤات مع النموذج. تعتمد معلمات التهيئة هذه على النموذج ويمكن أن تتضمن إعدادات مثل الحد الأدنى الافتراضي لحدود الدقة للتنبؤات وتسميات الكلمات أو الأصوات التي يمكن للنموذج التعرف عليها.

يتضمن نموذج TensorFlow Lite ملف *.tflite يحتوي على النموذج. يحتوي ملف النموذج على منطق التنبؤ ويتضمن عادةً بيانات تعريف حول كيفية تفسير نتائج التنبؤ، مثل أسماء فئات التنبؤ. يجب تخزين ملفات النموذج في دليل src/main/assets لمشروع التطوير الخاص بك، كما في مثال الكود:

  • <project>/src/main/assets/yamnet.tflite

من أجل الراحة وسهولة قراءة التعليمات البرمجية، يعلن المثال عن كائن مصاحب يحدد إعدادات النموذج.

لتهيئة النموذج في تطبيقك:

  1. قم بإنشاء كائن مصاحب لتحديد إعدادات النموذج:

    companion object {
      const val DISPLAY_THRESHOLD = 0.3f
      const val DEFAULT_NUM_OF_RESULTS = 2
      const val DEFAULT_OVERLAP_VALUE = 0.5f
      const val YAMNET_MODEL = "yamnet.tflite"
      const val SPEECH_COMMAND_MODEL = "speech.tflite"
    }
    
  2. قم بإنشاء إعدادات النموذج عن طريق إنشاء كائن AudioClassifier.AudioClassifierOptions :

    val options = AudioClassifier.AudioClassifierOptions.builder()
      .setScoreThreshold(classificationThreshold)
      .setMaxResults(numOfResults)
      .setBaseOptions(baseOptionsBuilder.build())
      .build()
    
  3. استخدم كائن الإعدادات هذا لإنشاء كائن TensorFlow Lite AudioClassifier الذي يحتوي على النموذج:

    classifier = AudioClassifier.createFromFileAndOptions(context, "yamnet.tflite", options)
    

تمكين تسريع الأجهزة

عند تهيئة نموذج TensorFlow Lite في تطبيقك، يجب أن تفكر في استخدام ميزات تسريع الأجهزة لتسريع حسابات التنبؤ للنموذج. مندوبو TensorFlow Lite عبارة عن وحدات برمجية تعمل على تسريع تنفيذ نماذج التعلم الآلي باستخدام أجهزة معالجة متخصصة على جهاز محمول، مثل وحدة معالجة الرسومات (GPUs) أو وحدات معالجة الموتر (TPUs). يستخدم مثال التعليمات البرمجية NNAPI Delegate للتعامل مع تسريع الأجهزة لتنفيذ النموذج:

val baseOptionsBuilder = BaseOptions.builder()
   .setNumThreads(numThreads)
...
when (currentDelegate) {
   DELEGATE_CPU -> {
       // Default
   }
   DELEGATE_NNAPI -> {
       baseOptionsBuilder.useNnapi()
   }
}

يوصى باستخدام المفوضين لتشغيل نماذج TensorFlow Lite، ولكنه غير مطلوب. لمزيد من المعلومات حول استخدام المفوضين مع TensorFlow Lite، راجع مندوبو TensorFlow Lite .

تحضير البيانات للنموذج

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

يقبل نموذج YAMNet/المصنف ونماذج أوامر الكلام المخصصة المستخدمة في مثال التعليمات البرمجية هذا كائنات بيانات Tensor التي تمثل مقاطع صوتية أحادية القناة أو أحادية مسجلة عند 16 كيلو هرتز في مقاطع مدتها 0.975 ثانية (15600 عينة). من خلال تشغيل التنبؤات على البيانات الصوتية الجديدة، يجب على تطبيقك تحويل تلك البيانات الصوتية إلى كائنات بيانات Tensor بهذا الحجم والشكل. تتعامل واجهة برمجة التطبيقات الصوتية لمكتبة المهام TensorFlow Lite مع تحويل البيانات نيابةً عنك.

في رمز المثال لفئة AudioClassificationHelper ، يسجل التطبيق الصوت المباشر من ميكروفونات الجهاز باستخدام كائن Android AudioRecord . يستخدم الكود AudioClassifier لإنشاء هذا الكائن وتكوينه لتسجيل الصوت بمعدل أخذ عينات مناسب للنموذج. يستخدم الكود أيضًا AudioClassifier لإنشاء كائن TensorAudio لتخزين البيانات الصوتية المحولة. ثم يتم تمرير كائن TensorAudio إلى النموذج لتحليله.

لتوفير بيانات صوتية لنموذج ML:

  • استخدم كائن AudioClassifier لإنشاء كائن TensorAudio وكائن AudioRecord :

    fun initClassifier() {
    ...
      try {
        classifier = AudioClassifier.createFromFileAndOptions(context, currentModel, options)
        // create audio input objects
        tensorAudio = classifier.createInputTensorAudio()
        recorder = classifier.createAudioRecord()
      }
    

تشغيل التوقعات

في تطبيق Android الخاص بك، بمجرد توصيل كائن AudioRecord وكائن TensorAudio بكائن AudioClassifier، يمكنك تشغيل النموذج مقابل تلك البيانات لإنتاج تنبؤ أو استنتاج . يعمل رمز المثال لهذا البرنامج التعليمي على تشغيل تنبؤات على المقاطع من دفق إدخال صوتي مسجل مباشر بمعدل محدد.

يستهلك تنفيذ النموذج موارد كبيرة، لذا من المهم تشغيل تنبؤات نموذج ML على سلسلة منفصلة في الخلفية. يستخدم التطبيق النموذجي كائن [ScheduledThreadPoolExecutor](https://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor) لعزل معالجة النموذج عن الوظائف الأخرى للتطبيق.

يمكن لنماذج تصنيف الصوت التي تتعرف على الأصوات ذات البداية والنهاية الواضحتين، مثل الكلمات، أن تنتج تنبؤات أكثر دقة بشأن التدفق الصوتي الوارد من خلال تحليل المقاطع الصوتية المتداخلة. يساعد هذا الأسلوب النموذج على تجنب فقدان التنبؤات للكلمات التي يتم قطعها في نهاية المقطع. في التطبيق النموذجي، في كل مرة تقوم فيها بتشغيل تنبؤ، يقوم الكود بالتقاط أحدث مقطع مدته 0.975 ثانية من المخزن المؤقت للتسجيل الصوتي ويقوم بتحليله. يمكنك جعل النموذج يقوم بتحليل المقاطع الصوتية المتداخلة عن طريق تعيين قيمة interval لمجمع تنفيذ مؤشر ترابط تحليل النموذج إلى طول أقصر من طول المقاطع التي يتم تحليلها. على سبيل المثال، إذا قام النموذج الخاص بك بتحليل مقاطع مدتها ثانية واحدة وقمت بتعيين الفاصل الزمني إلى 500 مللي ثانية، فسيقوم النموذج بتحليل النصف الأخير من المقطع السابق و500 مللي ثانية من البيانات الصوتية الجديدة في كل مرة، مما يؤدي إلى إنشاء تداخل في تحليل المقطع بنسبة 50%.

لبدء تشغيل التنبؤات على البيانات الصوتية:

  1. استخدم طريقة AudioClassificationHelper.startAudioClassification() لبدء التسجيل الصوتي للنموذج:

    fun startAudioClassification() {
      if (recorder.recordingState == AudioRecord.RECORDSTATE_RECORDING) {
        return
      }
      recorder.startRecording()
    }
    
  2. قم بتعيين عدد المرات التي يقوم فيها النموذج بإنشاء استنتاج من المقاطع الصوتية عن طريق تعيين interval زمني ثابت في كائن ScheduledThreadPoolExecutor :

    executor = ScheduledThreadPoolExecutor(1)
    executor.scheduleAtFixedRate(
      classifyRunnable,
      0,
      interval,
      TimeUnit.MILLISECONDS)
    
  3. ينفذ كائن classifyRunnable الموجود في الكود أعلاه طريقة AudioClassificationHelper.classifyAudio() ، التي تقوم بتحميل أحدث البيانات الصوتية المتاحة من المُسجل وإجراء التنبؤ:

    private fun classifyAudio() {
      tensorAudio.load(recorder)
      val output = classifier.classify(tensorAudio)
      ...
    }
    

إيقاف معالجة التنبؤ

تأكد من توقف كود التطبيق الخاص بك عن القيام بتصنيف الصوت عندما يفقد جزء أو نشاط معالجة الصوت في تطبيقك التركيز. إن تشغيل نموذج التعلم الآلي بشكل مستمر له تأثير كبير على عمر بطارية جهاز Android. استخدم طريقة onPause() لنشاط Android أو الجزء المرتبط بتصنيف الصوت لإيقاف تسجيل الصوت ومعالجة التنبؤ.

لإيقاف تسجيل الصوت وتصنيفه:

  • استخدم طريقة AudioClassificationHelper.stopAudioClassification() لإيقاف التسجيل وتنفيذ النموذج، كما هو موضح أدناه في فئة AudioFragment :

    override fun onPause() {
      super.onPause()
      if (::audioHelper.isInitialized ) {
        audioHelper.stopAudioClassification()
      }
    }
    

التعامل مع إخراج النموذج

في تطبيق Android الخاص بك، بعد معالجة مقطع صوتي، يُنتج النموذج قائمة بالتنبؤات التي يجب أن يتعامل معها رمز التطبيق الخاص بك عن طريق تنفيذ منطق عمل إضافي، أو عرض النتائج للمستخدم، أو اتخاذ إجراءات أخرى. يختلف مخرج أي نموذج TensorFlow Lite من حيث عدد التنبؤات التي ينتجها (واحد أو أكثر)، والمعلومات الوصفية لكل تنبؤ. في حالة النماذج الموجودة في تطبيق المثال، تكون التنبؤات إما قائمة بالأصوات أو الكلمات التي تم التعرف عليها. يتيح لك كائن خيارات AudioClassifier المستخدم في مثال التعليمات البرمجية تعيين الحد الأقصى لعدد التنبؤات باستخدام طريقة setMaxResults() ، كما هو موضح في قسم تهيئة نموذج ML .

للحصول على نتائج التنبؤ من النموذج:

  1. احصل على نتائج طريقة classify() الخاصة بكائن AudioClassifier وقم بتمريرها إلى كائن المستمع (مرجع الكود):

    private fun classifyAudio() {
      ...
      val output = classifier.classify(tensorAudio)
      listener.onResult(output[0].categories, inferenceTime)
    }
    
  2. استخدم وظيفة onResult() الخاصة بالمستمع للتعامل مع الإخراج عن طريق تنفيذ منطق الأعمال أو عرض النتائج للمستخدم:

    private val audioClassificationListener = object : AudioClassificationListener {
      override fun onResult(results: List<Category>, inferenceTime: Long) {
        requireActivity().runOnUiThread {
          adapter.categoryList = results
          adapter.notifyDataSetChanged()
          fragmentAudioBinding.bottomSheetLayout.inferenceTimeVal.text =
            String.format("%d ms", inferenceTime)
        }
      }
    

يقوم النموذج المستخدم في هذا المثال بإنشاء قائمة تنبؤات مع تسمية للصوت أو الكلمة المصنفة، ودرجة تنبؤ تتراوح بين 0 و1 باعتبارها Float تمثل ثقة التنبؤ، حيث يمثل 1 أعلى تصنيف للثقة. بشكل عام، تعتبر التنبؤات التي تقل نتيجتها عن 50% (0.5) غير حاسمة. ومع ذلك، فإن كيفية التعامل مع نتائج التنبؤ ذات القيمة المنخفضة أمر متروك لك ولاحتياجات تطبيقك.

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

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

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