随着元宇宙的兴起,3D虚拟现实广泛引用,让数字化信息和现实世界融合,目前大家的目光主要聚焦于视觉交互层面,为了在虚拟环境中更好的再现真实世界的三维空间体验,引入听觉层面必不可少,空间音频孕育而生。

空间音频是一种音频体验,会让用户更容易体验到声音的立体感和深度,将环绕声更准确地定位在合适的方位,让用户在生理上获得更身临其境的环绕效果。目前主要应用在AR、VR、语音视频聊天室、在线会议、在线游戏、虚拟演唱会等,以及对象音频制作等场景。

针对开发者的需求,华为HMS CoreAR 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 最新技术资讯~

AR空间音频能力,打造沉浸式声音体验的更多相关文章

  1. HMS Core音频编辑服务3D音频技术,助力打造沉浸式听觉盛宴

    2022年6月28日,HDD·HMS Core.Sparkle影音娱乐沙龙在线上与开发者们见面.HMS Core音频编辑服务(Audio Editor Kit)专家为大家详细分享了基于分离的3D音乐创 ...

  2. Android中的沉浸式状态栏效果

    无意间了解到沉浸式状态栏,感觉贼拉的高大上,于是就是试着去了解一下,就有了这篇文章.下面就来了解一下啥叫沉浸式状态栏.传统的手机状态栏是呈现出黑色条状的,有的和手机主界面有很明显的区别.这一样就在一定 ...

  3. Android状态栏微技巧,带你真正意义上的沉浸式

    记得之前有朋友在留言里让我写一篇关于沉浸式状态栏的文章,正巧我确实有这个打算,那么本篇就给大家带来一次沉浸式状态栏的微技巧讲解. 其实说到沉浸式状态栏这个名字我也是感到很无奈,真不知道这种叫法是谁先发 ...

  4. Android隐藏状态栏实现沉浸式体验

    转自: Android状态栏微技巧,带你真正理解沉浸式模式 什么叫沉浸式? 根据百度百科上的定义,沉浸式就是要给用户提供完全沉浸的体验,使用户有一种置身于虚拟世界之中的感觉. 那么对应到Android ...

  5. Android状态栏微技巧,带你真正理解沉浸式模式【转】

    感谢! 本文转自大佬郭霖:http://blog.csdn.net/guolin_blog/article/details/51763825 转载请注明出处:http://blog.csdn.net/ ...

  6. Android如何实现超级棒的沉浸式体验

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由brzhang发表于云+社区专栏 做APP开发的过程中,有很多时候,我们需要实现类似于下面这种沉浸式的体验. 沉浸式体验 一开始接触的 ...

  7. HMS Core音频编辑服务音源分离与空间音频渲染,助力快速进入3D音频的世界

    从单声道.立体声.环绕声发展到三维声,音频回放技术的迭代演进是为了还原真实世界的声音.其中,三维声技术使用信号处理的方法对到达两耳的声音信号进行模拟,将声场还原为三维空间,更接近真实世界.凭借这个技术 ...

  8. Android UI体验之全屏沉浸式透明状态栏效果

    前言: Android 4.4之后谷歌提供了沉浸式全屏体验, 在沉浸式全屏模式下, 状态栏. 虚拟按键动态隐藏, 应用可以使用完整的屏幕空间, 按照 Google 的说法, 给用户一种 身临其境 的体 ...

  9. 分别用ToolBar和自定义导航栏实现沉浸式状态栏

    一.ToolBar 1.在build.gradle中添加依赖,例如: compile 'com.android.support:appcompat-v7:23.4.0' 2.去掉应用的ActionBa ...

随机推荐

  1. Python自学教程7:字典类型有什么用

    字典是Python中的一个重要操作,如果字典玩得顺,很多其他的数据类型就可以一通百通. Python字典的定义 字典使用一对大括号进行定义,键值对之间使用逗号隔开,键和值使用冒号分隔. 键必须是不可变 ...

  2. java数组---初始化

    public class ArrayDemo { public static void main(String[] args) { int[] a={1,2,3,4,5,6,7,8,9}; //静态初 ...

  3. C# winfrom ListView控件实现自由设置每一行字体及背景色等

    背景:公司经常会需要将日志信息,输出到一个对话框中显示出来.之前一直采用的listbox控件,操作简单,使用方便,但是遗憾的是,不能自由控制每一行的状态. 于是想了如下几个方案: (1)重绘listb ...

  4. 完全彻底的卸载MySQL5.7.35

    最开始接触计算机的时候关于MySQL卸载的这个问题,导致我重装了一次系统.就在今天我又遇到了同样的问题. Setp①: 想要安装新的数据库软件必须要先彻底且干净的删除掉以前的数据库. 第一步要做的是停 ...

  5. Html飞机大战(九): 使徒来袭 (设计敌机)

    好家伙,本篇介绍敌机 好了,按照惯例我们来理一下思路:   我们有一个敌机类,第一步当然是实例一个敌机对象, 然后我们把这个敌机放入我们的敌机群(敌机数组) 然后是熟悉的移动和绘制   那我们回顾一下 ...

  6. vim编辑器使用详解

    Linux之vim编辑器使用 vim三种模式:命令模式,插入模式,退出模式 移动光标操作 左移动一个字符: 按 h 键 右移动一个字符:按 l 键 下移动一行:按 j 键 上移动一行:按 k 键 移动 ...

  7. window环境导入odbc数据源

    <ODBC指南>中只介绍了window环境如何配置odbc数据源,但是没有介绍如何导入数据源驱动,这里做个补充. 在没有导入数据源驱动之前,按照文档操作是查不到kingbaseES的odb ...

  8. Linux安装Minio

    Linux安装Minio 一.安装包方式安装 1.下载minio 1.1 手动下载:https://docs.min.io/docs/minio-quickstart-guide.html ​ 访问上 ...

  9. 微信小程序-云函数、云存储

    云函数是运行在服务器端的 创建一个目录cloud project.config.json配置云函数目录 cloud目录有个云朵.代表云函数 初始化成功了 新建一个云函数 cloud目录右击 新建一个N ...

  10. 采用docker方式安装ElastAlert,图形化配置告警规则----具体内容有删改,仅供查看

    1.创建几个文件夹保存ElastAlert相关配置信息,用来挂载到容器中使用 2.编写核心配置,创建 ${ELASTALERT}/config/config.yaml用来存储核心配置: 3.Elast ...