Reconhecer, identificar idiomas e traduzir textos com o Kit de ML e o CameraX: Android

1. Introdução

O Kit de ML é um SDK para dispositivos móveis que leva a experiência em aprendizado de máquina do Google para apps Android em um pacote eficiente e fácil de usar. Não importa se você é novo ou experiente em machine learning, é possível implementar a funcionalidade necessária com apenas algumas linhas de código. Não é preciso ter um conhecimento profundo de redes neurais ou otimização de modelos para começar.

Como funciona?

O Kit de ML facilita a aplicação de técnicas de ML nos seus apps ao reunir as tecnologias de ML do Google, como o Mobile Vision e o TensorFlow Lite, em um único SDK. Se você precisa do poder dos recursos em tempo real dos modelos no dispositivo do Mobile Vision ou da flexibilidade dos modelos personalizados do TensorFlow Lite, o kit de ML torna isso possível com apenas algumas linhas de código.

Este codelab vai mostrar etapas simples para adicionar reconhecimento de texto, identificação de idioma e tradução de transmissão da câmera em tempo real ao seu app Android. Ele também vai destacar as práticas recomendadas para usar a CameraX com as APIs do Kit de ML.

O que você criará

Neste codelab, você vai criar um app Android com o Kit de ML. Seu app vai usar a API Kit de ML Text Recognition no dispositivo para reconhecer texto de transmissão da câmera em tempo real. Ele vai usar a API Language Identification do Kit de ML para identificar o idioma do texto reconhecido. Por fim, o app vai traduzir esse texto para qualquer um dos 59 idiomas disponíveis usando a API Translation do Kit de ML.

No final, você vai ver algo parecido com a imagem abaixo.

e2a9b80f1ff442d7.png

O que você vai aprender

  • Como usar o SDK do Kit de ML para adicionar recursos de aprendizado de máquina a qualquer app Android com facilidade.
  • APIs de reconhecimento de texto, identificação de idioma e tradução do Kit de ML e suas funcionalidades.
  • Como usar a biblioteca CameraX com as APIs do Kit de ML.

O que é necessário

  • Uma versão recente do Android Studio (v4.0 ou mais recente)
  • um dispositivo Android físico;
  • Código de amostra
  • Conhecimento básico de desenvolvimento para Android em Kotlin.

Este codelab é focado no Kit de ML. Conceitos e blocos de código sem relevância já foram fornecidos e implementados para você.

2. Etapas da configuração

Fazer o download do código

Clique no link abaixo para fazer o download de todo o código para este codelab:

Descompacte o arquivo ZIP transferido por download. Isso descompacta uma pasta raiz (mlkit-android) com todos os recursos necessários. Neste codelab, você só vai precisar dos recursos no subdiretório translate.

O subdiretório translate no repositório mlkit-android contém o seguinte diretório:

  • android_studio_folder.pngstarter: o código inicial que você vai usar como base neste codelab.

3. Importar o projeto e verificar as dependências do Kit de ML e do CameraX

Importe o projeto inicial para o Android Studio. No arquivo app/build.gradle, verifique se as dependências necessárias do Kit de ML e da CameraX estão incluídas:

// 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. Executar o app inicial

Agora que você importou o projeto para o Android Studio e verificou as dependências do Kit de ML, já pode executar o app pela primeira vez. Clique em Executar ( execute.png) na barra de ferramentas do Android Studio.

O app será iniciado no dispositivo, e você poderá apontar a câmera para vários textos para ver uma transmissão ao vivo. No entanto, a funcionalidade de reconhecimento de texto ainda não foi implementada.

bd1489441c334de3.png

5. Adicionar reconhecimento de texto

Nesta etapa, vamos adicionar funcionalidade ao app para reconhecer texto da câmera de vídeo.

Instanciar o detector de texto do Kit de ML

Substitua o TODO na parte de cima de TextAnalyzer.kt para instanciar TextRecognition. É assim que você recebe um identificador para o reconhecedor de texto, que será usado nas etapas posteriores. Também precisamos adicionar o detector como um observador do ciclo de vida para fechar corretamente o detector quando ele não for mais necessário.

TextAnalyzer.kt

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

init {
   lifecycle.addObserver(detector)
}

Executar o reconhecimento de texto em uma imagem de entrada (criada com buffer da câmera)

A biblioteca CameraX fornece um stream de imagens da câmera pronto para análise. Substitua o método recognizeText() na classe TextAnalyzer para usar o reconhecimento de texto do Kit de ML em cada frame de imagem.

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

A linha a seguir mostra como chamamos o método acima para começar a realizar o reconhecimento de texto. Adicione a seguinte linha ao final do método analyze(). Observe que você precisa chamar imageProxy.close depois que a análise for concluída na imagem. Caso contrário, a transmissão da câmera ao vivo não poderá processar mais imagens para análise.

TextAnalyzer.kt

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

Executar o app no seu dispositivo

Agora clique em Executar ( execute.png) na barra de ferramentas do Android Studio. Depois que o app for carregado, ele vai começar a reconhecer o texto da câmera em tempo real. Aponte a câmera para qualquer texto para confirmar. Se o app não estiver reconhecendo nenhum texto, tente "redefinir" a detecção apontando a câmera para um espaço em branco antes de apontar para o texto.

6. Adicionar identificação de idioma

Instanciar o identificador de idioma do Kit de ML

MainViewModel.kt está localizado na pasta principal. Navegue até o arquivo e adicione o seguinte campo a MainViewModel.kt. Assim, você consegue um identificador de idioma para usar na próxima etapa.

MainViewModel.kt

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

Além disso, você também precisa garantir que os clientes sejam desligados corretamente quando não forem mais necessários. Para fazer isso, substitua o método onCleared() do ViewModel.

MainViewModel.kt

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

Executar a identificação de idioma no dispositivo no texto detectado

Use o identificador de idioma do Kit de ML para saber o idioma do texto detectado na imagem.

Substitua o TODO na definição do campo sourceLang em MainViewModel.kt pelo código a seguir. Este snippet chama o método de identificação de idioma e atribui o resultado se ele não for indefinido ("und"). Um idioma indefinido significa que a API não conseguiu identificar o idioma com base na lista de idiomas compatíveis.

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
}

Executar o app no seu dispositivo

Agora clique em Executar ( execute.png) na barra de ferramentas do Android Studio. Depois que o app for carregado, ele vai começar a reconhecer o texto da câmera e identificar o idioma em tempo real. Aponte a câmera para qualquer texto para confirmar.

7. Adicionar tradução

Substitua a função translate() em MainViewModel.kt pelo código a seguir. Essa função usa o valor do idioma de origem, o valor do idioma de destino e o texto de origem para fazer a tradução. Observe que, se o modelo de linguagem de destino escolhido ainda não tiver sido baixado no dispositivo, chamamos downloadModelIfNeeded() para fazer isso e, em seguida, prosseguimos com a tradução.

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

Executar o app no simulador

Agora clique em Executar ( execute.png) na barra de ferramentas do Android Studio. Depois que o app carregar, ele vai ficar parecido com a imagem em movimento abaixo, mostrando o reconhecimento de texto e os resultados de idioma identificado, além do texto traduzido para o idioma escolhido. Você pode escolher qualquer um dos 59 idiomas.

e2a9b80f1ff442d7.png

8. Parabéns!

Parabéns! Você acabou de adicionar reconhecimento de texto no dispositivo, identificação de idioma e tradução ao seu app usando o Kit de ML. Agora você pode reconhecer o texto e o idioma dele na transmissão da câmera ao vivo e traduzir esse texto para um idioma de sua escolha em tempo real.

O que vimos

  • Como adicionar o Kit de ML ao seu app Android
  • Como usar o reconhecimento de texto no dispositivo no Kit de ML para reconhecer texto em imagens
  • Como usar a identificação de idioma no dispositivo no Kit de ML para identificar o idioma do texto
  • Como usar a tradução no dispositivo do Kit de ML para traduzir texto dinamicamente para 59 idiomas
  • Como usar o CameraX com as APIs do Kit de ML

Próximas etapas

  • Use o Kit de ML e o CameraX no seu próprio app Android.

Saiba mais