今年の Google I/Oで、空間エクスペリエンスのアップデートを発表しました。Geospatial APIがARCore for Jetpack XRでプレビュー版として利用できるようになりました。Google の Visual Positioning System(VPS)を Android XR に導入することで、Android XR は、対応エリアで 1 メートル未満の精度と正確な方向でデジタル コンテンツを現実世界に固定できるようになります。*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 よりも正確な 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 という Composable を作成しました。これには、空間に浮かぶ 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 を実際に体験していただけるよう、XREAL Project Aura を含む Android XR デベロッパー Catalyst プログラムへの応募を開始しました。本日より、XREAL Project Aura デベロッパー キットまたはディスプレイ グラス デベロッパー キットへのアクセスを申し込むことができます。
*免責事項: 一部のデバイスで利用できます。インターネット接続が必要です。対応するアプリおよびサーフェスで機能します。結果は状況に応じて変わります。
-
プロダクト ニュース本日、Google は「単なるストアではない」というビジョンを次の段階に進める方法を発表しました。月間 2 億 5,000 万人以上のアクティブ ユーザーが利用する [あなた向け] タブから、7 億人以上のゲーマー プロファイルを接続する統合ゲーム プラットフォームまで、Google Play はユーザーがどこにいても利用できます。
Paul Feng • 3 分で読了 -
プロダクト ニュースAndroid デベロッパーは、アプリ デベロッパーとして、アプリ開発に使用するエージェント、LLM、ツール、コマンドライン インターフェース(CLI)を数多く選択できます。Google の目標は、どのような方法で構築する場合でも、美しい高品質の Android アプリを構築できるようにすることです。
Simona Milanovic • 4 分で読了 -
プロダクト ニュースGoogle Play では、サブスクリプション プラットフォームを継続的に拡張し、成長の促進、新しいビジネスモデルへの適応、ユーザーのニーズへの対応を支援しています。
Sheenam Mittal • 4 分で読了
Android デベロッパー向けの最新の分析情報を毎週メールでお届けします。