Android XR、Geospatial API、Gemini を使用して複合現実ツアーガイドを構築する

所要時間: 7 分

今年の Google I/O で、空間エクスペリエンスのアップデートを発表しました。Geospatial APIARCore for Jetpack XR のプレビュー版として利用できるようになりました。Android XR は、Google の Visual Positioning System(VPS)を搭載することで、対応エリアでデジタル コンテンツを現実世界に 1 メートル未満の精度で固定し、正確な向きを認識できるようにします。*Geospatial API で何ができるかを探るため、Google のチームは XR Geospatial Tour というデモを構築しました。

新しい街に足を踏み入れ、有線 XR グラス(近日公開予定の XREAL Project Aura など)をかけると、すぐに知識豊富な地元のガイドが案内してくれることを想像してみてください。2D 地図を見下ろす必要はありません。3D モデルが優しく道を案内し、目の前にある歴史的なランドマークについてインテリジェントな音声で教えてくれます。Geospatial APIFirebase AI Logic を使用した Gemini APIGoogle マップのグラウンディングJetpack XR SDK を組み合わせて、ハンズフリーで没入感のあるウォーキング ツアー体験を実現しました。

 

 

免責事項: 動画とツアーガイドのアプリケーションはデモ用です。一部のシーケンスは短縮されています。図に示されているハードウェアは開発中のものであり、最終的な製品の詳細は異なる場合があります。

実装の詳細を説明し、これらの API を組み合わせて世界規模の空間エクスペリエンスを構築する方法を紹介します。

1. ARCore Geospatial API(VPS)でユーザーの位置を特定する

GPS の機能と VPS の精度を組み合わせることで、XR でのナビゲーション エクスペリエンスを向上させます。VPS の精度と正確な向きにより、3D ウェイポイントを現実世界に合わせることができます。

Android XR の Geospatial API は、カスタム エクスペリエンスの構築に役立ちます。VPS は、高度なコンピュータ ビジョンを使用して、GPS よりも正確な GeospatialPose(緯度、経度、方位を含む)を提供しようとします。

デバイスの向きを地理空間座標にマッピングして、ユーザーの地理空間ポーズを取得する方法は次のとおりです。

// Retrieve the current geospatial pose from the ARCore session
val result = geospatial.createGeospatialPoseFromPose(arDevice.state.value.devicePose)
if (result is CreateGeospatialPoseFromPoseSuccess) {
    val pose = result.pose
    Log.d("VPS", "Accurate Location: ${pose.latitude}, ${pose.longitude}")
}

この精度がエクスペリエンス全体に影響するため、horizontalAccuracyorientationYawAccuracy がしきい値に達するまでモニタリングします。ユーザーが屋内または認識できない場所にいる場合は、「屋外の公共スペースに移動して周囲を見渡す」よう促します。

2. Gemini API と Google マップのグラウンディングによる旅程の作成

位置情報を取得したら、Firebase AI Logic を使用した Gemini API を使用して、Gemini モデルにローカル ツアーガイドとして機能するよう指示します。ユーザーの座標をモデルに渡し、近くのウォーキング ツアーを含む構造化された JSON レスポンスを出力するようにリクエストします。

   val configForTools = ToolConfig(
      functionCallingConfig = null,
      retrievalConfig = retrievalConfig {
        latLng = FirebaseLatLng(pose.latitude, pose.longitude)
        languageCode = "en"
      }
    )

    val responseJsonSchema = Schema.obj(
      mapOf(
        "locationIntro" to Schema.string(),
        "tours" to Schema.array(
          Schema.obj(
            mapOf(
              "title" to Schema.string(),
              "description" to Schema.string(),
              "stops" to Schema.array(
                Schema.obj(
                  mapOf(
                    "name" to Schema.string(),
                    "detailedName" to Schema.string(),
                    "description" to Schema.string()
                  )
                )
              )
            )
          )
        )
      )
    )

    val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel(
      modelName = "gemini-3.5-flash",
      tools = listOf(Tool.googleMaps()),
      generationConfig = generationConfig {
        responseMimeType = "application/json"
        responseSchema = responseJsonSchema
      }
    )

   val result = model.generateContent("The user is at latitude ${pose.latitude} and longitude ${pose.longitude}. Generate exactly 3 diverse tours near this location (e.g., historical, food, nature). All tour ideas should be walking distance only.")

大規模言語モデルは、詳細な説明を生成することに優れていますが、正確な緯度と経度の座標をハルシネーションすることがあります。この問題を解決するために、Google Maps Grounding を使用して AI をグラウンディングしました。

3. あなたを導く声: Gemini 2.5 TTS

ツアーガイドが本当にそこにいるように感じられるよう、動的なナレーションを実装しました。

gemini-2.5-flash-tts model を使用すると、テキストだけでなく音声データをネイティブに返すようにモデル生成構成を構成できます。ResponseModality.AUDIO をリクエストする方法は次のとおりです。

val ttsModel = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "gemini-2.5-flash-tts",
        generationConfig = generationConfig {
            // Instruct the model to return Audio
            responseModalities = listOf(ResponseModality.AUDIO)
        }
    )

val response = ttsModel.generateContent("Say in a neutral but positive voice:\n$prompt")

// Extract the raw audio bytes from the response
val audioBytes = response.candidates.firstOrNull()?.content?.parts
    ?.filterIsInstance<InlineDataPart>()
    ?.firstOrNull { it.mimeType.contains("audio") }?.inlineData

4. Jetpack XR で 3D を実現する

パズルの最後のピースは、このデータをユーザーの視野にレンダリングすることです。Jetpack XR SDK を使用すると、2D Android UI から空間コンピューティングへの移行を直感的に行うことができます。

Jetpack Compose for XR を使用して空間コンポーネントを構築しました。ツアーに沿って POI を表示するために、InfoSphere という Composable を作成しました。これには、空間に浮かぶ 3D オーブの GltfModel が含まれており、操作して情報を表示できます。

Jetpack XR SDK を使用すると、SpatialBoxSceneCoreEntity を使用して、Compose UI と並べて 3D モデルを配置できます。また、InteractableComponent を使用して、ユーザーのタップに応答しました。

従来の Compose UI サーフェスの AnimatedSpatialVisibility と SceneCoreEntity 3D 要素を組み合わせることで、データを現実世界にシームレスにブレンドできます。

@Composable
fun InfoSphere(
    content: InfoBubbleContent,
    session: Session,
    sphereModel: GltfModel,
    isSelected: Boolean,
    onClick: () -> Unit
) {
    // SpatialBox lets us arrange 3D components and SpatialPanels together
    SpatialBox(
        SubspaceModifier
            .offset(x = 2.dp, y = 1.dp, z = (-3).dp) // Positioned in 3D space
    ) {
        // Smoothly animate the visibility of our 2D Compose UI Panel
        AnimatedSpatialVisibility(visible = isSelected) {
            SpatialPanel {
                InfoBubble(content) // Regular 2D Compose UI
            }
        }
        // Render our interactive 3D sphere
        SceneCoreEntity(
            factory = {
                GltfModelEntity.create(session, sphereModel).also { entity ->
                    // Make the 3D model respond to user taps
                    entity.addComponent(InteractableComponent.create(session) { inputEvent ->
                        if (inputEvent.action == InputEvent.Action.UP) {
                            onClick()
                        }
                    })
                }
            }
        )
    }
}

Android XR でできることを確認する

XR Geospatial Tour アプリを構築したことで、Android デベロッパーにとって、世界規模の空間エクスペリエンスの参入障壁がこれまでになく低くなっていることがわかりました。Android XR で Geospatial API のプレビュー版が利用可能になったことで、アプリは周囲の現実世界をシームレスに認識できるようになりました。Compose for XR の API と VPS の高精度な位置情報、Gemini の生成機能を組み合わせることで、ユーザーがどこにいて、何を見ているのかを把握するエクスペリエンスを作成できます。

Android XR を実際に体験していただくため、Android XR デベロッパー Catalyst プログラムへの応募を開始します。このプログラムには XREAL Project Aura が含まれます。本日より、今後数か月以内に XREAL Project Aura デベロッパー キットまたはディスプレイ グラス デベロッパー キットを入手するための申請が可能になります。

*免責事項: 一部のデバイスで利用できます。インターネット接続が必要です。対応するアプリおよびサーフェスで機能します。結果は状況に応じて変わります。

続きを読む