Как определить язык текста с помощью ML Kit на Android

С помощью ML Kit можно определить язык текстовой строки. Вы можете получить наиболее вероятный язык строки, а также оценки достоверности для всех возможных языков строки.

ML Kit распознает текст более чем на 100 языках с использованием их оригинальных алфавитов. Кроме того, распознается текст, написанный латиницей, на арабском, болгарском, греческом, китайском, русском, хинди и японском языках. Ознакомьтесь с полным списком поддерживаемых языков и систем письма.

ПакетныйБез пакета
Название библиотекиcom.google.mlkit:language-idcom.google.android.gms:play-services-mlkit-language-id
РеализацияМодель статически связана с приложением во время сборки.Модель динамически скачивается через сервисы Google Play.
Влияние размера приложенияРазмер увеличится примерно на 900 КБ.Увеличение размера примерно на 200 КБ.
Время инициализацииМодель доступна сразу.Перед первым использованием может потребоваться подождать, пока модель скачается.

Попробовать

Подготовка

  1. В файле build.gradle на уровне проекта добавьте репозиторий Maven от Google в разделы buildscript и allprojects.

  2. Добавьте зависимости для библиотек ML Kit для Android в файл Gradle на уровне приложения, который обычно называется app/build.gradle. Выберите одну из следующих зависимостей в зависимости от ваших потребностей:

    Чтобы встроить модель в приложение:

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

    Для использования модели в сервисах Google Play:

    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. Если вы решите использовать модель в сервисах Google Play, вы можете настроить автоматическую загрузку модели на устройство после установки приложения из Google Play. Для этого добавьте в файл AndroidManifest.xml приложения следующую декларацию:

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

    Вы также можете проверить доступность модели и запросить ее скачивание с помощью ModuleInstallClient API сервисов Google Play.

    Если вы не включите скачивание модели во время установки или не запросите явное скачивание, модель будет скачана при первом запуске идентификатора. Запросы, отправленные до завершения скачивания, не будут обработаны.

Как определить язык строки

Чтобы определить язык строки, вызовите метод LanguageIdentification.getClient(), чтобы получить экземпляр LanguageIdentifier, а затем передайте строку методу identifyLanguage() объекта LanguageIdentifier.

Пример:

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.
                        // ...
                    }
                });

Если вызов будет выполнен успешно, в обработчик успешного выполнения будет передан код языка BCP-47, указывающий на язык текста. Если язык не определен, передается код und (не определен).

По умолчанию ML Kit возвращает значение, отличное от und, только если он определяет язык с уровнем достоверности не менее 0,5. Вы можете изменить это пороговое значение, передав объект LanguageIdentificationOptions в getClient():

Kotlin

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

Java

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

Как определить возможные языки строки

Чтобы получить значения достоверности для наиболее вероятных языков строки, получите экземпляр LanguageIdentifier, а затем передайте строку методу identifyPossibleLanguages().

Пример:

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.
                        // ...
                    }
                });

Если вызов выполнен успешно, прослушивателю успешного выполнения передается список объектов IdentifiedLanguage. Из каждого объекта можно получить код языка по стандарту BCP-47 и уровень уверенности в том, что строка написана на этом языке. Обратите внимание, что эти значения указывают на уверенность в том, что вся строка написана на определенном языке. ML Kit не определяет несколько языков в одной строке.

По умолчанию ML Kit возвращает только языки, для которых уровень достоверности составляет не менее 0,01. Вы можете изменить этот порог, передав объект LanguageIdentificationOptions в getClient():

Kotlin

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

Java

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

Если ни один язык не соответствует этому порогу, список содержит один элемент со значением und.