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

۱. مقدمه

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

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

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

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

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

در این آزمایشگاه کد، شما قصد دارید یک برنامه اندروید با ML Kit بسازید. برنامه شما از API تشخیص متن ML Kit روی دستگاه برای تشخیص متن از فید دوربین در لحظه استفاده خواهد کرد. از API شناسایی زبان ML Kit برای شناسایی زبان متن تشخیص داده شده استفاده خواهد کرد. در نهایت، برنامه شما این متن را با استفاده از API ترجمه ML Kit به هر زبان انتخابی از بین ۵۹ زبان موجود ترجمه خواهد کرد.

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

e2a9b80f1ff442d7.png

آنچه یاد خواهید گرفت

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

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

  • نسخه جدید اندروید استودیو (نسخه ۴.۰+)
  • یک دستگاه اندروید فیزیکی
  • کد نمونه
  • آشنایی اولیه با توسعه اندروید با زبان کاتلین

این آزمایشگاه کد بر روی کیت یادگیری ماشین (ML Kit) تمرکز دارد. مفاهیم و بلوک‌های کد نامرتبط از قبل برای شما ارائه و پیاده‌سازی شده‌اند.

۲. راه‌اندازی

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

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

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

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

  • پوشه android_studio.png کد آغازین - کدی که در این آزمایشگاه کد بر اساس آن کدنویسی می‌کنید.

۳. پروژه را وارد کنید و وابستگی‌های 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. Run the starter app

حالا که پروژه را به اندروید استودیو وارد کرده‌اید و وابستگی‌های ML Kit را بررسی کرده‌اید، آماده‌اید تا برنامه را برای اولین بار اجرا کنید! روی Run ( کلیک کنید اجرا.png ) در نوار ابزار اندروید استودیو.

برنامه باید روی دستگاه شما اجرا شود و می‌توانید دوربین را به سمت متن‌های مختلف بگیرید تا یک فید زنده ببینید، اما قابلیت تشخیص متن هنوز پیاده‌سازی نشده است.

bd1489441c334de3.png

۵. تشخیص متن را اضافه کنید

در این مرحله، قابلیتی را به برنامه شما اضافه خواهیم کرد تا متن را از دوربین فیلمبرداری تشخیص دهد.

نمونه‌سازی آشکارساز متن کیت یادگیری ماشین

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

خط زیر نحوه فراخوانی متد فوق برای شروع تشخیص متن را نشان می‌دهد. خط زیر را در انتهای متد analyze() اضافه کنید. توجه داشته باشید که باید imageProxy.close را پس از اتمام تجزیه و تحلیل روی تصویر فراخوانی کنید، در غیر این صورت، دوربین زنده قادر به پردازش تصاویر بیشتر برای تجزیه و تحلیل نخواهد بود.

TextAnalyzer.kt

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

برنامه را روی دستگاه خود اجرا کنید

حالا روی اجرا کلیک کنید ( اجرا.png ) را در نوار ابزار اندروید استودیو وارد کنید. پس از بارگذاری برنامه، باید شروع به شناسایی متن از دوربین به صورت بلادرنگ کند. برای تأیید، دوربین خود را به سمت هر متنی بگیرید. اگر برنامه شما هیچ متنی را شناسایی نمی‌کند، قبل از گرفتن دوربین به سمت متن، با گرفتن دوربین به سمت یک فضای خالی، تشخیص را «بازنشانی» کنید.

۶. اضافه کردن قابلیت شناسایی زبان

Instantiate the ML Kit Language Identifier

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
}

برنامه را روی دستگاه خود اجرا کنید

حالا روی اجرا کلیک کنید ( اجرا.png ) در نوار ابزار اندروید استودیو. پس از بارگذاری برنامه، باید شروع به تشخیص متن از دوربین و شناسایی زبان متن به صورت بلادرنگ کند. برای تأیید، دوربین خود را به سمت هر متنی بگیرید.

۷. اضافه کردن ترجمه

تابع 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
   }
}

اجرای برنامه روی شبیه‌ساز

حالا روی اجرا کلیک کنید ( اجرا.png ) در نوار ابزار اندروید استودیو. پس از بارگذاری برنامه، اکنون باید مانند تصویر متحرک زیر باشد که نتایج تشخیص متن و زبان شناسایی شده و متن ترجمه شده به زبان انتخاب شده را نشان می‌دهد. می‌توانید هر یک از ۵۹ زبان را انتخاب کنید.

e2a9b80f1ff442d7.png

۸. تبریک می‌گویم!

تبریک می‌گویم، شما با استفاده از کیت ML، تشخیص متن روی دستگاه، شناسایی زبان و ترجمه را به برنامه خود اضافه کرده‌اید! اکنون می‌توانید متن و زبان آن را از طریق دوربین زنده تشخیص داده و این متن را به زبانی که انتخاب می‌کنید، به صورت بلادرنگ ترجمه کنید.

آنچه ما پوشش داده‌ایم

  • نحوه اضافه کردن ML Kit به برنامه اندروید شما
  • نحوه استفاده از تشخیص متن روی دستگاه در کیت ML برای تشخیص متن در تصاویر
  • نحوه استفاده از شناسایی زبان روی دستگاه در کیت ML برای شناسایی زبان متن
  • نحوه استفاده از ترجمه روی دستگاه در کیت ML برای ترجمه پویای متن به ۵۹ زبان
  • نحوه استفاده از CameraX همراه با API های ML Kit

مراحل بعدی

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

اطلاعات بیشتر