Reconoce, identifica y traduce texto con ML Kit y CameraX: Android

1. Introducción

ML Kit es un SDK para dispositivos móviles que lleva la experiencia de aprendizaje automático de Google a las apps para Android y Android en un paquete potente y fácil de usar. Independientemente de si eres nuevo o tienes experiencia en el aprendizaje automático, puedes implementar fácilmente la funcionalidad que necesites con solo unas pocas líneas de código. No es necesario que tengas un profundo conocimiento sobre redes neuronales o en optimización de modelos para comenzar.

¿Cómo funciona?

ML Kit facilita la aplicación de técnicas de AA en tus apps incorporando tecnologías de AA de Google, como Mobile Vision y TensorFlow Lite, en un solo SDK. Ya sea que necesites la potencia de las capacidades en tiempo real de los modelos integrados en el dispositivo de Mobile Vision o la flexibilidad de los modelos personalizados de TensorFlow Lite, ML Kit lo hace posible con solo unas pocas líneas de código.

En este codelab, se te guiará por los pasos sencillos para agregar Text Recognition, Language Identification y Translation desde el feed de la cámara en tiempo real a tu app para Android existente. En este codelab, también se destacarán las prácticas recomendadas para usar CameraX con las APIs de ML Kit.

Qué compilarás

En este codelab, compilarás una app para Android con ML Kit. Tu app usará la API de ML Kit Text Recognition on-device para reconocer texto del feed de la cámara en tiempo real. Usará la API de Language Identification de ML Kit para identificar el idioma del texto reconocido. Por último, tu app traducirá este texto a cualquier idioma elegido entre 59 opciones, con la API de Translation de ML Kit.

Al final, deberías ver algo similar a la siguiente imagen.

e2a9b80f1ff442d7.png

Qué aprenderás

  • Cómo usar el SDK de ML Kit para agregar fácilmente capacidades de aprendizaje automático a cualquier app para Android
  • APIs de ML Kit Text Recognition, Language Identification y Translation, y sus capacidades
  • Cómo usar la biblioteca de CameraX con las APIs de ML Kit

Requisitos

  • Una versión reciente de Android Studio (v4.0 o posterior)
  • Un dispositivo Android físico
  • El código de muestra
  • Conocimientos básicos sobre el desarrollo de Android en Kotlin

Este codelab se enfoca en ML Kit. Los conceptos y los bloques de código no relevantes ya se proporcionan y se implementan para ti.

2. Cómo prepararte

Descarga el código

Haz clic en el siguiente vínculo a fin de descargar todo el código de este codelab:

Descomprime el archivo zip descargado. Esto descomprimirá una carpeta raíz (mlkit-android) con todos los recursos que necesitarás. Para este codelab, solo necesitarás los recursos del subdirectorio translate.

El subdirectorio translate del repositorio mlkit-android contiene el siguiente directorio:

  • android_studio_folder.pngstarter: Código inicial que usarás como base para compilar en este codelab

3. Importa el proyecto y verifica las dependencias de ML Kit y CameraX

Importa el proyecto inicial en Android Studio. En el archivo app/build.gradle, verifica que se incluyan las dependencias necesarias de ML Kit y 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. Ejecuta la app de partida

Ahora que importaste el proyecto a Android Studio y verificaste las dependencias de ML Kit, tienes todo listo para ejecutar la app por primera vez. Haz clic en Run ( execute.png) en la barra de herramientas de Android Studio.

La app debería iniciarse en tu dispositivo, y puedes apuntar la cámara a varios textos para ver una transmisión en vivo, pero la función de reconocimiento de texto aún no se implementó.

bd1489441c334de3.png

5. Agrega reconocimiento de texto

En este paso, agregaremos funcionalidad a tu app para que reconozca el texto de la cámara de video.

Crea una instancia del detector de texto de ML Kit

Reemplaza el TODO en la parte superior de TextAnalyzer.kt para crear una instancia de TextRecognition. Así es como obtienes un identificador del reconocedor de texto para usarlo en pasos posteriores. También debemos agregar el detector como observador del ciclo de vida para cerrarlo correctamente cuando ya no sea necesario.

TextAnalyzer.kt

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

init {
   lifecycle.addObserver(detector)
}

Ejecuta el reconocimiento de texto en una imagen de entrada (creada con un búfer de la cámara)

La biblioteca de CameraX proporciona un flujo de imágenes de la cámara listo para el análisis de imágenes. Reemplaza el método recognizeText() en la clase TextAnalyzer para usar el reconocimiento de texto de ML Kit en cada fotograma de la imagen.

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

En la siguiente línea, se muestra cómo llamamos al método anterior para comenzar a realizar el reconocimiento de texto. Agrega la siguiente línea al final del método analyze(). Ten en cuenta que debes llamar a imageProxy.close una vez que se complete el análisis de la imagen. De lo contrario, el feed de la cámara en vivo no podrá procesar más imágenes para el análisis.

TextAnalyzer.kt

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

Ejecuta la app en tu dispositivo

Ahora haz clic en Run ( execute.png) en la barra de herramientas de Android Studio. Una vez que se cargue la app, debería comenzar a reconocer texto de la cámara en tiempo real. Apunta la cámara a cualquier texto para confirmar. Si la app no reconoce ningún texto, intenta "restablecer" la detección apuntando la cámara a un espacio en blanco antes de apuntarla al texto.

6. Cómo agregar la identificación de idiomas

Crea una instancia del identificador de idiomas de ML Kit

MainViewModel.kt se encuentra en la carpeta principal. Navega al archivo y agrega el siguiente campo a MainViewModel.kt. Así es como obtienes un identificador de idioma para usarlo en el siguiente paso.

MainViewModel.kt

private val languageIdentifier = LanguageIdentification.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)

Además, también debes asegurarte de que los clientes se apaguen correctamente cuando ya no sean necesarios. Para ello, anula el método onCleared() de ViewModel.

MainViewModel.kt

override fun onCleared() {
   languageIdentifier.close()
   translators.evictAll()
}

Ejecuta la identificación de idioma integrada en el dispositivo en el texto detectado

Usa el identificador de idioma de ML Kit para obtener el idioma del texto detectado en la imagen.

Reemplaza el TODO en la definición del campo sourceLang en MainViewModel.kt con el siguiente código. Este fragmento llama al método de identificación de idioma y asigna el resultado si no está indefinido ("und"). Un idioma no definido significa que la API no pudo identificar el idioma según la lista de idiomas admitidos.

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
}

Ejecuta la app en tu dispositivo

Ahora haz clic en Run ( execute.png) en la barra de herramientas de Android Studio. Una vez que se cargue la app, debería comenzar a reconocer el texto de la cámara y a identificar el idioma del texto en tiempo real. Apunta la cámara a cualquier texto para confirmar.

7. Agregar traducción

Reemplaza la función translate() en MainViewModel.kt con el siguiente código. Esta función toma el valor del idioma de origen, el valor del idioma de destino y el texto de origen, y realiza la traducción. Ten en cuenta que, si el modelo de idioma de destino elegido aún no se descargó en el dispositivo, llamamos a downloadModelIfNeeded() para hacerlo y, luego, continuamos con la traducción.

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

Cómo ejecutar la app en el simulador

Ahora haz clic en Run ( execute.png) en la barra de herramientas de Android Studio. Una vez que se cargue la app, debería verse como la imagen en movimiento que se muestra a continuación, con los resultados del reconocimiento de texto y el idioma identificado, y el texto traducido al idioma elegido. Puedes elegir cualquiera de los 59 idiomas.

e2a9b80f1ff442d7.png

8. ¡Felicitaciones!

¡Felicitaciones! Acabas de agregar reconocimiento de texto, identificación de idiomas y traducción en el dispositivo a tu app con ML Kit. Ahora puedes reconocer texto y su idioma desde el feed de la cámara en vivo, y traducir este texto al idioma que elijas, todo en tiempo real.

Temas abordados

  • Cómo agregar ML Kit a tu app para Android
  • Cómo usar el reconocimiento de texto en el dispositivo de ML Kit para reconocer texto en imágenes
  • Cómo usar la identificación de idiomas en el dispositivo en ML Kit para identificar el idioma del texto
  • Cómo usar la traducción en el dispositivo en ML Kit para traducir texto de forma dinámica a 59 idiomas
  • Cómo usar CameraX junto con las APIs de ML Kit

Próximos pasos

  • Usa ML Kit y CameraX en tu propia app para Android.

Más información