AR空間音頻能力,打造沉浸式聲音體驗

来源:https://www.cnblogs.com/hmscore/archive/2022/11/10/16876560.html
-Advertisement-
Play Games

隨著元宇宙的興起,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)                               // 暫停播放音頻。

瞭解更多詳情>>

訪問華為開發者聯盟官網
獲取開髮指導文檔
華為移動服務開源倉庫地址:GitHubGitee

關註我們,第一時間瞭解 HMS Core 最新技術資訊~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 之前想用Markdown來寫框架文檔,找來找去發現還是Jekyll的多,但又感覺不是很合我的需求 於是打算自己簡單弄一個展示Markdown文檔的網站工具,要支持多版本、多語言、導航、頁內導航等,並且支持Github Pages免費站點 組件選擇 我自己呢比較喜歡C#,恰好現在ASP.Net ...
  • Part One: System call tracing 任務:修改Xv6內核的代碼來列印出每個系統調用以及返回值 根據提示,應該在syscall.c中修改syscall()。 首先在syscall.c中增加對應系統調用名稱的數組: static char *syscalls_name[] = { ...
  • 前幾日考慮給ubuntu安裝圖形桌面驅動。第一次安裝是在圖形界面下啟動終端軟體跑的NVIDIA給的安裝腳本,結果它跑了一半自動重啟了圖形界面,導致腳本被退出了。測試發現顯卡確實已被驅動,但由於擔心會不會有某些組件缺失,便退出到tty完完整整重新又跑了遍腳本。結果這一下一弄,重啟後再次啟動則在引導完成 ...
  • Arnold for Cinema 4D是用於C4D R25的阿諾德渲染器,支持R25.010 及以上的C4D,SolidAngle Cinema 4D To Arnold 是一款先進的蒙特卡洛光線追蹤渲染器,專為動畫長度和視覺效果的需求而打造。 詳情:C4D R25插件:Arnold for Ci ...
  • 一、什麼是 SQLite 資料庫 SQLite 是嵌入式SQL資料庫引擎。與大多數其他 SQL 資料庫不同,SQLite 沒有單獨的伺服器進程。SQLite 直接讀取和寫入普通磁碟文件。具有多個表,索引,觸發器和視圖的完整 SQL 資料庫包含在單個磁碟文件中。資料庫文件格式是跨平臺的-您可以在32位 ...
  • 我是風箏,公眾號「古時的風箏」,專註於 Java技術 及周邊生態。 文章會收錄在 JavaNewBee 中,更有 Java 後端知識圖譜,從小白到大牛要走的路都在裡面。 本來是一個平靜而美好的下午,其他部門的同事要一份數據報表臨時彙報使用,因為系統目前沒有這個維度的功能,所以需要寫個SQL馬上出一下 ...
  • 背景 監控、優化、診斷 cpu, io消耗監控https://github.com/powa-team/pg_stat_kcache where條件過濾性統計https://github.com/powa-team/pg_qualstats cgroup , /proc 系統級指標統計https:/ ...
  • dispatch_sync執行了兩件事:把代碼塊放入指定線程的任務隊列中、堵塞當前線程直到代碼塊執行結束,如果出現了堵塞的線程和代碼塊所在的線程為同一線程的話,這個時候代碼無法在此線程執行繼續下去,即造成了死鎖。 - (void)viewDidLoad { [super viewDidLoad]; ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...