隨著元宇宙的興起,3D虛擬現實廣泛引用,讓數字化信息和現實世界融合,目前大家的目光主要聚焦於視覺交互層面,為了在虛擬環境中更好的再現真實世界的三維空間體驗,引入聽覺層面必不可少,空間音頻孕育而生。 空間音頻是一種音頻體驗,會讓用戶更容易體驗到聲音的立體感和深度,將環繞聲更準確地定位在合適的方位,讓用 ...
隨著元宇宙的興起,3D虛擬現實廣泛引用,讓數字化信息和現實世界融合,目前大家的目光主要聚焦於視覺交互層面,為了在虛擬環境中更好的再現真實世界的三維空間體驗,引入聽覺層面必不可少,空間音頻孕育而生。
空間音頻是一種音頻體驗,會讓用戶更容易體驗到聲音的立體感和深度,將環繞聲更準確地定位在合適的方位,讓用戶在生理上獲得更身臨其境的環繞效果。目前主要應用在AR、VR、語音視頻聊天室、線上會議、線上游戲、虛擬演唱會等,以及對象音頻製作等場景。
針對開發者的需求,華為HMS Core AR Engine XR Kit在AR展示(ARSceneView)中新增空間音頻能力,在已經載入的模型上添加音頻後,XR Kit內部根據設備和模型的空間位置變化,模擬真實世界中音頻的發聲,提升聽覺體驗。不佩戴耳機,只能感受音頻的聲音大小變化,佩戴耳機後,可以同時感受音頻的聲音大小及方位變化,空間音頻效果體驗更佳。
技術原理
利用聽音辨位的雙耳效應原理,依靠雙耳間的音量差、時間差和音色差判別聲音方位的效應,也就是說空間中音源的聲波從不同的方向傳播到左右耳的路徑不同、時間不同,以及耳廓中的折射、反射、吸收等,從而導致音量、音色、延遲等在左右耳會產生不同的變化,這些聲波變化過程就是聲波的空間傳遞函數。
空間音頻是預先測量記錄在模擬的消音室環境中全方位聲音傳到人耳的變化過程HRTF(Head Related Transfer Functions頭部相對傳輸函數),然後上層傳入的聲源和聽者的空間信息(三維位置信息和三維旋轉信息),以計算出聽者和聲源的相對空間信息,並根據HRTF資料庫得到當前相對空間信息下的兩個聲道的HRTF響應脈衝函數,與當前雙聲道音頻數據進行捲積計算渲染出左右耳的聲音直傳雙耳,從而可以實現聽音辨位。
華為HMS Core AR Engine XR Kit未來將根據開發者的述求,逐步開放空間音頻引擎的更多能力。針對開放幾何空間,將開放多普勒效應、距離衰減、回聲等技術,提升在開放空間中相對運動時的空間音效體驗;針對密閉幾何空間,將引入房間聲學,例如實現遮擋、透射、反射、吸收、回聲等基礎音效演算法,更好的實現密閉幾何空間的3D聲效,還原真實聽感。
開發步驟
1. 開發環境要求:
在華為終端設備上的應用市場下載XRKit服務端APK(需在華為應用市場,搜索“華為XRKit”)並安裝到終端設備。
JDK 1.8.211及以上;
安裝Android Studio 3.0及以上:
minSdkVersion 27及以上
targetSdkVersion 29(推薦)
compileSdkVersion 29(推薦)
Gradle 6.1.1及以上(推薦)
測試應用的設備:參見AREngine特性軟硬體依賴表。
如果同時使用多個HMS Core的服務,則需要使用各個Kit對應的最大值。
2. 開發準備
在開發應用前需要在華為開發者聯盟網站上註冊成為開發者並完成實名認證,具體方法請參見帳號註冊認證。
“選擇平臺”:選擇“Android”。
“支持設備”:選擇“手機”。
“應用分類”:選擇“應用”或“游戲”。
華為提供了Maven倉集成方式的XRKit SDK包,在開始開發前,您需要將XRKit SDK集成到您的開發環境中,特別註意的是XRKit的Android版本要是1.6.0.0及其以上。
Android Studio的代碼庫配置在Gradle插件7.0以下版本、7.0版本和7.1及以上版本有所不同。請根據您當前的Gradle插件版本,選擇對應的配置過程。
以7.1版本為例:
打開Android Studio項目級“build.gradle”文件,添加Maven代碼庫;
在“buildscript > repositories”中配置HMS Core SDK的Maven倉地址:
buildscript {
repositories {
google()
jcenter()
maven {url "https://developer.huawei.com/repo/" }
}
}
打開項目級“settings.gradle”文件,配置HMS Core SDK的Maven倉地址。
pluginManagement {
repositories {
repositories {
google()
jcenter()
maven {url "https://developer.huawei.com/repo/" }
}
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
repositories {
google()
jcenter()
maven {url "https://developer.huawei.com/repo/" }
}
}
}
在項目應用級的“build.gradle”文件中“dependencies”添加編譯依賴。
dependencies {
implementation 'com.huawei.hms:xrkitsdk:{version}'
}
3. 應用開發
3.1 模型文件製作
在使用XRKit能力之前,您需要準備模型文件,用於在虛擬現實中展示,模型文件製作規範請參見模型文件規範說明。
3.2 運行前驗證
檢查當前設備是否安裝了XRKit,若已經安裝則正常運行。具體實現代碼如下:
if (!XrKitFeatureFactory.isXrKitExist(getApplicationContext())) {
Toast.makeText(this, "XRKit is not available ", Toast.LENGTH_SHORT).show();
return false;
}
3.3 創建AR場景
使用XRKit特性組件工廠類XrKitFeatureFactory,實例化特性組件管理對象xrKitFeature並設置特性事件監聽,特性事件監聽用來獲取XRKit服務端上報的必要特性事件。xrKitFeature可根據需求創建不同AR場景,本例創建的是AR展示場景(ArSceneView)。
try {
if (xrKitFeature == null) {
xrKitFeature = XrKitFeatureFactory.createXrKitFeature(getApplicationContext());
}
// Register a feature listener.
xrKitFeature.setFeatureEventListener(this);
// Create arSceneView.
sceneView = xrKitFeature.createArSceneView(getApplicationContext());
} catch (XrKitUnavailableServiceApkTooOldException e) {
Toast.makeText(this, "XRKit Service is Too Old, Please upgrade!",
Toast.LENGTH_SHORT).show();
return false;
}
3.4 綁定視圖到應用佈局
獲取當前場景的視圖,綁定視圖到應用的UI佈局當中。
layout.addView(sceneView.getView(), 0, new ConstraintLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
3.5 選擇模式
Ar展示場景(ArSceneView)有AR模式和3D模式兩種模式,可根據需求選擇AR模式或3D模式。
AR模式:即虛實結合,您可以構建能在用戶環境中響應的圖像(如傢具或產品包裝)的AR應用。
3D模式:虛擬動畫,您可以利用此功能構建展示動畫的AR應用。
// AR模式
sceneView.setArMode(true);
// 3D模式
sceneView.setArMode(false);
3.6 設置場景
載入虛擬模型、設置3D場景的背景、設置AR場景下平面的可見性。
sceneView.loadModel(GONGCHENGSHI, "gongchengshi");
sceneView.setBackground(IMG_BLACK);
sceneView.setPlaneVisible(true);
在activity的onResume方法中調用sceneView的resume方法,啟動sceneView場景。
protected void onResume() {
Log.d(TAG, "activity resume.");
super.onResume();
if (sceneView != null) {
sceneView.resume();
}
}
3.7 添加空間音頻
在模型處添加音頻,若此時空間音效引擎未做初始化,會實施初始化的動作。目前只支持MP3和WAV(PCM)格式音頻。標識音頻的全局唯一ID需要您根據業務需求指定,傳入重覆的ID,不會覆蓋已經添加的音頻。添加的音頻在設備與模型的距離小於等於5米時生效。
model.attachSoundToModel(String soundId, String soundUrl) // 在模型處添加音頻
String soundId, 例如:“Sound_Chariots_Repeat”
String soundUrl, 例如: “assets://sounds/chariots.mp3”
model.detachSoundFromModel(String soundId) // 從模型中刪除音頻。
model.playSound(String soundId, int playMode) // 開始播放音頻。
playMode有兩種模式(參考IModel):
int PLAY_MODE_ONCE // 播放一次音頻。
int PLAY_MODE_REPEAT // 迴圈播放音頻。
model.pauseSound(String soundId) // 暫停播放音頻。
瞭解更多詳情>>
訪問華為開發者聯盟官網
獲取開髮指導文檔
華為移動服務開源倉庫地址:GitHub、Gitee
關註我們,第一時間瞭解 HMS Core 最新技術資訊~