【Oculus】使用Unity测试Oculus Audio SDK【原创】

西门智
2023-12-01

测试Oculus

使用unity和oculus测试3D声音的效果。

Oculus Spatializer Plugin (OSP)是针对Unity工具的一款插件,让单声道的声源可以再3D空间中根据用户头部的位置来进行空间化。

目前OSP还存在一些缺陷:

  • 某些功能,例如priotiry systems,还不完整

  • 当early reflections打开时,CPU的使用率会提高,并且随着房间规模的增大,成比例的提高。

  • 用户可能会听到click,当声音被一个优先级更高的声音偷走的时候。

安装软件

下载地址:https://developer.oculus.com/downloads/

  • Oculus Runtime for Windows

  • Oculus SDK for Windows

  • Oculus Audio SDK Plugins

  • Unity5.1 X86

  • VS_UnityTool2013(非必须)

SDK安装入Unity中

网址:https://developer.oculus.com/documentation/audiosdk/latest/concepts/osp-unity-install/

  1. 创建一个新的工程

  2. 双击OculusSpatializer.unitypackage,导入all

  3. 测试OSPTestScene

OSPTestScene

点击OSPTest,直接运行,可以看到3个球,每个球都在环播放音乐。

OSPManager

https://developer.oculus.com/documentation/audiosdk/latest/concepts/osp-unity-ospmanager/

包含信息

OSPManager包含本应用中spatializer的全局变量信息。

  1. Bypass:选中后,就不进行空间化,所有通过OSPAudioSource的声音会使用Unity native 2D panning。

  2. Global Scale:1表示unity的一个单位对应1m,0.01表示unity的一个单位对应1cm。

  3. Gain:由于spatialized声音的音量被会spatializer减小,因此需要对这些声音加一个增量,让它们听起来和非空间化的相同。

  4. Enable(EARLY REFLECTIONS):增强空间化的效果,但是会提高CPU的使用率。

  5. Reverb On:给输出加入一个固定的reverb tail(逐渐衰弱的尾巴)。这个reverb是通过根据房间参数的反射计算得到的,并不一定会提到CPU的使用率。修改房间的参数可能会引起CPU使用率的提高。

  6. Room Dimensions:理论房间的维度,用来计算反射。房间越大,反射的越远。目前房间的大小范围在【0-230米】

  7. Reflection Values:0表示声音在墙面完全被吸收,1表示完全反射。

  8. Reflection Gain:用来调整反射后的信号强度(both early reflections and reverb)。以米为单位,表示声音在衰减为0之前可以传播多远的距离。这个值越大,反射的声音也越大。

使用说明

  1. 最多可以空间化64个声音。

  2. 音频输出格式应该为2.1或者2 Stereo Channel Configuraion。Spatializer无法处理更高参数的信道。

  3. 这个理论的房间会根据听者的位置来计算反射,并且根据听者的朝向来旋转。未来的版本可以让用户在一个静止的房间里走来走去。

  4. 当使用early reflections时,要保证房间是非对称的。一个立方体房间会产生加强的回音,造成空间化效果很差。shoebox模型在模拟房间时的效果最好,对于很大的区域或者室外,应该采用一个单独的衰变模型。

重要:当使用early reflection时,要保证声源处于房间的内部,否则这个声音就无法被听到。

代码细节

调用C++库OculusSpatializerPlugin.dll,主要函数包含:

  • Awake()

  • Update()

  • AcuireContext()

  • ReleaseContext()

  • Spatialize(int context, float[] ioBuf)

  • UpdateEarlyReflections()

OSPAudioSource

https://developer.oculus.com/documentation/audiosdk/latest/concepts/osp-unity-ospaudiosource/

使用OSPAudioSource来创在要被空间化的声音。OSPAudioSource包含一个原始Unity Audio Source元素和一个OSPAudioSource脚本元素与spatializer进行交互。

Unity Audio Source

介绍几个比较重要的变量。

  1. Audio Clip:声音文件

  2. Output:声音的输出为audio listner还是audio mixer(一般是none)

  3. Mute:静音

  4. Loop:循环播放

  5. Volumn:音量

  6. Pitch:播放速度,1为正常速度

  7. Stereo Pan:3D引擎对声音的影响

  8. Spatial Blend:0为2D,1为3D

  9. Reverb Zone Mix:

  10. 3D sound settings

    • Doppler level:多普勒效应,0为无

    • Volume Rolloff:声音的衰变模型

    • Spread:spread angle

    • Max Distance:声音的有效距离

包含信息

OPS工作时,是作为Unity Audio Source元素的一个扩展(add-on),从Audio Source元素中延伸出了许多自己的功能,包括距离衰变曲线。

注意:当需要手动启动声音时,必须调用OSPAudioSource中的Play和Stop函数,在OSPAudioSource.cs中有一系列控制空间化声音的函数。

  1. Bypass:可以控制声源是采用3D空间化还是采用原始的2D Unity panning。这个特征在程序运行时,灵活的控制OSP Audio Sources,与现有的音频管理器融合起来也更简便。

  2. Play On Awake: 推荐使用该开关,而不是Unity AudioSource中的原生的Play On Awake。直接使用原生的也可以播放,但是会在开始时听到一个hiccup噪声,这是由spatializer在得到所有的声源时引起的。

  3. Disable Reflections:如果被设为true,则该声源将不会去计算反射/回声,因为计算回声需要额外的CPU计算,因此可以用来减少CPU的消耗。当然,OSP manager如果是false,则该变量不会有任何影响。

  4. Frequence Hint:有3中选择,Wideband适合包含较多频率的内容,例如音乐和演讲。Narrowbank适合包含较少频率的内容,例如正弦波和简单的音调。None位于两者之间,是默认的参数。有一条经验,如果一个声源随着自己位置的变化,会产生不连续,例如clicking或crackling,这个时候就应该选择一个narrower frequency hint。

使用说明

在Unity native Audio Source中的3D Sound Settings可以被sound designer使用。但是里面的Pan Level和Spread被OSPAudioSource给重写了。因此在程序运行时,要保证这些变量不被修改,否则会严重影响空间化结果的输出。

目前只有单声道的声音会被空间化。即使用户在unity中把声音设置为3D sound,一个立体声也不会被分解为单声道的声音。

代码细节

继承MonoBehaviour类

 类似资料: