Identificar o idioma do texto com o Kit de ML no Android

É possível usar o Kit de ML para identificar o idioma de uma string de texto. Você pode obter o idioma mais provável da string, bem como pontuações de confiança para todas as os idiomas possíveis da string.

O Kit de ML reconhece texto em mais de 100 idiomas diferentes nos scripts nativos. Além disso, o texto romanizado pode ser reconhecido em árabe, búlgaro, chinês, grego, hindi, japonês e russo. Consulte a lista completa de linguagens e scripts compatíveis.

AgrupadasDesagrupado
Nome da bibliotecacom.google.mlkit:language-idcom.google.android.gms:play-services-mlkit-language-id
ImplementaçãoO modelo é vinculado estaticamente ao app no tempo de build.O download do modelo é feito dinamicamente pelo Google Play Services.
Impacto no tamanho do appAumento de cerca de 900 KB.Aumento de cerca de 200 KB.
Horário de inicializaçãoO modelo está disponível imediatamente.Talvez seja necessário aguardar o download do modelo para usar o modelo pela primeira vez.

Faça um teste

Antes de começar

  1. No arquivo build.gradle no nível do projeto, inclua a propriedade repositório Maven nas seções buildscript e allprojects.

  2. Adicione as dependências das bibliotecas do Android do Kit de ML ao arquivo arquivo do Gradle no nível do app, que geralmente é app/build.gradle. Escolha uma destas opções: as seguintes dependências com base nas suas necessidades:

    Para agrupar o modelo e o app:

    dependencies {
      // ...
      // Use this dependency to bundle the model with your app
      implementation 'com.google.mlkit:language-id:17.0.5'
    }
    

    Para usar o modelo no Google Play Services:

    dependencies {
      // ...
      // Use this dependency to use the dynamically downloaded model in Google Play Services
      implementation 'com.google.android.gms:play-services-mlkit-language-id:17.0.0'
    }
    
  3. Se você optar por usar o modelo no Google Play Services, poderá configurar que o app faça o download automático do modelo para o dispositivo depois que ele for instalado pela Play Store. Para isso, adicione a seguinte declaração ao arquivo arquivo AndroidManifest.xml do seu app:

    <application ...>
          ...
          <meta-data
              android:name="com.google.mlkit.vision.DEPENDENCIES"
              android:value="langid" >
          <!-- To use multiple models: android:value="langid,model2,model3" -->
    </application>
    

    Também é possível verificar explicitamente a disponibilidade do modelo e solicitar o download pelo API ModuleInstallClient do Google Play Services.

    Se você não ativar os downloads do modelo de tempo de instalação ou solicitar o download explícito, o download do modelo é feito na primeira vez que você executa o identificador. Solicitações feitas por você antes da conclusão do download não produzem resultados.

Identificar o idioma de uma string

Para identificar o idioma de uma string, chame LanguageIdentification.getClient() para acesse uma instância de LanguageIdentifier e depois transmita a string para o Método identifyLanguage() de LanguageIdentifier.

Exemplo:

Kotlin

val languageIdentifier = LanguageIdentification.getClient()
languageIdentifier.identifyLanguage(text)
        .addOnSuccessListener { languageCode ->
            if (languageCode == "und") {
                Log.i(TAG, "Can't identify language.")
            } else {
                Log.i(TAG, "Language: $languageCode")
            }
        }
        .addOnFailureListener {
            // Model couldn’t be loaded or other internal error.
            // ...
        }

Java

LanguageIdentifier languageIdentifier =
        LanguageIdentification.getClient();
languageIdentifier.identifyLanguage(text)
        .addOnSuccessListener(
                new OnSuccessListener<String>() {
                    @Override
                    public void onSuccess(@Nullable String languageCode) {
                        if (languageCode.equals("und")) {
                            Log.i(TAG, "Can't identify language.");
                        } else {
                            Log.i(TAG, "Language: " + languageCode);
                        }
                    }
                })
        .addOnFailureListener(
                new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        // Model couldn’t be loaded or other internal error.
                        // ...
                    }
                });

Se a chamada for bem-sucedida, uma O código de idioma BCP-47 é transmitido para o listener de êxito, indicando o idioma do texto. Em caso negativo se o idioma for detectado com confiança, und (indeterminado) é transmitido.

Por padrão, o Kit de ML retorna um valor diferente de und somente quando identifica a linguagem com um nível de confiança de pelo menos 0,5. É possível mudar isso limite transmitindo um objeto LanguageIdentificationOptions para getClient():

Kotlin

val languageIdentifier = LanguageIdentification
        .getClient(LanguageIdentificationOptions.Builder()
                .setConfidenceThreshold(0.34f)
                .build())

Java

LanguageIdentifier languageIdentifier = LanguageIdentification.getClient(
        new LanguageIdentificationOptions.Builder()
                .setConfidenceThreshold(0.34f)
                .build());

Encontrar os idiomas possíveis de uma string

Para obter os valores de confiança dos idiomas mais prováveis de uma string, adquira uma instância de LanguageIdentifier e, em seguida, transmita a string para o identifyPossibleLanguages().

Exemplo:

Kotlin

val languageIdentifier = LanguageIdentification.getClient()
languageIdentifier.identifyPossibleLanguages(text)
        .addOnSuccessListener { identifiedLanguages ->
            for (identifiedLanguage in identifiedLanguages) {
                val language = identifiedLanguage.languageTag
                val confidence = identifiedLanguage.confidence
                Log.i(TAG, "$language $confidence")
            }
        }
        .addOnFailureListener {
            // Model couldn’t be loaded or other internal error.
            // ...
        }

Java

LanguageIdentifier languageIdentifier =
        LanguageIdentification.getClient();
languageIdentifier.identifyPossibleLanguages(text)
        .addOnSuccessListener(new OnSuccessListener<List<IdentifiedLanguage>>() {
            @Override
            public void onSuccess(List<IdentifiedLanguage> identifiedLanguages) {
                for (IdentifiedLanguage identifiedLanguage : identifiedLanguages) {
                    String language = identifiedLanguage.getLanguageTag();
                    float confidence = identifiedLanguage.getConfidence();
                    Log.i(TAG, language + " (" + confidence + ")");
                }
            }
        })
        .addOnFailureListener(
                new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        // Model couldn’t be loaded or other internal error.
                        // ...
                    }
                });

Se a chamada for bem-sucedida, uma lista de objetos IdentifiedLanguage será transmitida à listener de sucesso. Em cada objeto, é possível receber o código BCP-47 do idioma e o nível de confiança de que a string está no idioma em questão. Observe que esses valores indicam a confiança de que toda a string no objeto idioma; O Kit de ML não identifica vários idiomas em uma única string.

Por padrão, o Kit de ML retorna apenas idiomas com valores de confiança de pelo menos 0,01. Você pode alterar esse limite passando um LanguageIdentificationOptions para getClient():

Kotlin

val languageIdentifier = LanguageIdentification
      .getClient(LanguageIdentificationOptions.Builder()
              .setConfidenceThreshold(0.5f)
              .build())

Java

LanguageIdentifier languageIdentifier = LanguageIdentification.getClient(
      new LanguageIdentificationOptions.Builder()
              .setConfidenceThreshold(0.5f)
              .build());

Se nenhum idioma atingir esse limite, a lista terá um item com o valor und