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

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

  • Как использовать SDK ML Kit для простого добавления возможностей машинного обучения в любое приложение 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 Стартовый код — это начальный код, на основе которого вы будете строить дальнейшую работу в этом практическом занятии.

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

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

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

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