使用 Android XR、Geospatial API 和 Gemini 建構混合實境導覽員

閱讀時間:7 分鐘

在今年的 Google I/O 大會上,我們宣布推出空間體驗更新:Geospatial API 現已在 ARCore for Jetpack XR 中推出預先發布版。Android XR 導入 Google 的視覺定位系統 (VPS),可在支援的區域*,以公尺以下的準確率將數位內容錨定至實體世界,並提供精確的螢幕方向。為探索 Geospatial API 的潛在用途,我們的團隊建構了 XR Geospatial Tour 示範應用程式。

想像一下,您走進一座新城市,戴上 XR 有線眼鏡 (例如即將推出的 XREAL Project Aura),就能立即有位知識豐富的當地導遊帶您四處參觀。你不需要盯著 2D 地圖,3D 模型會溫和地引導你,智慧語音則會告訴你眼前的歷史地標。我們結合了 Geospatial API使用 Firebase 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}")
}

由於整個體驗都仰賴這項準確度,我們會監控 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,我們可以透過 SpatialBoxSceneCoreEntity,將 3D 模型放置在 Compose UI 旁邊。我們也使用 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 開發人員催化計畫,這項計畫包含 XREAL Project Aura。即日起,您可以申請在接下來幾個月內取得 XREAL Project Aura 開發套件或顯示型眼鏡開發套件的存取權!

*免責事項:僅適用於特定裝置。必須連上網路才能使用。需在相容的應用程式和裝置上使用。實際結果可能有差異。

繼續閱讀