GenAI Proofreading API

ML Kit の GenAI 校正 API を使用すると、短いテキストの文法やスペルをチェックできます。

主な機能

  • キーボードまたは音声で入力されたテキストを校正する
  • リクエストは少なくとも 1 つの提案を返します。複数の候補が返された場合、結果は信頼度の降順で並べ替えられます。

検索結果の例

入力

入力タイプ

出力

これは短いメッセージです

キーボード

これは短いメッセージです

プロジェクトはほぼ完了していますが、レビューが必要です

キーボード

プロジェクトはほぼ完了していますが、レビューが必要です

クマのところで会おう。

音声

バーでお待ちしております。

スタートガイド

GenAI Proofreading API を使用するには、プロジェクトのビルドファイルに次の依存関係を追加します。

implementation("com.google.mlkit:genai-proofreading:1.0.0-beta1")

次に、特定の言語と入力タイプの設定で Proofreader クライアントを構成して取得します。必要なオンデバイス モデルの機能が利用可能であることを確認します(必要に応じてダウンロードをトリガーします)。分析するテキストを ProofreadingRequest で送信し、校正推論を実行して、最後に返されたテキスト修正候補を処理します。

Kotlin

val textToProofread = "The praject is compleet but needs too be reviewd"

// Define task with required input and output format
val options = ProofreaderOptions.builder(context)
    // InputType can be KEYBOARD or VOICE. VOICE indicates that
    // the user generated text based on audio input.
    .setInputType(ProofreaderOptions.InputType.KEYBOARD)
    // Refer to ProofreaderOptions.Language for available
    // languages
    .setLanguage(ProofreaderOptions.Language.ENGLISH)
    .build()
val proofreader = Proofreading.getClient(options)

suspend fun prepareAndStartProofread() {
    // Check feature availability, status will be one of the
    // following: UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
    val featureStatus = proofreader.checkFeatureStatus().await()

    if (featureStatus == FeatureStatus.DOWNLOADABLE) {
        // Download feature if necessary.
        // If downloadFeature is not called, the first inference
        // request will also trigger the feature to be downloaded
        // if it's not already downloaded.
        proofreader.downloadFeature(object : DownloadCallback {
            override fun onDownloadStarted(bytesToDownload: Long) { }

            override fun onDownloadFailed(e: GenAiException) { }

            override fun onDownloadProgress(
                totalBytesDownloaded: Long
            ) {}

            override fun onDownloadCompleted() {
                startProofreadingRequest(textToProofread, proofreader)
            }
        })
    } else if (featureStatus == FeatureStatus.DOWNLOADING) {
        // Inference request will automatically run once feature is
        // downloaded.
        // If Gemini Nano is already downloaded on the device, the
        // feature-specific LoRA adapter model will be downloaded
        // very quickly. However, if Gemini Nano is not already
        // downloaded, the download process may take longer.
        startProofreadingRequest(textToProofread, proofreader)
    } else if (featureStatus == FeatureStatus.AVAILABLE) {
        startProofreadingRequest(textToProofread, proofreader)
    }
}

suspend fun startProofreadingRequest(
    text: String, proofreader: Proofreader
) {
    // Create task request
    val proofreadingRequest =
        ProofreadingRequest.builder(text).build()

    // Start proofreading request with non-streaming response
    // More than 1 result may be returned. If multiple suggestions
    // are returned, results will be sorted by descending confidence.
    val proofreadingResults =
        proofreader.runInference(proofreadingRequest).await().results

    // You can also start a streaming request
    // proofreader.runInference(proofreadingRequest) { newText ->
    //     // show new text in UI
    // }
}

// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
proofreader.close()

Java

String textToProofread = "The praject is compleet but needs too be reviewd";

// Define task with required input and output format
ProofreaderOptions proofreaderOptions = 
    ProofreaderOptions
        .builder(context)
        // InputType can be KEYBOARD or VOICE. VOICE indicates that the
        // user generated text based on audio input.
        .setInputType(ProofreaderOptions.InputType.KEYBOARD)
        // Refer to ProofreaderOptions.Language for available languages
        .setLanguage(ProofreaderOptions.Language.ENGLISH)
        .build();
Proofreader proofreader = Proofreading.getClient(proofreaderOptions);

void prepareAndStartProofread(Context context) throws ExecutionException,
        InterruptedException {
    // Check feature availability, status will be one of the following:
    // UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
    try {
        int featureStatus = proofreader.checkFeatureStatus().get();
        if (featureStatus == FeatureStatus.DOWNLOADABLE) {
            // Download feature if necessary.
            // If downloadFeature is not called, the first inference request
            // will also trigger the feature to be downloaded if it's not
            // already downloaded.
            proofreader.downloadFeature(new DownloadCallback() {
                @Override
                public void onDownloadCompleted() {
                    startProofreadingRequest(textToProofread, proofreader);
                }

                @Override
                public void onDownloadFailed(GenAiException e) {
                }

                @Override
                public void onDownloadProgress(long totalBytesDownloaded) {
                }

                @Override
                public void onDownloadStarted(long bytesDownloaded) {
                }
            });
        } else if (featureStatus == FeatureStatus.DOWNLOADING) {
            // Inference request will automatically run once feature is
            // downloaded.
            // If Gemini Nano is already downloaded on the device, the
            // feature-specific LoRA adapter model will be downloaded
            // very quickly. However, if Gemini Nano is not already
            // downloaded, the download process may take longer.
            startProofreadingRequest(textToProofread, proofreader);
        } else if (featureStatus == FeatureStatus.AVAILABLE) {
            startProofreadingRequest(textToProofread, proofreader);
        }
    } catch (ExecutionException | InterruptedException e) {
        e.printStackTrace();
    }
}

void startProofreadingRequest(String text, Proofreader proofreader) {
    // Create task request
    ProofreadingRequest proofreadingRequest = ProofreadingRequest
            .builder(text).build();

    try {
        // Start proofreading request with non-streaming response
        // More than 1 result may be returned. If multiple suggestions are
        // returned, results will be sorted by descending confidence.
        proofreader.runInference(proofreadingRequest).get().getResults();

        // You can also start a streaming request
        // proofreader.runInference(proofreadingRequest, newText -> {
        //     // Show new text in UI
        // });
    } catch (ExecutionException | InterruptedException e) {
        e.printStackTrace();
    }
}

// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
proofreader.close();

モデルがさまざまな入力タイプを処理する方法

ユーザーがテキストを入力した方法(キーボードまたは音声)に関する情報がモデルに多いほど、発生する可能性のあるエラーの種類をより正確に予測できます。キーボード入力のテキストは、近くのキーのスペルミスが発生しやすく、音声入力のテキストは、発音が同じ単語のスペルミスが発生しやすくなります。

サポートされている機能と制限事項

校正は、英語、日本語、フランス語、ドイツ語、イタリア語、スペイン語、韓国語でサポートされており、ProofreaderOptions.Language で定義されています。入力は 256 トークン未満にする必要があります。

特定の機能構成(ProofreaderOptions で指定)の利用可能性は、特定のデバイスの構成と、デバイスにダウンロードされたモデルによって異なる場合があります。

デベロッパーが、リクエストされた ProofreaderOptions を備えたデバイスで目的の API 機能がサポートされていることを確認する最も確実な方法は、checkFeatureStatus() メソッドを呼び出すことです。このメソッドは、実行時のデバイスでの機能の利用可能性に関する最終的なステータスを提供します。

セットアップに関する一般的な問題

ML Kit GenAI API は、Android AICore アプリを使用して Gemini Nano にアクセスします。デバイスのセットアップ直後(リセット後を含む)や、AICore アプリのリセット直後(データの消去、アンインストール後の再インストールなど)は、AICore アプリが初期化(サーバーからの最新の構成のダウンロードなど)を完了するのに十分な時間がないことがあります。そのため、ML Kit GenAI API が想定どおりに機能しない可能性があります。表示される可能性のある一般的な設定エラー メッセージとその対処方法は次のとおりです。

エラー メッセージの例 対応方法
AICore がエラータイプ 4-CONNECTION_ERROR とエラーコード 601-BINDING_FAILURE で失敗しました。AICore サービスをバインドできませんでした。 この問題は、デバイスのセットアップ直後に ML Kit GenAI API を使用してアプリをインストールした場合や、アプリのインストール後に AICore がアンインストールされた場合に発生する可能性があります。AICore アプリを更新してからアプリを再インストールすると、問題が解決します。
AICore がエラータイプ 3-PREPARATION_ERROR とエラーコード 606-FEATURE_NOT_FOUND で失敗しました。機能 ... は利用できません。 これは、AICore が最新の構成のダウンロードを完了していない場合に発生する可能性があります。デバイスがインターネットに接続されている場合、通常は数分から数時間で更新が完了します。デバイスを再起動すると、更新を速めることができます。

デバイスのブートローダーがロック解除されている場合も、このエラーが表示されます。この API は、ブートローダーがロック解除されているデバイスをサポートしていません。
AICore がエラータイプ 1(DOWNLOAD_ERROR)とエラーコード 0(UNKNOWN)で失敗しました。機能 ... が失敗ステータス 0 とエラー esz(UNAVAILABLE: Unable to resolve host ...)で失敗しました。 ネットワーク接続を維持し、数分待ってから再試行します。