זיהוי, זיהוי שפה ותרגום טקסט באמצעות ML Kit ו- CameraX: Android

1. מבוא

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

איך זה עובד

בעזרת ML Kit קל ליישם טכניקות למידת מכונה באפליקציות שלכם באמצעות שילוב של טכנולוגיות למידת מכונה של Google, כמו Mobile Vision ו-TensorFlow Lite, בערכת SDK אחת. בין אם אתם צריכים את העוצמה של יכולות בזמן אמת של הדגמים במכשיר של Mobile Vision, או את הגמישות של דגמי TensorFlow Lite בהתאמה אישית, ערכת ML Kit מאפשרת לכם להשתמש בכמה שורות קוד בלבד.

ה-Codelab הזה ידריך אותך בשלבים פשוטים להוספה של זיהוי טקסט, זיהוי שפה ותרגום מפיד מצלמה בזמן אמת לאפליקציה הקיימת שלך ל-Android. ה-Codelab הזה ידגיש גם שיטות מומלצות לשימוש ב- CameraX עם ממשקי API של ML Kit.

מה תפַתחו

ב-Codelab הזה, אתם עומדים לפתח אפליקציה ל-Android עם ML Kit. האפליקציה תשתמש ב-API לזיהוי טקסט של ML Kit לזיהוי טקסט במכשיר כדי לזהות טקסט מפיד המצלמה בזמן אמת. הוא ישתמש ב-ML Kit Language Identity API כדי לזהות את שפת הטקסט המזוהה. לסיום, האפליקציה תתרגם את הטקסט הזה לכל שפה נבחרת מתוך 59 אפשרויות באמצעות ML Kit Translation API.

בסוף אתם אמורים לראות משהו דומה לתמונה שלמטה.

e2a9b80f1ff442d7.png

מה תלמדו

  • איך משתמשים ב-ML Kit SDK כדי להוסיף בקלות יכולות של למידת מכונה לכל אפליקציה ל-Android.
  • זיהוי טקסט של ערכת ML, זיהוי שפה, ממשקי API לתרגום והיכולות שלהם.
  • איך משתמשים בספריית CameraX עם ממשקי API של ML Kit.

מה צריך להכין

  • גרסה עדכנית של Android Studio (גרסה 4.0 ואילך)
  • מכשיר Android פיזי
  • הקוד לדוגמה
  • ידע בסיסי בפיתוח Android ב-Kotlin

ה-Codelab הזה מתמקד ב-ML Kit. אנחנו כבר מספקים לך מושגים ובלוקים של קוד שלא רלוונטיים בשבילך.

2. בתהליך ההגדרה

להורדת הקוד

כדי להוריד את כל הקוד של Codelab זה, יש ללחוץ על הקישור הבא:

פורקים את קובץ ה-ZIP שהורדתם. הפעולה הזו תגרום לפתיחת תיקיית בסיס (mlkit-android) עם כל המשאבים הדרושים. בשביל ה-Codelab הזה, תצטרכו רק את המשאבים בספריית המשנה translate.

ספריית המשנה translate במאגר mlkit-android מכילה את הספרייה הבאה:

  • android_studio_folder.pngסימן לתחילת פעולה – קוד התחלה שעליו בונים ב-Codelab הזה.

3. ייבוא פרויקט ואימות יחסי התלות של ML Kit ו- CameraX

מייבאים את הפרויקט לתחילת העבודה אל Android Studio. בקובץ app/build.gradle, מוודאים שיחסי התלות הנדרשים של ML Kit ו- CameraX כלולים בקובץ:

// CameraX dependencies
def camerax_version = "1.0.0-beta05"
implementation "androidx.camera:camera-core:${camerax_version}"
implementation "androidx.camera:camera-camera2:${camerax_version}"
implementation "androidx.camera:camera-lifecycle:${camerax_version}"
implementation "androidx.camera:camera-view:1.0.0-alpha12"

// ML Kit dependencies
implementation 'com.google.android.gms:play-services-mlkit-text-recognition:16.0.0'
implementation 'com.google.mlkit:language-id:16.0.0'
implementation 'com.google.mlkit:translate:16.0.0'

4. הפעלת האפליקציה לתחילת פעולה

עכשיו, אחרי שייבאתם את הפרויקט אל Android Studio ובדקתם את יחסי התלות של ML Kit, אתם מוכנים להפעיל את האפליקציה בפעם הראשונה! לוחצים על הפעלה ( execute.png) בסרגל הכלים של Android Studio.

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

bd1489441c334de3.png

5. הוספת זיהוי טקסט

בשלב הזה נוסיף לאפליקציה פונקציונליות לזיהוי טקסט ממצלמת הווידאו.

הפעלה מיידית של גלאי הטקסט של ערכת ML

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

TextAnalyzer.kt

private val detector = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)

init {
   lifecycle.addObserver(detector)
}

הפעלת זיהוי טקסט בתמונת קלט (שנוצרה באמצעות מאגר נתונים זמני מהמצלמה)

ספריית CameraX מספקת שידור של תמונות מהמצלמה שמוכנים לניתוח תמונה. כדי להשתמש בזיהוי טקסט של ML Kit בכל מסגרת תמונה, מחליפים את השיטה recognizeText() במחלקה TextAnalyzer.

TextAnalyzer.kt

private fun recognizeText(
   image: InputImage
): Task<Text> {
   // Pass image to an ML Kit Vision API
   return detector.process(image)
       .addOnSuccessListener { text ->
           // Task completed successfully
           result.value = text.text
       }
       .addOnFailureListener { exception ->
           // Task failed with an exception
           Log.e(TAG, "Text recognition error", exception)
           val message = getErrorMessage(exception)
           message?.let {
               Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
           }
       }
}

השורה הבאה מראה איך אנחנו קוראים לשיטה שלמעלה כדי להתחיל לבצע זיהוי טקסט. מוסיפים את השורה הבאה בסוף ה-method analyze(). לתשומת ליבכם: צריך לבצע קריאה אל imageProxy.close אחרי שהניתוח מסתיים בתמונה, אחרת לא תהיה אפשרות לעבד תמונות נוספות לניתוח הנתונים בפיד השידור החי.

TextAnalyzer.kt

recognizeText(InputImage.fromBitmap(croppedBitmap, 0)).addOnCompleteListener {
   imageProxy.close()
}

הפעלת האפליקציה במכשיר

עכשיו לוחצים על הפעלה ( execute.png) בסרגל הכלים של Android Studio. אחרי שהאפליקציה נטענת, היא אמורה להתחיל לזהות טקסט מהמצלמה בזמן אמת. מכוונים את המצלמה אל טקסט כלשהו כדי לאשר. אם האפליקציה לא מזהה טקסט, אפשר לנסות לבצע 'איפוס' על ידי הפניית המצלמה אל שטח ריק לפני שהיא מפנה את המצלמה לטקסט.

6. הוספת זיהוי שפה

יצירה של מזהה השפה של ML Kit

התיקייה MainViewModel.kt נמצאת בתיקייה הראשית. צריך לעבור לקובץ ולהוסיף את השדה הבא אל MainViewModel.kt. כך מקבלים כינוי למזהה השפה שבו צריך להשתמש בשלב הבא.

MainViewModel.kt

private val languageIdentifier = LanguageIdentification.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)

בנוסף, חשוב לוודא שהלקוחות מושבתים כראוי כשאין בהם יותר צורך. כדי לעשות את זה, צריך לשנות את השיטה onCleared() של ViewModel.

MainViewModel.kt

override fun onCleared() {
   languageIdentifier.close()
   translators.evictAll()
}

הפעלת זיהוי השפה במכשיר בטקסט שזוהה

משתמשים במזהה השפה של ML Kit כדי לקבל את השפה של הטקסט שזוהה מהתמונה.

מחליפים את TODO שבהגדרת השדה sourceLang ב-MainViewModel.kt בקוד הבא. קטע הקוד הזה קורא לשיטת זיהוי השפה ומקצה את התוצאה אם היא לא מוגדרת (und). המשמעות של שפה לא מוגדרת היא שה-API לא הצליח לזהות את השפה על סמך רשימת השפות הנתמכות.

MainViewModel.kt

val sourceLang = Transformations.switchMap(sourceText) { text ->
   val result = MutableLiveData<Language>()
   languageIdentifier.identifyLanguage(text)
       .addOnSuccessListener { languageCode ->
           if (languageCode != "und")
               result.value = Language(languageCode)
       }
   result
}

הפעלת האפליקציה במכשיר

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

7. הוספת תרגום

מחליפים את הפונקציה translate() שב-MainViewModel.kt בקוד הבא. הפונקציה הזו לוקחת את הערך של שפת המקור, את הערך של שפת היעד ואת טקסט המקור ומבצעת את התרגום. חשוב לזכור שאם מודל שפת היעד שנבחר עדיין לא הורד למכשיר, אנחנו קוראים לפונקציה downloadModelIfNeeded() ואז ממשיכים בתרגום.

MainViewModel.kt

private fun translate(): Task<String> {
   val text = sourceText.value
   val source = sourceLang.value
   val target = targetLang.value
   if (modelDownloading.value != false || translating.value != false) {
       return Tasks.forCanceled()
   }
   if (source == null || target == null || text == null || text.isEmpty()) {
       return Tasks.forResult("")
   }
   val sourceLangCode = TranslateLanguage.fromLanguageTag(source.code)
   val targetLangCode = TranslateLanguage.fromLanguageTag(target.code)
   if (sourceLangCode == null || targetLangCode == null) {
       return Tasks.forCanceled()
   }
   val options = TranslatorOptions.Builder()
       .setSourceLanguage(sourceLangCode)
       .setTargetLanguage(targetLangCode)
       .build()
   val translator = translators[options]
   modelDownloading.setValue(true)

   // Register watchdog to unblock long running downloads
   Handler().postDelayed({ modelDownloading.setValue(false) }, 15000)
   modelDownloadTask = translator.downloadModelIfNeeded().addOnCompleteListener {
       modelDownloading.setValue(false)
   }
   translating.value = true
   return modelDownloadTask.onSuccessTask {
       translator.translate(text)
   }.addOnCompleteListener {
       translating.value = false
   }
}

הפעלת האפליקציה בסימולטור

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

e2a9b80f1ff442d7.png

8. מעולה!

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

אילו נושאים דיברנו?

  • איך להוסיף ML Kit לאפליקציה ל-Android
  • איך להשתמש בזיהוי טקסט במכשיר ב-ML Kit כדי לזהות טקסט בתמונות
  • איך משתמשים בזיהוי השפה במכשיר ב-ML Kit כדי לזהות את שפת הטקסט
  • איך להשתמש בתרגום במכשיר ב-ML Kit כדי לתרגם טקסט באופן דינמי ל-59 שפות
  • איך להשתמש ב- CameraX בשילוב עם ממשקי API של ML Kit

השלבים הבאים

  • משתמשים ב-ML Kit וב- CameraX באפליקציה משלכם ל-Android!

מידע נוסף