Tạo một hướng dẫn viên du lịch thực tế hỗn hợp bằng Android XR, Geospatial API và Gemini

7 phút đọc

Tại Google I/O năm nay, chúng tôi đã thông báo về bản cập nhật cho trải nghiệm không gian: Geospatial API hiện đã có dưới dạng bản dùng thử trong ARCore cho Jetpack XR. Bằng cách tích hợp Hệ thống định vị bằng hình ảnh (VPS) của Google vào Android XR, Android XR cho phép gắn nội dung kỹ thuật số vào thế giới thực với độ chính xác dưới một mét và hướng chính xác ở những khu vực được hỗ trợ.* Để khám phá những khả năng mà Geospatial API có thể mang lại, nhóm của chúng tôi đã tạo một bản minh hoạ: XR Geospatial Tour.

Hãy tưởng tượng bạn đang bước vào một thành phố mới, đeo một cặp kính thông minh XR có dây (như Dự án Aura sắp ra mắt của XREAL) và ngay lập tức có một hướng dẫn viên địa phương am hiểu dẫn bạn đi tham quan. Bạn không cần phải nhìn chằm chằm vào bản đồ 2D. Thay vào đó, các mô hình 3D sẽ nhẹ nhàng hướng dẫn bạn đi đúng đường và giọng nói thông minh sẽ cho bạn biết về các địa danh lịch sử ngay trước mắt. Chúng tôi đã kết hợp Geospatial API, Gemini API bằng Firebase AI Logic, Google Maps GroundingJetpack XR SDK để tạo ra trải nghiệm tham quan thực tế ảo không cần dùng tay.

 

 

Tuyên bố từ chối trách nhiệm: Ứng dụng Video và Hướng dẫn tham quan chỉ nhằm mục đích minh hoạ. Một số trình tự đã được rút ngắn. Mọi phần cứng được mô tả có thể đang trong quá trình phát triển; thông tin chi tiết về sản phẩm cuối cùng có thể thay đổi.

Hãy cùng xem xét chi tiết về việc triển khai và cách chúng tôi kết hợp các API này để tạo ra một trải nghiệm không gian ở quy mô toàn cầu.

1. Xác định vị trí chính xác của người dùng bằng ARCore Geospatial API (VPS)

Nâng cao trải nghiệm điều hướng trên XR bằng cách kết hợp sức mạnh của GPS với độ chính xác của VPS. Độ chính xác và hướng chính xác mà VPS mang lại cho phép các điểm tham chiếu 3D phù hợp với thế giới thực.

Đó là lý do Geospatial API trên Android XR có thể giúp bạn tạo ra trải nghiệm tuỳ chỉnh. Bằng cách sử dụng công nghệ thị giác máy tính tiên tiến, VPS cố gắng cung cấp một GeospatialPose (bao gồm cả vĩ độ, kinh độ và hướng) chính xác hơn GPS.

Sau đây là cách chúng ta truy xuất Tư thế không gian địa lý của người dùng bằng cách liên kết hướng của thiết bị với một Toạ độ không gian địa lý:

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

Vì toàn bộ trải nghiệm đều phụ thuộc vào độ chính xác này, nên chúng tôi sẽ theo dõi horizontalAccuracyorientationYawAccuracy cho đến khi chúng đạt đến ngưỡng của chúng tôi. Nếu người dùng ở trong nhà hoặc ở một khu vực không xác định, chúng tôi sẽ nhắc họ "đi bộ đến một không gian công cộng ngoài trời và quan sát xung quanh".

2. Lập hành trình bằng Gemini API và tính năng neo bám của Google Maps

Sau khi có vị trí, chúng ta sẽ sử dụng Gemini API thông qua Firebase AI Logic để nhắc mô hình Gemini đóng vai trò là hướng dẫn viên du lịch địa phương. Chúng ta sẽ truyền toạ độ của người dùng cho mô hình và yêu cầu mô hình này xuất ra một phản hồi JSON có cấu trúc chứa các chuyến tham quan đi bộ ở gần:

   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.")

Mô hình ngôn ngữ lớn có khả năng tạo nội dung mô tả phong phú, nhưng đôi khi có thể tạo ra toạ độ vĩ độ/kinh độ chính xác. Để giải quyết vấn đề này, chúng tôi đã sử dụng Google Maps Grounding để cung cấp thông tin cơ sở cho AI.

3. Giọng nói hướng dẫn bạn: TTS của Gemini 2.5

Để hướng dẫn viên du lịch xuất hiện chân thực, chúng tôi đã triển khai tính năng lồng tiếng linh hoạt.

Khi sử dụng gemini-2.5-flash-tts model, chúng ta có thể định cấu hình cấu hình tạo mô hình để trả về dữ liệu âm thanh một cách tự nhiên thay vì chỉ văn bản! Sau đây là cách yêu cầu 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. Hiện thực hoá trong không gian 3D bằng Jetpack XR

Mảnh ghép cuối cùng là hiển thị dữ liệu này trong tầm nhìn của người dùng. Jetpack XR SDK giúp bạn dễ dàng chuyển đổi từ giao diện người dùng Android 2D sang điện toán không gian.

Chúng tôi đã sử dụng Jetpack Compose cho XR để tạo các thành phần không gian. Để thể hiện các địa điểm yêu thích dọc theo chuyến tham quan, chúng tôi đã tạo một thành phần kết hợp có tên là InfoSphere. Thành phần này chứa một GltfModel của một quả cầu 3D lơ lửng trong không gian và có thể tương tác để hiển thị thông tin.

Bằng cách sử dụng Jetpack XR SDK, chúng ta có thể đặt các mô hình 3D cùng với giao diện người dùng Compose bằng cách sử dụng SpatialBoxSceneCoreEntity. Chúng tôi cũng dùng InteractableComponent để phản hồi thao tác nhấn của người dùng.

Bằng cách kết hợp AnimatedSpatialVisibility cho các thành phần giao diện người dùng Compose truyền thống với các phần tử 3D SceneCoreEntity, chúng ta có thể kết hợp dữ liệu một cách liền mạch vào thế giới thực.

@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()
                        }
                    })
                }
            }
        )
    }
}

Khám phá những tiềm năng của Android XR ngay hôm nay

Việc xây dựng ứng dụng XR Geospatial Tour cho thấy rằng rào cản gia nhập đối với trải nghiệm không gian quy mô toàn cầu thấp hơn bao giờ hết đối với các nhà phát triển Android. Giờ đây, nhờ API Không gian địa lý có sẵn ở chế độ xem trước trên Android XR, các ứng dụng của bạn có thể dễ dàng hiểu được thế giới thực xung quanh. Bằng cách kết hợp các API của Compose cho XR với dữ liệu vị trí có độ chính xác cao của VPS và các khả năng tạo sinh của Gemini, chúng ta có thể tạo ra những trải nghiệm hiểu được cả vị trí của người dùng và nội dung họ đang xem.

Để giúp bạn trải nghiệm Android XR, chúng tôi rất vui khi mở đơn đăng ký tham gia Chương trình Xúc tác cho nhà phát triển Android XR, trong đó có Dự án Aura của XREAL. Kể từ hôm nay, bạn có thể đăng ký để nhận một bộ công cụ dành cho nhà phát triển của XREAL Project Aura hoặc bộ công cụ dành cho nhà phát triển kính có màn hình của chúng tôi trong những tháng tới!

*Tuyên bố từ chối trách nhiệm: Chỉ có trên một số thiết bị. Cần có kết nối Internet. Hoạt động trên các ứng dụng và nền tảng tương thích. Kết quả còn tuỳ trường hợp. 

Tác giả:
Đọc tiếp