サービスに関する最新情報

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

所要時間: 6 分

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

初めて訪れた街で有線 XR グラス(近日発売予定の XREAL Project Aura など)をかけると、その土地に詳しいローカルガイドがすぐに現れて案内してくれる。2D の地図を見つめる必要はありません。3D モデルが優しく道を案内し、目の前にある歴史的なランドマークについてインテリジェントな音声が教えてくれます。Geospatial API、Firebase AI Logic を使用した Gemini API、Google マップのグラウンディング、Jetpack XR SDK を組み合わせて、ハンズフリーで没入感のあるウォーキング ツアー エクスペリエンスを作成しました。

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

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

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

GPS のパワーと VPS の精度を組み合わせて、XR でのナビゲーション エクスペリエンスを強化します。VPS の精度と正確な方向により、3D ウェイポイントを物理世界に合わせることができます。

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

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

// 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}")
}

エクスペリエンス全体がこの精度に依存しているため、horizontalAccuracy と orientationYawAccuracy がしきい値を満たすまでモニタリングします。ユーザーが屋内にいる場合や、認識できないエリアにいる場合は、「屋外の公共スペースに移動して周囲を見回す」よう促します。

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 マップによるグラウンディングを使用して 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 を使用しました。ツアーに沿ったスポットを表すために、InfoSphere というコンポーズ可能な関数を作成しました。これには、空間に浮かぶ 3D オーブの GltfModel が含まれており、操作して情報を表示できます。

Jetpack XR SDK を使用すると、SpatialBox と SceneCoreEntity を使用して、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 開発キットまたはディスプレイ グラス開発キットへのアクセスを申請できます。

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

続きを読む