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

1. מבוא

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

איך זה עובד

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

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

מה תפַתחו

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

בסופו של דבר, התוצאה צריכה להיות דומה לתמונה שלמטה.

e2a9b80f1ff442d7.png

מה תלמדו

  • איך משתמשים ב-ML Kit SDK כדי להוסיף בקלות יכולות של למידת מכונה לכל אפליקציית Android.
  • ממשקי ה-API של ML Kit לזיהוי טקסט, לזיהוי שפה ולתרגום, והיכולות שלהם.
  • איך משתמשים בספריית 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.pngstarter – קוד התחלתי שעליו מתבססים ב-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, אתם מוכנים להפעיל את האפליקציה בפעם הראשונה. בסרגל הכלים של Android Studio, לוחצים על Run (הפעלה) ( execute.png).

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

bd1489441c334de3.png

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

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

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

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

TextAnalyzer.kt

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

init {
   lifecycle.addObserver(detector)
}

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

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

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()
           }
       }
}

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

TextAnalyzer.kt

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

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

עכשיו לוחצים על Run (הפעלה) ( 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
}

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

עכשיו לוחצים על Run (הפעלה) ( 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
   }
}

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

עכשיו לוחצים על Run (הפעלה) ( 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 משלכם.

מידע נוסף