在 Android 上使用 ML Kit 辨識文字語言

您可以使用 ML Kit 識別字串的語言。您可以取得字串最有可能語言,以及所有可用字串語言的可信度分數。

ML Kit 能以原生指令碼辨識超過 100 種不同語言的文字,此外,羅馬化文字也可以辨識阿拉伯文、保加利亞文、中文、希臘文、北印度文、日文和俄文。請參閱完整清單,瞭解支援的語言和指令碼。

組合未分類
程式庫名稱com.google.mlkit:language-idcom.google.android.gms:play-services-mlkit-language-id
導入方法模型在建構期間會以靜態方式連結至應用程式。模型會透過 Google Play 服務動態下載。
應用程式大小影響大小增加約 900 KB。大小增加約 200 KB。
初始化時間模型可立即使用。可能需要等待模型下載完成才能開始使用。

立即體驗

事前準備

  1. 在專案層級的 build.gradle 檔案中,請務必在 buildscriptallprojects 區段中加入 Google 的 Maven 存放區。

  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.5'
    }
    

    在 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 服務中使用模型,可以設定應用程式在從 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>
    

    您也可以明確確認模型的可用性,並透過 Google Play 服務 ModuleInstallClient API 要求下載。

    如未啟用安裝期間模型下載功能或要求明確下載,系統會在您首次執行 ID 時下載模型。在下載完成之前提出的要求不會產生任何結果。

認識字串的語言

如要識別字串的語言,請呼叫 LanguageIdentification.getClient() 取得 LanguageIdentifier 的例項,然後將字串傳送至 LanguageIdentifieridentifyLanguage() 方法。

例如:

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 識別出信心值至少為 0.5 的語言時,才會傳回 und 以外的值。只要將 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