ハウツー

インテリジェントな Android アプリを構築する: オンデバイス推論

6 分で読了
Caren Chang のプロフィールを表示
Caren Chang デベロッパー リレーション エンジニア

ブログ投稿シリーズ「インテリジェントな Android アプリを構築する」へようこそ。このシリーズでは、基本的な Android アプリをパーソナライズされたインテリジェントエージェントエクスペリエンスに変換します。前回の投稿では、このシリーズ全体で使用するデモアプリ Jetpacker を紹介しました。

今回のブログ投稿では、ML Kit の Prompt APIを使用して Gemini Nano を使用し、インテリジェントなオンデバイス機能を作成する方法について説明します。

インテリジェントなオンデバイス機能の構築とは、データをサーバーに送信せずに、デバイス上でプロンプトとデータを直接処理できることを指します。これにはいくつかのメリットがあります。

  • ユーザーデータはデバイス上でローカルに 処理できるため、ユーザーのプライバシーが保護されます。
  • インターネット接続が不安定な場合や接続されていない場合でも、モデルの機能は信頼性 があります。
  • すべてがユーザーのハードウェアで実行されるため、クラウド推論の追加の費用はかかりません。

オンデバイスのメリットを踏まえ、Jetpacker に追加する 3 つの機能を特定しました。旅行の旅程の要約、費用の管理、音声メモのキャプチャです。

Screenshot 2026-07-02 at 12.57.08 PM.png
Jetpacker のオンデバイス機能: 旅行の旅程の要約、費用の管理、音声メモ

短いテキストの高品質なカスタマイズされた要約

旅程画面では、特定の旅行のすべてのアクティビティの概要をすばやく確認できます。この画面には多くの情報が含まれているため、すぐに情報が多すぎてしまう可能性があります。ユーザーが圧倒されることなく準備できるように、上部に [旅行の準備] セクションを追加できます。

Screenshot_20260702_111934.png
ロマンチックなパリ旅行は、芸術、観光スポット、美味しい食べ物が融合したクラシックなパリの冒険として要約されています。ヒントと便利なフレーズも追加されています。

旅行の旅程を入力して LLM に要約を依頼すると、旅行の簡単な要約と、荷造りのヒントや現地の便利なフレーズを生成できます。これは、オンデバイス モデルの優れたユースケースです。理由は次のとおりです。

  • パフォーマンスと品質: 入力テキストと出力テキストはどちらも比較的短いです。これにより、オンデバイス ソリューションのパフォーマンスと品質は、より強力なクラウドモデルと同等になると予想されます。
  • スケーラビリティ: 推論をオンデバイスに移行することで、クラウド推論のコスト増加を気にすることなく、この機能を数人のユーザーから数百万人のユーザーにスケーリングできます。
  • 低レイテンシと信頼性: オンデバイス推論により低レイテンシが保証され、ユーザーがオフラインの場合でも信頼性の高いエクスペリエンスを提供できます。

オンデバイスで構築するには、モバイル デバイス向けに最適化された Google の最も効率的なモデルである Gemini Nano を使用します。Gemini Nano は数年前に初めて導入され、現在 1 億 4, 000 万台以上のデバイスで実行されています。このモデルの最新バージョンである Gemini Nano 4 は、最近リリースされた Gemma 4 モデルのアーキテクチャ基盤上に構築されており、バッテリーとパフォーマンスの効率を最大限に高めるように最適化されています。

ML Kit の Prompt API を使用すると、Gemini Nano 4 の新しいモデル機能を利用して、オンデバイス機能のプロトタイプを作成できます。旅行の旅程を含むプロンプトを作成し、準備のヒントとともに要約を生成するようにモデルに依頼します。

最適なプロンプトを見つけるには、通常、ある程度の反復が必要であり、AICore アプリはこのプロセスのこのステップに最適です。AICore のデベロッパー プレビュー オプションを選択すると、Gemini Nano 4 などのプレビュー モデルをダウンロードしてプロンプトをテストし、モデルの予想される出力を確認できます。プロンプトを数回繰り返すことで、レスポンスの速度を 13 秒から 2 秒未満に短縮できました。最終的なコード実装とプロンプトについては、こちらをご覧ください。

[ASSET HERE - FILE TOO LARGE ATM]

機密性の高いユーザー入力のローカル処理

次に、ユーザーが旅行をさらに楽しめるように、領収書の整理や予算の計算を手作業で行う必要のないシンプルな費用管理ツールを作成します。

領収書にはクレジット カード番号や住所などの機密情報が含まれている可能性があるため、オンデバイス ソリューションのもう 1 つの優れたユースケースです。オンデバイスを使用すると、ユーザーはクラウドにデータが送信されることなく、個人情報がデバイス上でローカルに処理されることを確信できます。

また、Gemini Nano 4 では、マルチモーダル、特に OCR や視覚データの抽出などの画像理解タスクのモデル機能が改善されているため、領収書から情報を抽出するなどのタスクに最適なソリューションです。

このユースケースでは、プロンプトは領収書の画像を分析し、生成されたタイトル、支出額、費用のカテゴリなどの情報を出力します。モデルが優先形式で情報を出力するように、ML Kit の Structured Output APIを使用して、定義した Kotlin データオブジェクトをシームレスに出力できます。

// implementation("com.google.mlkit:genai-prompt:1.0.0-beta3")
// ksp("com.google.mlkit:genai-schema-compiler:1.0.0-alpha1")

@Generable("Information extracted from an expense receipt")
data class ParsedReceipt(
  @Guide("Generated title for the expense less than 6 words. Based on restaurant or activity name.")
  val title: String,
  @Guide("Total amount of the expense. Look for values at the bottom and words like total or balance due.")
  val amount: Double,
  @Guide("Type of expense", enumValues = ["travel", "food", "shopping", "entertainment", "other"])
  val category: String,
)

val prompt = "Determine if the image is a receipt or expense. 
    If it is NOT a receipt or expense, output the text 'NOT_A_RECEIPT'.
    Otherwise, parse the receipt information."

val request = generateContentRequest(ImagePart(bitmap), TextPart(prompt)) {}
val requestWithStructuredOutput = generateTypedContentRequest(request, ParsedReceipt::class)

// Define the configuration for Gemini Nano 4 E4B preview model  
// When selecting models, you can specify which performance charactertists are most important
//  for your use case. Use ModelPreference.FULL when you want to prioritize reasoning power over speed. 
//  Use ModelPreference.FAST when complex logic is not required and latency is a priority.
val previewFullConfig = generationConfig {
    modelConfig = modelConfig {
        releaseStage = ModelReleaseStage.PREVIEW
        preference = ModelPreference.FULL
    }
}

val geminiNano4BPreviewModel = Generation.getClient(previewFullConfig)
val response = geminiNano4BPreviewModel.generateContent(requestWithStructuredOutput)
val parsedReceipt: ParsedReceipt? = response.candidates.firstOrNull()?.response

マルチモーダル入力

最後に、旅行中に音声メモを記録できるように、完全にオンデバイスの音声メモ機能を作成しましょう。ML Kit の Speech Recognition APIを使用すると、ユーザーは短い音声メモを録音し、自動的にテキストに変換できます。文字変換されたテキストを使用して、ML Kit の Prompt API で、録音された音声メモに関連付けられている旅行アクティビティを特定します。これにより、ユーザーは旅行の旅程をスクロールしながら、旅行を簡単に振り返ることができます。

Screenshot_20260702_115529.png
ローマの休日の旅程には、音声メモの抜粋が表示されます。

ML Kit GenAI Speech Recognition API を使用すると、2 つの異なるモードを使用して、音声コンテンツを完全にオンデバイスでテキストに変換できます。基本モード では、従来のオンデバイス音声認識モデルを使用し、API レベル 31 以降のほとんどの Android デバイスで利用できます。詳細モード では、Gemini Nano を使用して、より幅広い言語をカバーし、品質を向上させます。現在、Google Pixel 10 デバイスでサポートされています。

この機能では、Speech Recognition API と ML Kit GenAI Prompt API を組み合わせます。

// implementation("com.google.mlkit:genai-prompt:1.0.0-beta3")
// implementation("com.google.mlkit:genai-speech-recognition:1.0.0-alpha1")

val tripEvents = ... 

// Set up speech recognition
val speechRecognizerOptions =
    speechRecognizerOptions {
        locale = Locale.US
        preferredMode = SpeechRecognizerOptions.Mode.MODE_ADVANCED
    }
val speechRecognizer: SpeechRecognizer = SpeechRecognition.getClient(speechRecognizerOptions)

suspend fun transcribeVoiceNote(recognizer: SpeechRecognizer) {
    // Display partial text as the user is recording audio
    var partialTextResponse = ""

    // Display the full text once user is finished recording audio
    var transcription = ""

    val request: SpeechRecognizerRequest
        = speechRecognizerRequest { audioSource = AudioSource.fromMic() }
    recognizer.startRecognition(request).collect { response ->
        when (response) {
            is SpeechRecognizerResponse.PartialTextResponse -> {
                partialTextResponse = response.text
            }
            is SpeechRecognizerResponse.FinalTextResponse -> {
                transcription = response.text
                processAndCategorizeVoiceNote(transcription, tripEvents)
            }
        }
    }
}

fun processAndCategorizeVoiceNote(transcribedVoiceNote: String, events: List<Event>) {
    val prompt = "Given the voice note $transcribedVoiceNote
     and the following events for this trip: $events, rewrite this transcription
     to remove filler words. Then, identify which events from the
     list this rewritten transcription matches to."

     // Utilize ML Kit's Prompt API to process voice note and tag it with the relevant trip activities
     Generation.getClient().generateContent(prompt)
}

まとめ

ML Kit の GenAI API を使用して、Gemini Nano を活用し、JetPacker アプリの完全にオンデバイスのインテリジェント機能を開発し、クラウドの追加費用なしでユーザー エクスペリエンスを向上させることができました。

Jetpacker の完全なソースコードについては Github をご覧ください。また、動画 Google の AI を使用してインテリジェントな Android アプリを構築するでは、オンデバイス モデル、クラウドベースの推論、最新のエージェント フレームワークを使用して、インテリジェント機能をアプリに直接統合する方法について詳しく説明しています。

詳細

このブログ投稿シリーズの他の部分をご覧ください。

パート 1: アプリの概要と概要。

パート 2(この投稿): オンデバイス インテリジェンス。ML Kit の生成 AI API と Gemini Nano を詳しく見て、旅程の要約、領収書の解析、ローカル音声処理などのプライバシー重視の機能を作成します。

パート 3: ハイブリッド推論とクラウド推論。Firebase AI Logic を使用して、Google マップやウェブ コンテキストなどの現実世界のデータで LLM の回答をグラウンディングする方法について説明します。

パート 4: システム統合。AppFunctions を使用して Android インテリジェンス システムと統合します。

パート 5(近日公開): アプリ内エージェント ワークフロー。A2UI と ADK を活用したエンドツーエンドの予約アシスタントでアプリを拡張します。

Android 開発についてもっと知りたいですか?Android デベロッパーの YouTubeまたは LinkedInをフォローしてください。

このブログ投稿のすべてのコード スニペットは、次の著作権に関する通知に従っています。

Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0
Written by:
Continue reading