1 Pico空间音频渲染器

以下将阐述Pico空间音频渲染器(Pico Spatial Audio)在unity环境中的集成指南,请认真跟随所述操作。

支持的Unity版本

目前引擎在以下版本中测试可用

  • 2020.3LTS
  • 2021.1LTS、2021.2LTS

检查 Pico Spatial Audio 引擎 Unity 包内容

  • Plugins: 保存着各个硬件平台的引擎动态库,可根据unity实际运行的平台自行删除无用的动态库文件
  • Prefabs:保存着一些工具prefab
  • Samples:保存着若干样例场景,可点开试听空间化引擎
  • Runtime:保存着引擎所需的C#源代码,其中需要Unity开发者关注的是如下文件,
    • PXR_Audio_Spatializer_Context.cs
    • PXR_Audio_Spatializer_AudioSource.cs
    • PXR_Audio_Spatializer_AmbisonicSource.cs
    • PXR_Audio_Spatializer_AudioListener.cs
    • 另外还有一些辅助文件,请确保他们也存在:
      • PXR_Audio_Spatializer_API.cs
      • PXR_Audio_Spatializer_Types.cs
    • 若你需要使用环境声学模拟引擎,请确保如下C# script都存在:
      • PXR_Audio_Spatializer_SceneGeometry.cs
      • PXR_Audio_Spatializer_SceneMaterial.cs

OK!你应该已经有了所有你需要的文件了。下面我们将阐述如何在Unity中接入Pico Spatial Audio引擎。我们将从简单的空间化开始讲起,过渡到实时环境声学模拟,最后说明如何渲染ambisonic 信号。

集成 Pico Spatial Audio 引擎(free field)

Free field场景即完全没有环境声学模拟的场景。在free field使用场景下,我们只需要如下3个文件即可:

  • PXR_Audio_Spatializer_Context.cs
  • PXR_Audio_Spatializer_AudioSource.cs
  • PXR_Audio_Spatializer_AudioListener.cs

集成步骤如下:

    1. 打开unity,创建一个空白3D工程
    1. 安装Pico Spatial Audio渲染器插件到你的项目
    1. 解压缩PicoSpatialAudio.zip
    2. 支持以下三种安装方法

    i . 将 PicoSpatialAudio 文件夹拷贝至你的Unity工程文件夹中,放置在Assets文件夹下

    ii . 将 PicoSpatialAudio 文件夹拷贝至你的Unity工程文件夹中,放置在Packages文件夹下

    iii . 在 unity package manager 中添加

    1. 点击窗口左上角的 + 号,从磁盘上安装
    _images/1.1.png
    1. 选择 PicoSpatialAudio 文件夹下的 package.json,双击导入
    1. 使用 Mac 的开发者们请注意:

    i . 在 Mac 端,由于系统 Gatekeeper 机制的问题,你可能会看到这样的警告信息

    _images/1.2.1.png _images/1.2.2.png

    这是由于系统错误阻止了我们的空间音频动态库的加载;当前,在看到这样的警告时,请暂时按照如下步骤绕过这个问题:

    1. 打开系统偏好设置,前往安全与隐私
    2. 请注意到窗口下方,系统提示已阻止使用”libPicoSpatializer.dylib“ 或者 “libPicoAmbisonicDecoder.dylib”。点击右侧的“仍然允许”按钮
    _images/1.3.png
    1. 如果还存在一开始的警告窗口,在这些窗口上点击“好”
    2. 请重启你的Unity工程,如Unity 以及 Mac 系统都不再报错了,证明Pico 空间音频 SDK已成功安装。
    1. 在场景中,创建一个空的游戏对象(game object)
    1. 在该game object上加上 PXR_Audio_Spatializer_Context.cs 组件(component)
    1. 在 PXR_Audio_Spatializer_Context.cs 组件上,可自行设置渲染质量,以获得最佳的质量/效率组合。
    _images/1.4.png
    1. 在场景中创建另一个game object,为了你之后视觉上看得更清楚,建议创建一个球
    1. 在球上加上 PXR_Audio_Spatializer_AudioSource.cs 组件(component)。一个Audio Source组件将被自动加入。
    1. 建议保持Unity AudioSource spatial blend的值为0;一个非0的spatial blend会导致一部分unity的空间化效果和Pico 空间音频渲染器共同作用,造成比物理现实更夸张的音量衰减和多普勒效应
    _images/1.5.png
    1. 找到场景中的audio listener存在于哪个game object上(应该在你的camera上),在该object上加上 PXR_Audio_Spatializer_AudioListener.cs 组件
_images/1.6.png

结束了!至此你已经集成完成了Pico Spatial Audio 引擎。

现在,我们让 Pico Spatial Audio 引擎将我们的音频信号空间化

    1. 选取你想要的测试文件,并将其导入进你的Unity 工程
    1. 在你的声源object上,你可以看到一个Audio Source 组件。在他的AudioClip field里选取你刚刚导入Unity的音频文件
    1. 勾选AudioSource 组件上的 “Play On Awake” 以及 “Loop” 选项
_images/1.7.png
    1. 点击play!你应该听到你的音频文件被空间化了。

集成 Pico Spatial Audio 引擎(环境声学模拟)

实时环境声学模拟是Pico 空间音频渲染器的重要功能模块,可以根据使用中的实际场景,实时计算并渲染出声源的声波传播至听者处所带来的反射声和混响。下面, 我们在上一章的基础上 ,带你接入环境声学模拟功能。

步骤如下:

    1. 在你的虚拟场景中,导入/构建你的环境建模
    1. 在你想参与模拟环境声学的环境模型对象上,加上PXR_Audio_Spatializer_SceneGeometry.cs组件。一个 PXR_Audio_Spatializer_SceneMaterial.cs 组件会被自动加上。
    1. 在PXR_Audio_Spatializer_SceneGeometry.cs中
    1. Include Children:用来设置该geometry描述的Mesh是否包含该game object的子对象
    2. Ignore Static:用来设置该geometry是否忽视静态mesh
    3. Visualize Mesh In Editor:在editor中,用白色线框显示与这个geometry相关联的game object. 该功能仅在editor中生效,不会影响 play mode 以及 build。
    1. 在PXR_Audio_Spatializer_SceneMaterial.cs中
    1. Absorption,Element 0 ~ 3:环境材质的吸收率。从element0 到element3为4个频段,由低到高。
    2. Scattering:环境材质的散射率。一个高散射率的环境,其反射声听上去会更像混响;而一个低散射率的环境,其反射声听上去会更像一个个独立的回声。
    3. Transmission:环境材质的透射率。透射率越高,穿过该几何形状的声音强度越大;反之则越弱。
    4. 你可以自行设计这些参数,也可以从material preset中选取我们准备好的预设,并且基于这些预设修改参数。
    _images/1.8.png

另外请注意:如果你的mesh是从外部导入Unity的话,请确认Read/Write Enabled选项被勾选了:

_images/1.9.png

集成 Pico Spatial Audio 引擎(Ambisonic 渲染)

我们的引擎提供了解码一阶AmbiX格式的ambisonic信号的能力。在unity 中,使用方法如下。

    1. 打开unity工程的project settings -> Audio
    1. 在Ambisonic Decoder Plugin选项卡处,选择Pico Ambisonic Decoder
_images/1.10.png
    1. 在工程中创建一个ambisonic渲染总线
    1. 在工程中创建一个Audio Mixer。为了方便表述,我们假设mixer的名字是“Ambisonic_bus”
    _images/1.11.png
    1. 单击Ambisonic_bus -> Master,右侧 Inspector 中出现通道条配置
    _images/1.12.png
    1. 单击Add Effect,添加Pico Ambisonic Renderer
    _images/1.13.png
    1. 在场景中创建一个game object,挂载 PXR_Audio_Spatializer_AmbisonicSource组件;一个Unity AudioSource会被自动引入
    1. 将 AudioSource 的 Output 设置为 Master(Ambisonic_bus)

至此,Ambisonic 声源回放配置完毕;我们来试听一下

    1. 在PicoSpatialAudio -> Sample -> audio 文件夹中,找到 loop_FOA_48k Audio Clip
    1. 把 loop_FOA_48k 拖拽到 AudioSource 的 AudioClip上
    1. 如你想使用其他AudioClip,请确保

    i . 它是一阶AmbiX格式的

    ii . 勾选该 AudioClip 的 “Ambisonic” 选项

    _images/1.14.png
    1. 勾选AudioSource 组件上的 “Play On Awake” 以及 “Loop” 选项
_images/1.15.png
    1. 点击play。如果你使用的 AudioClip 是 loop_FOA_48k,你应该能听到一个电子乐声源按照如下轨迹运动着:
    1. 先顺时针绕着listener水平旋转一周
    2. 然后先上,再下垂直转一圈

集成 Pico Spatial Audio 引擎(工具函数)

我们在引擎中提供了一些对象的工具函数,方便你创建想要的声音场景。所有工具函数都可以实时调用。

  • PXR_Audio_Spatializer_AudioSource

    • public void Resume()
      • 恢复播放该audio source
    • public void SetGainDB(float gainDB)
      • 设置这个source的增益,单位是分贝 dB
    • public void SetSize(float radius)
      • 设置这个source的半径长度,单位是米
  • PXR_Audio_Spatializer_AmbisonicSource

    • public void Resume()
      • 恢复播放该audio source
  • PXR_Audio_Spatializer_Context

    • public void SetRenderingQuality(PXR_Audio.Spatializer.RenderingMode quality)
      • 设置引擎的渲染质量

附录1:开发技巧

声源数量

  • 由于环境声学模拟和渲染对CPU负载较大,在使用环境声学模拟时,请确保同时发声的声源数量在20个以下。我们会持续优化性能,提升可同时发声的声源数量。

当前环境声学模拟的局限以及规避方法

  • 由于游戏中的场景场景可能较为复杂,直接往复杂场景上挂 PXR_Audio_Spatializer_SceneGeometry 组件可能会导致如下问题:

    • 场景中,若listener身处一个闭塞的小角落,他可能会听不到场景中某些声源的环境反射声
    • 场景中,若listener和source分处室内外,同时建筑的外墙形状又极其复杂,可能会使得listener听到不该听到的反射声(从室内传到室外,或者反过来)
  • 解决方法有如下几种:

    • 在想要反射声音的场景处,手动添加一些 Pico Sound Reflection Object(比如下图白色线框处)

      • 你可以在Pico Spatial Audio -> Prefabs 文件夹中找到 Pico Sound Reflection Object
      _images/1.16.png
    • 把场景的mesh分组成多个gameobject,只在室内的大型墙面上挂载 PXR_Audio_Spatializer_SceneGeometry 组件,而不要在过多的细节形状上挂载(比如桌椅、柱子等等)

    • 在游戏流程上规避,不要让玩家可以进入到会出错的场景区域

    • 我们会持续迭代我们的环境声学模拟算法,从而在未来发布的版本里简化/去除这些手工配置过程。

附录2:已知问题