ML Kit の GenAI Proofreading API を使用すると、ユーザーが短いテキストの文法とスペルを確認できます。
主な機能
- キーボードまたは音声で入力したテキストの校正
- リクエストは、少なくとも 1 つの候補を返します。複数の候補が返された場合は、信頼度の降順で並べ替えられます。
検索結果の例
入力 |
入力タイプ |
出力 |
this is a short msg |
キーボード |
これは短いメッセージです |
プロジェクトはほぼ完了していますが、確認が必要です |
キーボード |
プロジェクトはほぼ完了しているが、確認が必要 |
クマのところで待っていてください。 |
Voice |
バーで会いましょう。 |
スタートガイド
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
で指定)の可用性は、特定のデバイスの構成と、デバイスにダウンロードされているモデルによって異なる場合があります。
デベロッパーが目的の API 機能が、リクエストされた ProofreaderOptions
を持つデバイスでサポートされていることを確認する最も確実な方法は、checkFeatureStatus()
メソッドを呼び出すことです。このメソッドは、実行時にデバイスで利用可能な機能の確定ステータスを提供します。
セットアップに関する一般的な問題
ML Kit の生成 AI 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: Feature ... が失敗し、失敗ステータス 0 とエラー esz: UNAVAILABLE: Unable to resolve host ... が返されました | ネットワーク接続を維持し、数分待ってから再試行します。 |