ML Kit の GenAI Rewriting API を使用すると、ユーザーがチャット メッセージや短いコンテンツを別のスタイルやトーンに変換するのを自動的にサポートできます。
コンテンツの書き換え方法に関する候補は、次のような場合に役立ちます。
- ステークホルダーとのコミュニケーションでよりプロフェッショナルなメッセージを作成するためにメッセージを再構成する
- ソーシャル メディア プラットフォームへの投稿に適したようにメッセージを短くする
- 英語を母国語としないユーザーがメッセージを伝える別の方法を探している場合、メッセージを言い換える
主な機能
ML Kit の GenAI Rewriting API は、短いコンテンツを次のいずれかのスタイルで書き換えることができます。
- 詳述: 入力テキストを拡張して、詳細と説明的な表現を追加します。
- 絵文字を追加して: 入力テキストに関連する絵文字を追加して、より表現力豊かで楽しいものにします。
- 短縮: 入力テキストを短縮し、コア メッセージをそのまま維持します。
- フレンドリー: 入力テキストを書き換えて、会話的なトーンを使用して、よりカジュアルで親しみやすいものにします。
- プロフェッショナル: 入力テキストをよりフォーマルでビジネスライクな表現に書き直し、丁寧なトーンを使用します。
- 言い換え: 元の意味を維持しながら、別の単語と文構造を使用して入力テキストを書き換えます。
リクエストは、少なくとも 1 つの候補を返します。複数の候補が返された場合は、信頼度が低い順に並べ替えられます。
検索結果の例
入力 | 書き換えスタイル | 出力 |
直接お話しする機会はありますか? | プロフェッショナル | 改めてミーティングを設定させていただき、詳しくお話しさせていただくことは可能でしょうか? |
来週の土曜日の夜に、私の自宅でカジュアルな集まりを開催しますので、ぜひご参加ください | 短縮 | 今週の土曜日の夜に、私の家でカジュアルな集まりを開催します。 |
イベントが成功しました | 詳述 | このイベントは、すべての期待を上回る大成功を収め、大きな成果を収めました。 |
近いうちにコーヒーでも飲みに行きましょう | 絵文字を追加 | 近いうちにコーヒーでも飲みに行きましょう ☕ 👋。 |
当日中にレポートを提出する | フレンドリー | 本日中にレポートをお送りいただけますか? |
あの件をできるだけ早くお願いします | プロフェッショナル | ご都合のよいときに、必要な書類をご提出ください。 |
プロジェクトの進捗が遅れている | 言い換え | プロジェクトのタイムラインを調整して元の期限を守る必要がある |
スタートガイド
GenAI Rewriting API の使用を開始するには、プロジェクトのビルドファイルに次の依存関係を追加します。
implementation("com.google.mlkit:genai-rewriting:1.0.0-beta1")
次に、必要なオプションを指定して Rewriter
クライアントをインスタンス化し、必要なオンデバイス モデル機能が利用可能かどうかを確認し(必要に応じてダウンロードします)、入力テキストをリクエストとして準備し、書き換えプロセスを実行して候補を取得し、リソースを解放します。
Kotlin
val textToRewrite = "The event was successful"
// Define task with selected input and output format
val rewriterOptions = RewriterOptions.builder(context)
// OutputType can be one of the following: ELABORATE, EMOJIFY, SHORTEN,
// FRIENDLY, PROFESSIONAL, REPHRASE
.setOutputType(RewriterOptions.OutputType.ELABORATE)
// Refer to RewriterOptions.Language for available languages
.setLanguage(RewriterOptions.Language.ENGLISH)
.build()
val rewriter = Rewriting.getClient(rewriterOptions)
suspend fun prepareAndStartRewrite() {
// Check feature availability, status will be one of the following:
// UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
val featureStatus = rewriter.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.
rewriter.downloadFeature(object : DownloadCallback {
override fun onDownloadStarted(bytesToDownload: Long) { }
override fun onDownloadFailed(e: GenAiException) { }
override fun onDownloadProgress(totalBytesDownloaded: Long) {}
override fun onDownloadCompleted() {
startRewritingRequest(textToRewrite, rewriter)
}
})
} 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
// quickly. However, if Gemini Nano is not already downloaded,
// the download process may take longer.
startRewritingRequest(textToRewrite, rewriter)
} else if (featureStatus == FeatureStatus.AVAILABLE) {
startRewritingRequest(textToRewrite, rewriter)
}
}
suspend fun startRewritingRequest(text: String, rewriter: Rewriter) {
// Create task request
val rewritingRequest = RewritingRequest.builder(text).build()
// Start rewriting 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 rewriteResults =
rewriter.runInference(rewritingRequest).await().results
// You can also start a streaming request
// rewriter.runInference(rewritingRequest) { newText ->
// // Show new text in UI
// }
}
// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
rewriter.close()
Java
String textToRewrite = "The event was successful";
// Define task with required input and output format
RewriterOptions rewriterOptions =
RewriterOptions.builder(context)
// OutputType can be one of the following: ELABORATE,
// EMOJIFY, SHORTEN, FRIENDLY, PROFESSIONAL, REPHRASE
.setOutputType(RewriterOptions.OutputType.ELABORATE)
// Refer to RewriterOptions.Language for available
// languages
.setLanguage(RewriterOptions.Language.ENGLISH)
.build();
Rewriter rewriter = Rewriting.getClient(rewriterOptions);
void prepareAndStartRewrite()
throws ExecutionException, InterruptedException {
// Check feature availability, status will be one of the
// following: UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
try {
int featureStatus = rewriter.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.
rewriter.downloadFeature(
new DownloadCallback() {
@Override
public void onDownloadCompleted() {
startRewritingRequest(textToRewrite, rewriter);
}
@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
// quickly. However, if Gemini Nano is not already downloaded,
// the download process may take longer.
startRewritingRequest(textToRewrite, rewriter);
} else if (featureStatus == FeatureStatus.AVAILABLE) {
startRewritingRequest(textToRewrite, rewriter);
}
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
}
}
void startRewritingRequest(String text, Rewriter rewriter) {
// Create task request
RewritingRequest rewritingRequest =
RewritingRequest.builder(text).build();
try {
// Start rewriting request with non-streaming response
// More than 1 result may be returned. If multiple
// suggestions are returned, results will be sorted by
// descending confidence.
rewriter.runInference(rewritingRequest).get().getResults();
// You can also start a streaming request
// rewriter.runInference(rewritingRequest, 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()
rewriter.close();
サポートされている機能と制限事項
GenAI Rewriting API は、英語、日本語、フランス語、ドイツ語、イタリア語、スペイン語、韓国語をサポートしています。これらの言語は RewriterOptions.Language
で定義されています。入力は 256 トークン未満にする必要があります。
特定の機能構成(RewriterOptions
で指定)の可用性は、特定のデバイスの構成と、デバイスにダウンロードされているモデルによって異なる場合があります。
デベロッパーが目的の API 機能が、リクエストされた RewriterOptions
を持つデバイスでサポートされていることを確認する最も確実な方法は、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 ... が返されました | ネットワーク接続を維持し、数分待ってから再試行します。 |