写点什么

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

作者:HMS Core
  • 2022-11-10
    贵州
  • 本文字数:3318 字

    阅读完需:约 11 分钟

随着元宇宙的兴起,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 最新技术资讯~

发布于: 刚刚阅读数: 4
用户头像

HMS Core

关注

HMS Core技术团队。 2022-06-16 加入

分享最新的技术干货,带来最全的能力应用场景,更新热门开发者圈子活动。与开发者一起,同成长,共精彩。

评论

发布
暂无评论
AR空间音频能力,打造沉浸式声音体验_华为_HMS Core_InfoQ写作社区