تشخیص، شناسایی زبان و ترجمه متن با ML Kit و CameraX: Android

1. مقدمه

ML Kit یک SDK تلفن همراه است که تخصص یادگیری ماشینی Google را در یک بسته قدرتمند و در عین حال با کاربری آسان به برنامه‌های Android و Android می‌آورد. چه در زمینه یادگیری ماشینی تازه کار یا با تجربه باشید، می توانید به راحتی عملکرد مورد نیاز خود را تنها در چند خط کد پیاده سازی کنید. برای شروع نیازی به دانش عمیق شبکه های عصبی یا بهینه سازی مدل نیست.

چگونه کار می کند؟

ML Kit با کنار هم قرار دادن فناوری‌های ML Google، مانند Mobile Vision و TensorFlow Lite در یک SDK، به‌کارگیری تکنیک‌های ML در برنامه‌های شما را آسان می‌کند. چه به قدرت قابلیت‌های بی‌درنگ مدل‌های روی دستگاه موبایل ویژن نیاز داشته باشید، چه به انعطاف‌پذیری مدل‌های سفارشی TensorFlow Lite، ML Kit این کار را تنها با چند خط کد ممکن می‌سازد.

این لبه کد شما را از طریق مراحل ساده برای افزودن تشخیص متن، شناسایی زبان و ترجمه از فید دوربین هم‌زمان به برنامه اندروید موجود خود راهنمایی می‌کند. این کد لبه همچنین بهترین شیوه‌های استفاده از CameraX با APIهای کیت ML را برجسته می‌کند.

آنچه خواهید ساخت

در این کد لبه، شما قصد دارید یک برنامه اندروید با ML Kit بسازید. برنامه شما از ML Kit Text Recognition API روی دستگاه برای تشخیص متن از فید دوربین هم‌زمان استفاده می‌کند. از ML Kit Language Identification API برای شناسایی زبان متن شناسایی شده استفاده می کند. در نهایت، برنامه شما با استفاده از ML Kit Translation API، این متن را به هر زبان انتخابی از میان 59 گزینه ترجمه می کند.

در پایان باید چیزی شبیه به تصویر زیر مشاهده کنید.

e2a9b80f1ff442d7.png

چیزی که یاد خواهید گرفت

  • نحوه استفاده از ML Kit SDK برای افزودن آسان قابلیت‌های یادگیری ماشینی به هر برنامه Android.
  • ML Kit Text Recognition، شناسایی زبان، API های ترجمه و قابلیت های آنها.
  • نحوه استفاده از کتابخانه CameraX با API های ML Kit.

آنچه شما نیاز دارید

  • نسخه اخیر Android Studio (نسخه 4.0+)
  • یک دستگاه اندروید فیزیکی
  • کد نمونه
  • دانش اولیه توسعه اندروید در Kotlin

این Codelab بر روی ML Kit متمرکز شده است. مفاهیم و بلوک های کد غیر مرتبط قبلاً برای شما ارائه و پیاده سازی شده است.

2. راه اندازی

کد را دانلود کنید

برای دانلود تمامی کدهای این کد لبه روی لینک زیر کلیک کنید:

فایل فشرده دانلود شده را باز کنید. با این کار یک پوشه ریشه ( mlkit-android ) با تمام منابعی که نیاز دارید باز می شود. برای این کد لبه، شما فقط به منابع موجود در زیر شاخه translate نیاز دارید.

زیر شاخه translate در مخزن mlkit-android شامل دایرکتوری زیر است:

  • android_studio_folder.png starter - کد شروعی که در این کد لبه بر اساس آن می سازید.

3. پروژه را وارد کنید و وابستگی های ML Kit و CameraX را تأیید کنید

پروژه شروع را به اندروید استودیو وارد کنید. در فایل 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. برنامه استارتر را اجرا کنید

اکنون که پروژه را به اندروید استودیو وارد کرده اید و وابستگی های ML Kit را بررسی کرده اید، برای اولین بار آماده اجرای برنامه هستید! روی Run کلیک کنید ( 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 جریانی از تصاویر را از دوربین آماده برای تجزیه و تحلیل تصویر فراهم می کند. متد 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 برای دریافت زبان متن شناسایی شده از تصویر استفاده کنید.

کد زیر را جایگزین 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 را به برنامه اندروید خود اضافه کنید
  • نحوه استفاده از تشخیص متن روی دستگاه در کیت ML برای تشخیص متن در تصاویر
  • نحوه استفاده از شناسایی زبان روی دستگاه در کیت ML برای شناسایی زبان متن
  • نحوه استفاده از ترجمه روی دستگاه در کیت ML برای ترجمه پویا متن به 59 زبان
  • نحوه استفاده از CameraX در ارتباط با APIهای ML Kit

مراحل بعدی

  • از ML Kit و CameraX در برنامه اندروید خود استفاده کنید!

بیشتر بدانید