זיהוי קול ומילים עבור אנדרואיד

מדריך זה מראה לך כיצד להשתמש ב- TensorFlow Lite עם מודלים מובנים מראש של למידת מכונה כדי לזהות צלילים ומילים מדוברות באפליקציית אנדרואיד. ניתן להשתמש במודלים של סיווג שמע כמו אלה המוצגים במדריך זה כדי לזהות פעילות, לזהות פעולות או לזהות פקודות קוליות.

הדגמה מונפשת לזיהוי שמע מדריך זה מראה לך כיצד להוריד את הקוד לדוגמה, לטעון את הפרויקט ל- Android Studio , ומסביר חלקים מרכזיים בדוגמה של הקוד כדי שתוכל להתחיל להוסיף פונקציונליות זו לאפליקציה משלך. קוד האפליקציה לדוגמה משתמש בספריית המשימות של TensorFlow לאודיו , המטפלת ברוב ההקלטה והעיבוד המקדים של נתוני האודיו. למידע נוסף על האופן שבו אודיו מעובד מראש לשימוש עם מודלים של למידת מכונה, ראה הכנת נתוני אודיו והגדלה .

סיווג אודיו עם למידת מכונה

מודל למידת המכונה במדריך זה מזהה צלילים או מילים מדגימות אודיו שהוקלטו במיקרופון במכשיר אנדרואיד. האפליקציה לדוגמה במדריך זה מאפשרת לך לעבור בין YAMNet/מסווג , מודל שמזהה צלילים, לבין מודל שמזהה מילים מדוברות ספציפיות, שהוכשר באמצעות הכלי TensorFlow Lite Model Maker . המודלים מריצים תחזיות על קטעי אודיו המכילים 15600 דגימות בודדות לכל קליפ ואורכם כשנייה אחת.

דוגמה להגדרה והרצה

עבור החלק הראשון של מדריך זה, אתה מוריד את הדוגמה מ- GitHub ומפעיל אותה באמצעות Android Studio. הסעיפים הבאים של מדריך זה בוחנים את החלקים הרלוונטיים של הדוגמה, כך שתוכל ליישם אותם על אפליקציות אנדרואיד משלך.

דרישות מערכת

  • Android Studio גרסה 2021.1.1 (Bumblebee) ומעלה.
  • Android SDK גרסה 31 ומעלה
  • מכשיר אנדרואיד עם גרסת מערכת הפעלה מינימלית של SDK 24 (אנדרואיד 7.0 - נוגט) עם מצב מפתח מופעל.

קבל את הקוד לדוגמה

צור עותק מקומי של הקוד לדוגמה. תשתמש בקוד זה כדי ליצור פרויקט ב-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. הפעל את Android Studio .
  2. ב-Android Studio, בחר קובץ > חדש > ייבוא ​​פרויקט .
  3. נווט אל ספריית הקוד לדוגמה המכילה את הקובץ build.gradle ( .../examples/lite/examples/audio_classification/android/build.gradle ) ובחר את הספרייה הזו.

אם תבחר את הספרייה הנכונה, Android Studio יוצר פרויקט חדש ובונה אותו. תהליך זה עשוי להימשך מספר דקות, בהתאם למהירות המחשב שלך ואם השתמשת ב-Android Studio עבור פרויקטים אחרים. כאשר הבנייה מסתיימת, ה-Android Studio מציג הודעת BUILD SUCCESSFUL בחלונית סטטוס Build Output .

להפעלת הפרויקט:

  1. מ-Android Studio, הפעל את הפרויקט על ידי בחירה בהפעלה > הפעל 'אפליקציה' .
  2. בחר מכשיר אנדרואיד מחובר עם מיקרופון כדי לבדוק את האפליקציה.

הסעיפים הבאים מראים לך את השינויים שעליך לבצע בפרויקט הקיים שלך כדי להוסיף את הפונקציונליות הזו לאפליקציה שלך, תוך שימוש באפליקציה לדוגמה זו כנקודת התייחסות.

הוסף תלות בפרויקט

באפליקציה משלך, עליך להוסיף תלות ספציפית בפרויקט כדי להפעיל מודלים של למידה חישובית של 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, סנכרן את התלות בפרויקט על ידי בחירה: קובץ > סנכרן פרויקט עם קבצי Gradle .

אתחול מודל ML

באפליקציית האנדרואיד שלך, עליך לאתחל את מודל הלמידה המכונה 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 הם מודולי תוכנה המאיצים את הביצוע של מודלים של למידת מכונה באמצעות חומרת עיבוד מיוחדת במכשיר נייד, כגון יחידות עיבוד גרפיות (GPU) או יחידות עיבוד טנזור (TPUs). דוגמת הקוד משתמשת ב-NNAPI Delegate כדי לטפל בהאצת החומרה של ביצוע המודל:

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

מומלץ להשתמש בנציגים להפעלת דגמי TensorFlow Lite, אך לא חובה. למידע נוסף על שימוש בנציגים עם TensorFlow Lite, ראה TensorFlow Lite Delegates .

הכן נתונים עבור המודל

באפליקציית Android שלך, הקוד שלך מספק נתונים למודל לצורך פרשנות על ידי הפיכת נתונים קיימים כגון קטעי אודיו לפורמט נתונים של Tensor שניתן לעבד על ידי המודל שלך. הנתונים ב-Tensor שאתה מעביר למודל חייבים להיות בעלי ממדים ספציפיים, או צורה, התואמים את הפורמט של הנתונים המשמשים לאימון המודל.

מודל YAMNet/מסווג ומודלים של פקודות דיבור מותאמות אישית המשמשים בדוגמא קוד זו מקבלים אובייקטי נתונים של Tensor המייצגים קטעי אודיו חד-ערוץ, או מונו, שהוקלטו ב-16kHz בקליפים של 0.975 שניות (15600 דגימות). באמצעות תחזיות על נתוני אודיו חדשים, האפליקציה שלך חייבת להפוך את נתוני האודיו האלה לאובייקטי נתונים של Tensor בגודל ובצורה אלה. TensorFlow Lite Task Library Audio API מטפל בשינוי הנתונים עבורך.

בקוד הדוגמה 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()
      }
    

הפעל תחזיות

באפליקציית האנדרואיד שלך, לאחר שחיברת אובייקט 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)
      ...
    }
    

הפסק את עיבוד החיזוי

ודא שקוד האפליקציה שלך מפסיק לבצע סיווג אודיו כאשר קטע או פעילות עיבוד האודיו של האפליקציה מאבדים מיקוד. להפעלת מודל למידת מכונה באופן רציף יש השפעה משמעותית על חיי הסוללה של מכשיר אנדרואיד. השתמש בשיטת onPause() של הפעילות או הפרגמנט של Android המשויכים לסיווג האודיו כדי לעצור הקלטת אודיו ועיבוד חיזוי.

כדי להפסיק הקלטת אודיו וסיווג:

  • השתמש בשיטת AudioClassificationHelper.stopAudioClassification() כדי לעצור את ההקלטה ואת ביצוע המודל, כפי שמוצג להלן במחלקה AudioFragment :

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

ידית פלט דגם

באפליקציית אנדרואיד שלך, לאחר עיבוד קטע אודיו, המודל מייצר רשימה של תחזיות שקוד האפליקציה שלך חייב לטפל בהן על ידי ביצוע לוגיקה עסקית נוספת, הצגת תוצאות למשתמש או נקיטת פעולות אחרות. הפלט של כל מודל נתון של TensorFlow Lite משתנה במונחים של מספר התחזיות שהוא מייצר (אחת או רבות), והמידע התיאורי עבור כל חיזוי. במקרה של הדגמים באפליקציה לדוגמה, התחזיות הן רשימה של צלילים או מילים מזוהות. האובייקט AudioClassifier options המשמש בדוגמה של הקוד מאפשר לך להגדיר את המספר המרבי של חיזויים בשיטה 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 .