当前位置: 首页 > 后端技术 > Java

AR空间音频能力,打造身临其境的声音体验

时间:2023-04-01 13:50:43 Java

随着元宇宙的兴起,3D虚拟现实被广泛用于将数字信息与现实世界融合。目前大家的注意力主要集中在视觉交互层面。为了更好地再现现实世界的三维空间体验,引入听觉层次必不可少,空间音频应运而生。空间音频是一种音频体验,可以让用户更轻松地体验声音的立体感和深度,将环绕声更准确地定位在正确的方向上,让用户在生理上获得更身临其境的环绕效果。目前主要应用于AR、VR、语音视频聊天室、网络会议、网络游戏、虚拟演唱会等,以及对象音频制作等场景。为满足开发者的需求,华为HMSCoreAREngineXRKit在AR显示(ARSceneView)中增加了空间音频能力。为加载的模型添加音频后,XRKit内部会根据设备和模型的空间位置发生变化,模拟真实世界中的音频声音,增强聆听体验。如果不戴耳机,只能感受到音频音量的变化。戴上耳机后,可以同时感受到音频的音量和方向,空间音效体验更佳。其技术原理是利用听的双耳效应原理来区分位置,依靠两只耳朵的音量差、时间差、音色差来区分声音位置的效果,也就是声波的声波。空间中的声源从不同方向传播到左右耳。时间上的差异,以及耳廓内的折射、反射、吸收等,都会造成左右耳在音量、音色、延迟等方面的不同变化。这些声波变化就是声波的空间传递函数。空间音频是在模拟消声室环境中预先测量和记录的,全方位声音的变化过程传递到人耳的HRTF(HeadRelatedTransferFunctions头部相关传递函数),然后上层传入的声源和听者的空间信息(三维位置信息和三维旋转信息)计算出听者与声源的相对空间信息,根据当前相对空间信息得到两个通道在当前相对空间信息下的HRTF响应冲激函数到HRTF数据库,与当前的双声道音频数据进行卷积计算,渲染出左右耳的声音直接传到双耳,从而实现听位。未来,华为HMSCoreAREngineXRKit将根据开发者的需求,逐步开放空间音频引擎的更多能力。对于开阔的几何空间,将利用多普勒效应、距离衰减、回声等技术,改善开阔空间相对运动时的空间声音体验;针对封闭的几何空间,引入室内声学,如遮挡、透射、反射、吸收、回声等基本音效算法,可以更好地实现封闭几何空间的3D音效,还原真实听感。开发步骤1.开发环境要求:在华为终端设备上的应用市场下载XRKitserverAPK(需要在华为应用市场搜索“HuaweiXRKit”)并安装到终端设备上。JDK1.8.211及以上;安装AndroidStudio3.0及以上:minSdkVersion27及以上targetSdkVersion29(推荐)compileSdkVersion29(推荐)Gradle6.1.1及以上(推荐)测试应用的设备:见AREngine特性软硬件依赖表。如果同时使用多个HMSCore服务,需要使用每个Kit对应的最大值。2.开发准备在开发应用之前,您需要在华为开发者联盟网站注册为开发者并完成实名认证。具体请参见账号注册与认证。参考创建项目和在项目下创建应用,完成应用的创建。配置如下:“SelectPlatform”:选择“Android”。“支持的设备”:选择“手机”。“应用类别”:选择“应用”或“游戏”。华为提供了集成在Maven仓库中的XRKitSDK包。在开始开发之前,您需要将XRKitSDK集成到您的开发环境中。注意XRKit的Android版本必须是1.6.0.0或更高版本。对于7.0、7.0和7.1及以上版本的Gradle插件,AndroidStudio的代码库配置有所不同。请根据您当前的Gradle插件版本选择相应的配置流程。以7.1版本为例:打开AndroidStudio项目级“build.gradle”文件,添加Maven代码库;在“buildscript>repositories”配置HMSCoreSDK的Maven仓库地址:buildscript{repositories{google()jcenter()maven{url"https://developer.huawei.com/repo/"}}}打开项目-级“settings.gradle”文件,配置HMSCoreSDK的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,"XRKitisnotavailable",Toast.LENGTH_SHORT).show();returnfalse;}3.3创建一个AR场景使用XRKit特征组件工厂类XrKitFeatureFactory实例化特征组件管理对象xrKitFeature并设置特征事件监听,用于获取XRKit服务端上报的必要特征事件。xrKitFeature可以根据需求创建不同的AR场景。本例中创建了AR展示场景(ArSceneView)。尝试{如果(xrKitFeature==null){xrKitFeature=XrKitFeatureFactory.createXrKitFeature(getApplicationContext());}//注册一个特性监听器。xrKitFeature.setFeatureEventListener(这个);//创建arSceneView.sceneView=xrKitFeature.createArSceneView(getApplicationContext()));}catch(XrKitUnavailableServiceApkTooOldExceptione){Toast.makeText(this,"XRKit服务太旧,请升级!",Toast.LENGTH_SHORT).show();returnfalse;}3.4将视图绑定到应用布局获取当前场景视图,将视图绑定到应用的UI布局。layout.addView(sceneView.getView(),0,newConstraintLayout.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(工城石,"工城石");sceneView.setBackground(IMG_BLACK);sceneView.setPlaneVisible(true);在activity的onResume方法中调用sceneView的resume方法启动sceneView场景。protectedvoidonResume(){Log.d(TAG,"活动恢复。");super.onResume();if(sceneView!=null){sceneView.resume();}}3.7添加空间音频在模型处添加音频,如果此时空间声音引擎还没有初始化,会执行初始化动作。目前仅支持MP3和WAV(PCM)格式的音频。需要根据业务需求指定用于识别音频的全局唯一ID。如果传入重复的ID,添加的音频不会被覆盖。添加的音频在设备与模型的距离小于等于5米时生效。model.attachSoundToModel(StringsoundId,StringsoundUrl)//添加音频StringsoundId到模型中,例如:"Sound_Chariots_Repeat"StringsoundUrl,例如:"assets://sounds/chariots.mp3"model.detachSoundFromModel(StringsoundId)//从模型中移除音频。model.playSound(StringsoundId,intplayMode)//开始播放音频。playMode有两种模式(参考IModel):intPLAY_MODE_ONCE//播放一次音频。intPLAY_MODE_REPEAT//循环播放音频。model.pauseSound(StringsoundId)//暂停音频。更多详情>>访问华为开发者联盟官网获取开发指导文档华为移动服务开源仓库地址:GitHub、Gitee关注我们,第一时间了解HMSCore最新技术资讯~