AR空间音频能力,打造沉浸式声音体验

发布者:HarmonyOS SDK
发布于:2022-11-10 11:41

随着元宇宙的兴起,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仓地址:

1
2
3
4
5
6
7
buildscript {
     repositories {
        google()
        jcenter()
        maven {url "https://developer.huawei.com/repo/" }
    }
}

打开项目级“settings.gradle”文件,配置HMS Core SDK的Maven仓地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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”添加编译依赖。

1
2
3
dependencies {
     implementation 'com.huawei.hms:xrkitsdk:{version}'
}

3. 应用开发

3.1 模型文件制作

 

在使用XRKit能力之前,您需要准备模型文件,用于在虚拟现实中展示,模型文件制作规范请参见模型文件规范说明

 

3.2 运行前验证

 

检查当前设备是否安装了XRKit,若已经安装则正常运行。具体实现代码如下:

1
2
3
4
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)。

1
2
3
4
5
6
7
8
9
10
11
12
13
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布局当中。

1
2
3
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应用。

1
2
3
4
// AR模式
sceneView.setArMode(true);
// 3D模式
sceneView.setArMode(false);

3.6 设置场景

 

加载虚拟模型、设置3D场景的背景、设置AR场景下平面的可见性。

1
2
3
sceneView.loadModel(GONGCHENGSHI, "gongchengshi");
sceneView.setBackground(IMG_BLACK);
sceneView.setPlaneVisible(true);

在activity的onResume方法中调用sceneView的resume方法,启动sceneView场景。

1
2
3
4
5
6
7
protected void onResume() {
     Log.d(TAG, "activity resume.");
     super.onResume();
     if (sceneView != null) {
        sceneView.resume();
     }
}

3.7 添加空间音频

 

在模型处添加音频,若此时空间音效引擎未做初始化,会实施初始化的动作。目前只支持MP3和WAV(PCM)格式音频。标识音频的全局唯一ID需要您根据业务需求指定,传入重复的ID,不会覆盖已经添加的音频。添加的音频在设备与模型的距离小于等于5米时生效。

1
2
3
4
5
6
7
8
9
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 最新技术资讯~


声明:该文观点仅代表作者本人,转载请注明来自看雪