מדריך לזיהוי שפה ב-Android

המשימה 'מזהה שפה של MediaPipe' מאפשרת לך לזהות את השפה של קטע טקסט. בהוראות האלה מוסבר איך להשתמש ב'מזהה השפה' באפליקציות ל-Android. דוגמת הקוד שמתוארת בהוראות האלו זמינה ב-GitHub.

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

קוד לדוגמה

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

הורדת הקוד

בהוראות הבאות מוסבר איך ליצור עותק מקומי של הקוד לדוגמה באמצעות כלי שורת הפקודה git.

כדי להוריד את הקוד לדוגמה:

  1. משכפלים את מאגר ה-Git באמצעות הפקודה הבאה:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. לחלופין, אפשר להגדיר את מכונת ה-Git לשימוש בקופה עם נתונים sparse, כדי שיהיו לכם רק את הקבצים של האפליקציה לדוגמה של Language Detector:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/languagedetector/android
    

במדריך ההגדרה ל-Android תוכלו למצוא הוראות להגדרה ולהפעלה של דוגמה עם Android Studio.

רכיבים עיקריים

הקבצים הבאים מכילים את הקוד החיוני לאפליקציה לדוגמה של סיווג טקסט:

  • LanguageDetectorHelper.kt – מפעיל את מזהה השפה ומטפל בבחירת המודל.
  • ResultsAdapter.kt – טיפול בתוצאות הזיהוי ועיצוב שלהן.
  • MainActivity.kt – יישום האפליקציה, כולל קריאה ל-LanguageDetectorHelper ול-ResultsAdapter.

הגדרה

בקטע הזה מתוארים שלבים עיקריים להגדרה של סביבת הפיתוח ופרויקטים של קוד במיוחד לשימוש ב-Language Detector. במדריך ההגדרה ל-Android תוכלו לקרוא מידע כללי על הגדרת סביבת הפיתוח לשימוש במשימות של MediaPipe, כולל הדרישות לגרסת הפלטפורמה.

יחסי תלות

מזהה השפה משתמש בספריות com.google.mediapipe:tasks-text. מוסיפים את התלות הזאת לקובץ build.gradle של פרויקט פיתוח האפליקציה ל-Android. אפשר לייבא את יחסי התלות הנדרשים באמצעות הקוד הבא:

dependencies {
    implementation 'com.google.mediapipe:tasks-text:latest.release'
}

מודל

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

בוחרים ומורידים את המודל, ולאחר מכן מאחסנים אותו בספריית הפרויקט:

<dev-project-root>/src/main/assets

מציינים את הנתיב של המודל בתוך הפרמטר ModelName.

יצירת המשימה

אפשר להשתמש באחת מהפונקציות של createFrom...() כדי ליצור את המשימה. הפונקציה createFromOptions() מקבלת אפשרויות הגדרה של גלאי השפה. אפשר גם לאתחל את המשימה באמצעות פונקציית היצרן createFromFile(). הפונקציה createFromFile() מקבלת נתיב יחסי או מוחלט לקובץ המודל שעבר אימון. למידע נוסף על הגדרת משימות, קראו את המאמר אפשרויות תצורה.

הקוד הבא מדגים איך ליצור ולהגדיר את המשימה הזו.

// For creating a language detector instance:
LanguageDetectorOptions options =
       LanguageDetectorOptions.builder()
       .setBaseOptions(
          BaseOptions.builder()
            .setModelAssetPath(modelPath)
            .build()
          )
       .build();
LanguageDetector languageDetector = LanguageDetector.createFromOptions(context, options);

כדי לראות דוגמה ליצירת משימה, אתם יכולים לראות את הקוד לדוגמה initDetector() של הפונקציה LanguageDetectorHelper.

אפשרויות הגדרה

המשימה כוללת את אפשרויות ההגדרה הבאות לאפליקציות ל-Android:

שם האפשרות תיאור טווח ערכים ערך ברירת מחדל
maxResults מגדירה את המספר המקסימלי האופציונלי של חיזויי שפה בניקוד הגבוה ביותר להחזרה. אם הערך הזה קטן מאפס, יוחזרו כל התוצאות הזמינות. כל מספר חיובי -1
scoreThreshold השדה הזה מגדיר את סף הציון של החיזוי ששונה מהסף שצוין במטא-נתונים של המודל (אם יש כזה). תוצאות מתחת לערך הזה יידחו. כל מספר ממשי (float) לא הוגדרה
categoryAllowlist מגדיר את הרשימה האופציונלית של קודי שפה מותרים. אם השדה לא ריק, חיזויי שפה שקוד השפה שלהם לא נכלל בקבוצה הזו יסוננו. האפשרות הזו בלעדית ל-categoryDenylist ומשתמשת בשתי התוצאות האלה כשגיאה. כל מחרוזת לא הוגדרה
categoryDenylist מגדיר את הרשימה האופציונלית של קודי שפות שאינם מותרים. אם השדה לא ריק, המערכת תסנן את החיזויים של השפות שקוד השפה שלהם נכלל בקבוצה הזו. האפשרות הזו בלעדית ל-categoryAllowlist, והשימוש בשתי האפשרויות גורם לשגיאה. כל מחרוזת לא הוגדרה

הכנת הנתונים

מזהה השפה פועל עם נתוני טקסט (String). המשימה מטפלת בעיבוד מראש של קלט הנתונים, כולל המרה לאסימונים ועיבוד מראש של tensor. כל העיבוד מראש מתבצע בפונקציה detect(). אין צורך בעיבוד מראש נוסף של טקסט הקלט לפני כן.

String inputText = "Some input text for the language detector";

מריצים את המשימה.

מזהה השפה משתמש בשיטה LanguageDetector.detect() כדי לעבד טקסט קלט ולחזות את שפת הטקסט. כדי לבצע את הזיהוי, צריך להשתמש בשרשור הפעלה נפרד כדי למנוע חסימה של שרשור ממשק המשתמש של Android באפליקציה שלכם.

הקוד הבא מדגים איך לבצע את העיבוד במודל המשימה באמצעות thread ביצוע נפרד.

// Predict the language of the input text.
fun classify(text: String) {
    executor = ScheduledThreadPoolExecutor(1)

    executor.execute {
        val results = languageDetector.detect(text)
        listener.onResult(results)
    }
}

כדי לראות דוגמה להרצת משימה, תוכלו לראות את הקוד לדוגמה detect() של פונקציית LanguageDetectorHelper.

טיפול בתוצאות והצגתן

גלאי השפה מפיק LanguageDetectorResult שמורכב מרשימה של חיזויי שפה, יחד עם ההסתברויות לחיזויים האלה. קטגוריות השפה מוגדרות במודל. בסקירה הכללית של המשימות קטע על Models תוכלו לראות פרטים על המודל שבו אתם משתמשים.

דוגמה לנתוני הפלט מהמשימה הזאת:

LanguageDetectorResult:
  LanguagePrediction #0:
    language_code: "fr"
    probability: 0.999781

התוצאה הזו הושגה על ידי הרצת המודל על טקסט הקלט: "Il y a beaucoup de bouches qui parlent et fort peu de têtes qui pensent.".

תוכלו לראות דוגמה להצגת תוצאות במחלקה ResultsAdapter לדוגמה ובמחלקה הפנימית ViewHolder.