Распознавайте, идентифицируйте язык и переводите текст с помощью 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 сделает это возможным с помощью всего лишь нескольких строк кода.

Эта лаборатория кода проведет вас через простые шаги по добавлению функций распознавания текста, идентификации языка и перевода из видео с камеры в реальном времени в существующее приложение для Android. В этой лаборатории кода также будут представлены лучшие практики использования CameraX с API-интерфейсами ML Kit.

Что вы построите

В этой лаборатории кода вы собираетесь создать приложение для Android с помощью ML Kit. Ваше приложение будет использовать встроенный API распознавания текста ML Kit для распознавания текста из видео с камеры в реальном времени. Он будет использовать API идентификации языка ML Kit для определения языка распознанного текста. Наконец, ваше приложение переведет этот текст на любой выбранный язык из 59 вариантов, используя API перевода ML Kit.

В итоге вы должны увидеть что-то похожее на изображение ниже.

e2a9b80f1ff442d7.png

Что вы узнаете

  • Как использовать ML Kit SDK, чтобы легко добавить возможности машинного обучения в любое приложение Android.
  • Распознавание текста, идентификация языка, API-интерфейсы перевода и их возможности ML Kit.
  • Как использовать библиотеку CameraX с API-интерфейсами ML Kit.

Что вам понадобится

  • Последняя версия Android Studio (v4.0+).
  • Физическое устройство Android
  • Пример кода
  • Базовые знания разработки Android на Kotlin.

Эта лаборатория ориентирована на ML Kit. Нерелевантные концепции и блоки кода уже предоставлены и реализованы для вас.

2. Приступаем к настройке

Загрузите код

Щелкните следующую ссылку, чтобы загрузить весь код для этой лаборатории кода:

Распакуйте загруженный zip-файл. Это распакует корневую папку ( mlkit-android ) со всеми необходимыми вам ресурсами. Для этой лаборатории вам понадобятся только ресурсы в подкаталоге translate .

Подкаталог translate в репозитории mlkit-android содержит следующий каталог:

  • android_studio_folder.png starter — Начальный код, на основе которого вы работаете в этой лаборатории кода.

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, вы готовы запустить приложение в первый раз! Нажмите «Выполнить» ( выполнить.png ) на панели инструментов Android Studio.

Приложение должно запуститься на вашем устройстве, и вы можете навести камеру на различный текст, чтобы увидеть прямую трансляцию, но функция распознавания текста еще не реализована.

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

Запустите приложение на своем устройстве

Теперь нажмите «Выполнить» ( выполнить.png ) на панели инструментов Android Studio. Как только приложение загрузится, оно должно начать распознавать текст с камеры в режиме реального времени. Наведите камеру на любой текст для подтверждения. Если ваше приложение не распознает какой-либо текст, попробуйте «сбросить» обнаружение, наведя камеру на пустое место, прежде чем наводить камеру на текст.

6. Добавьте идентификацию языка

Создание экземпляра идентификатора языка комплекта ML

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
}

Запустите приложение на своем устройстве

Теперь нажмите «Выполнить» ( выполнить.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
   }
}

Запустите приложение на симуляторе

Теперь нажмите «Выполнить» ( выполнить.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!

Узнать больше