產品最新消息

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

閱讀時間:6 分鐘

在今年的 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 API、Google 地圖基準和 Jetpack XR SDK,打造出免持的沉浸式徒步導覽體驗。

免責事項:影片和導覽應用程式僅供示範。部分步驟經過簡化。圖片中的硬體可能仍在開發階段,最終產品詳細資料可能不同。

讓我們逐步瞭解實作細節,並說明如何將這些 API 整合在一起,打造全球規模的空間體驗。

1. 使用 ARCore Geospatial API (VPS) 精確定位使用者

結合 GPS 的強大功能和 VPS 的精確度,提升 XR 導航體驗。VPS 的準確度和精確方向可讓 3D 路線控點與實體世界對齊。

因此,Android XR 上的 Geospatial API 可協助您打造自訂體驗。VPS 採用先進的電腦視覺技術,嘗試提供比 GPS 更準確的地理空間姿勢 (包括經緯度和方向)。

以下說明如何將裝置方向對應至地理空間座標,擷取使用者的地理空間姿勢:

// 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,將 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 開發人員打造世界級空間體驗的門檻已大幅降低。Geospatial API 現已在 Android XR 推出預先發布版,可讓應用程式順暢理解周遭的實體世界。結合 Compose for XR 的 API、VPS 的高精確度位置資料和 Gemini 的生成功能,我們可以打造出能瞭解使用者所在位置和所見內容的體驗。

為協助您親身體驗 Android XR,我們很開心宣布開放申請加入 Android XR 開發人員催化計畫,這項計畫包含 XREAL Project Aura。即日起,您可以申請在未來幾個月內取得 XREAL Project Aura 開發套件或顯示型眼鏡開發套件!

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

繼續閱讀