HoloLens(第一代)空间 220:空间音效

重要

混合现实学院教程在制作时考虑到了 HoloLens(第一代)、Unity 2017 和混合现实沉浸式头戴显示设备。 因此,对于仍在寻求这些设备的开发指导的开发人员而言,我们觉得很有必要保留这些教程。 我们不会在这些教程中更新 HoloLens 2 所用的最新工具集或交互相关的内容,因此这些教程可能与较新版本的 Unity 不相符。 我们将维护这些教程,使之持续适用于支持的设备。 已经为 HoloLens 2 发布了一系列新教程

空间音效焕发全息影像的生命力,并赋予其存在感。 全息影像由光和声组成,如果你看不到全息影像,空间音效可帮助你找到它们。 空间音效与在收音机中听到的典型音效不同,它是定位在 3D 空间中的音效。 借助空间音效,全息影像的声音如同在你身后、身边甚至头上传来的一样! 在本课程中,你将:

  • 配置开发环境以使用 Microsoft 空间音效。
  • 使用空间音效来增强交互。
  • 将空间音效与空间映射结合使用。
  • 了解音效设计和混音最佳做法。
  • 使用音效来增强特效,将用户带进混合现实世界。

设备支持

课程 HoloLens 沉浸式头戴显示设备
MR 空间 220:空间音效

开始之前

先决条件

项目文件

  • 下载项目所需的文件。 需要 Unity 2017.2 或更高版本。
    • 如果仍需要 Unity 5.6 支持,请使用此版本。 此版本可能不再是最新版本。
    • 如果仍需要 Unity 5.5 支持,请使用此版本。 此版本可能不再是最新版本。
    • 如果仍需要 Unity 5.4 支持,请使用此版本。 此版本可能不再是最新版本。
  • 将文件解压缩到桌面或其他易于访问的位置。

注意

如果要在下载源代码之前查看它,可以在 GitHub 上查看

勘误表和备注

  • 需要在 Visual Studio 中的“工具”->“选项”->“调试”下禁用(取消选中)“启用仅我的代码”,以便在代码中命中断点

第 1 章 - Unity 设置

目标

  • 将 Unity 的音效配置更改为使用 Microsoft 空间音效。
  • 在 Unity 中为对象添加 3D 音效。

说明

  • 启动 “Unity”。
  • 选择打开
  • 导航到桌面,并找到前面解压缩的文件夹。
  • 单击“Starting\Decibel”文件夹,然后按下“选择文件夹”按钮
  • 等待项目在 Unity 中加载。
  • 在“项目”面板中,打开“Scenes\Decibel.unity”
  • 在“层次结构”面板中,展开“HologramCollection”并选择“P0LY”
  • 在“检查器”中展开“AudioSource”,你将发现没有“空间化”复选框

默认情况下,Unity 不会加载空间定位器插件。 以下步骤将在项目中启用空间音效。

  • 在 Unity 的顶部菜单中,转到“编辑”>“项目设置”>“音频”
  • 找到“空间定位器插件”下拉菜单,选择“MS HRTF 空间定位器”
  • 在“层次结构”面板中,选择“HologramCollection”>“P0LY”
  • 在“检查器”面板中,找到“音频源”组件
  • 选中“空间化”复选框
  • 将“空间混合”滑块一直拖到“3D”,或者在编辑框中输入“1”

现在,我们将在 Unity 中生成项目并在 Visual Studio 中配置解决方案。

  1. 在 Unity 中,选择“文件”>“生成设置”
  2. 单击“添加开放式场景”以添加场景
  3. 在“平台”列表中选择“通用 Windows 平台”,然后单击“切换平台”
  4. 如果专门针对 HoloLens 进行开发,请将“目标设备”设置为“HoloLens”。 否则,请将此选项保留为“任何设备”
  5. 确保将“生成类型”设置为“D3D”,将“SDK”设置为“最新安装版本”(应该是 SDK 16299 或更高版本)
  6. 单击“生成”
  7. 创建名为“App”的新文件夹
  8. 单击“App”文件夹
  9. 按“选择文件夹”

完成 Unity 设置后,将出现一个文件资源管理器窗口。

  1. 打开“App”文件夹。
  2. 打开“分贝 Visual Studio 解决方案”

如果是部署到 HoloLens:

  1. 使用 Visual Studio 中的顶部工具栏,将目标从“调试”更改为“发布”,并从“ARM”更改为“x86”
  2. 单击“本地计算机”按钮旁边的下拉箭头,然后选择“远程计算机”
  3. 输入 HoloLens 设备 IP 地址,将“身份验证模式”设置为“通用(未加密协议)”。 单击“选择”。 如果你不知道自己的设备 IP 地址,可以在“设置”>“网络和 Internet”>“高级选项”中找到。
  4. 在顶部菜单栏中,单击“调试”->“开始执行(不调试)”或按 Ctrl + F5。 如果这是你第一次部署到设备,需要将设备与 Visual Studio 配对

如果部署到沉浸式头戴显示设备:

  1. 使用 Visual Studio 中的顶部工具栏,将目标从“调试”更改为“发布”,并从“ARM”更改为“x64”
  2. 确保部署目标设置为“本地计算机”
  3. 在顶部菜单栏中,单击“调试”->“开始执行(不调试)”或按 Ctrl + F5

第 2 章 - 空间音效和交互

目标

  • 使用音效增强全息影像的真实感。
  • 使用音效引导用户的视线。
  • 使用音效提供手势反馈。

第 1 部分 - 增强真实感

重要概念

  • 空间化全息影像音效。
  • 应将声源放在全息影像上的适当位置。

声源放在哪个位置合适取决于全息影像。 例如,如果是人的全息影像,则应将声源定位在嘴的附近而不是脚的附近。

说明

下面说明如何将空间化音效附加到全息影像。

  • 在“层次结构”面板中,展开“HologramCollection”并选择“P0LY”
  • 在“检查器”面板上的“AudioSource”中,单击“AudioClip”旁边的圆圈,然后从弹出窗口中选择“PolyHover”
  • 单击“输出”旁边的圆圈,然后从弹出窗口中选择“SoundEffects”

“项目分贝”使用 Unity AudioMixer 组件来调整音效组的声压级。 以这种方式对音效进行分组,可以在保持每个音效的相对音量的同时调整总体音量。

  • 在“AudioSource”中展开“3D 音效设置”
  • 将“多普勒级别”设置为“0”

将多普勒级别设置为零会禁用运动(全息影像或用户)造成的音高变化。 快速行进的汽车就是一个典型的多普勒例子。 当汽车接近静止的听者时,发动机的音高会升高。 当它驶离听者时,音高会随着距离而不断降低。

第 2 部分 - 引导用户的视线

重要概念

  • 使用音效来吸引对重要全息影像的注意力。
  • 耳朵有助于引导眼睛注视某个位置。
  • 大脑有一些习得性预期。

习得性预期的一个例子是鸟类一般在人类头顶上方飞翔。 当用户听到鸟鸣声时,他们的第一反应就是抬头。 将鸟放在用户下方可能会导致他们面向正确的音效方向,但无法根据需要抬头这一预期找到全息影像。

说明

下面说明如何使 P0LY 隐藏在身后,以便可以使用音效来定位全息影像。

  • 在“层次结构”面板中,选择“管理器”
  • 在“检查器”面板中,找到“语音输入处理程序”
  • 在“语音输入处理程序”中,展开“隐藏”
  • 将“无函数”更改为“PolyActions.GoHide”

Keyword: Go Hide

第 3 部分 - 手势反馈

重要概念

  • 使用音效为用户提供积极的手势确认
  • 不要让用户感到心烦 - 太响的音效只会产生负面作用
  • 微妙的音效效果最好 - 不要掩盖体验的精华所在

说明

  • 在“层次结构”面板中,展开“HologramCollection”
  • 展开“EnergyHub”并选择“Base”
  • 在“检查器”面板中,单击“添加组件”并添加“手势音效处理程序”
  • 在“手势音效处理程序”中,单击“导航开始剪辑”和“导航更新剪辑”旁边的圆圈,然后从弹出窗口中为两者选择“RotateClick”
  • 双击“GestureSoundHandler”将其加载到 Visual Studio 中。

手势音效处理程序执行以下任务:

  • 创建并配置“AudioSource”
  • 将“AudioSource”放在适当的“GameObject”位置
  • 播放与手势关联的“AudioClip”

生成和部署

  1. 在 Unity 中,选择“文件”>“生成设置”
  2. 单击“生成”
  3. 单击“App”文件夹
  4. 按“选择文件夹”

检查工具栏中是否显示了“版本”、“x86”或“x64”和“远程设备”。 如果没有,则表示这是 Visual Studio 的编程实例。 可能需要从 App 文件夹重新打开解决方案。

  • 如果出现提示,请重新加载项目文件。
  • 像前面一样,从 Visual Studio 部署。

部署应用程序后:

  • 观察在 P0LY 周围移动时音效的变化。
  • 说出“隐藏”,让 P0LY 移动到你身后的位置。 通过音效找到它。
  • 凝视能源中心的基座。 点击并向左或向右拖动以旋转全息影像,并注意单击音效如何确认手势。

注意:有一个文本面板会跟随你。 此面板包含可在整个课程中使用的语音命令。

第 3 章 - 空间音效和空间映射

目标

  • 使用音效来确认全息影像与现实世界之间的交互。
  • 使用物理世界遮挡音效。

第 1 部分 - 物理世界交互

重要概念

  • 物理对象在遇到表面或其他对象时通常会发出声音。
  • 声音应与体验中的上下文相适应。

例如,将杯子放在桌子上的声音应该比将一块巨石砸在一块金属上的声音更小。

说明

  • 在“层次结构”面板中,展开“HologramCollection”
  • 展开“EnergyHub”,选择“Base”
  • 在“检查器”面板中,单击“添加组件”并添加“使用音效和操作点击以放置”
  • 在“使用音效和操作点击以放置”中
    • 选中“在点击时放置父项”
    • 将“放置音效”设置为“放置”
    • 将“拾取音效”设置为“拾取”
    • 按下“执行拾取操作时”和“执行放置操作时”右下角的“+”。 将 EnergyHub 从场景拖放到“无(对象)”字段中
      • 在“执行拾取操作时”下,单击“无函数”->“EnergyHubBase”->“ResetAnimation”
      • 在“执行放置操作时”下,单击“无函数”->“EnergyHubBase”->“OnSelect”

Tap To Place With Sound And Action

第 2 部分 - 音效遮挡

重要概念

  • 与光一样,声音也是可以遮挡的。

典型的例子是音乐厅。 当听众站在大厅外并且门已关闭时,音乐听起来就很沉闷。 通常音量也会降低。 打开门后,就能以实际音量听到全频谱的声音。 高频声音通常比低频更容易吸收。

说明

  • 在“层次结构”面板中,展开“HologramCollection”并选择“P0LY”
  • 在“检查器”面板中,单击“添加组件”并添加“音频发射器”

音频发射器类提供以下功能:

  • 还原对 AudioSource 音量的任何更改
  • 从用户位置朝 AudioEmitter 附加到的 GameObject 的方向执行 Physics.RaycastNonAlloc

RaycastNonAlloc 方法用作性能优化,以限制分配以及返回的结果数。

  • 对于遇到的每个 IAudioInfluencer,调用 ApplyEffect 方法
  • 对于不再遇到的前面每个 IAudioInfluencer,调用 RemoveEffect 方法

请注意,AudioEmitter 在人类时间标度上更新,而不是根据每帧更新。 这样做是因为人类的运动速度一般不够快,以至于需要比每四分之一秒或半秒更频繁地更新效果。 从一个位置快速传送到另一个位置的全息影像可以打破这种假象。

  • 在“层次结构”面板中,展开“HologramCollection”
  • 展开“EnergyHub”并选择“BlobOutside”
  • 在“检查器”面板中,单击“添加组件”并添加“音频遮挡器”
  • 在“音频遮挡器”中,将“截止频率”设置为“1500”

此设置将 AudioSource 频率限制为 1500 Hz 或更低。

  • 将“音量直通”设置为“0.9”

此设置将 AudioSource 的音量降低至其当前音量的 90%。

音频遮挡器实现 IAudioInfluencer 以:

  • 使用 AudioLowPassFilter(附加到通过 AudioEmitter 管理的 AudioSource)应用遮挡效果
  • 将音量衰减应用于 AudioSource。
  • 通过设置中性截止频率并禁用筛选器来禁用效果。

中性频率为 22 kHz (22000 Hz)。 选择此频率是因为它高于人耳可以听到的标称最大频率,对音效不会造成明显的影响。

  • 在“层次结构”面板中,选择“SpatialMapping”
  • 在“检查器”面板中,单击“添加组件”并添加“音频遮挡器”
  • 在“音频遮挡器”中,将“截止频率”设置为“750”

当用户与 AudioEmitter 之间的路径中存在多个遮挡物时,最低频率将应用于筛选器

  • 将“音量直通”设置为“0.75”

当用户与 AudioEmitter 之间的路径中存在多个遮挡物时,将以加法形式应用音量直通

  • 在“层次结构”面板中,选择“管理器”
  • 在“检查器”面板中,展开“语音输入处理程序”
  • 在“语音输入处理程序”中,展开“充电”
  • 将“无函数”更改为“PolyActions.GoCharge”

Keyword: Go Charge

  • 展开“过来”
  • 将“无函数”更改为“PolyActions.ComeBack”

Keyword: Come Here

生成和部署

  • 与前面一样,在 Unity 中生成项目,并在 Visual Studio 中部署项目。

部署应用程序后:

  • 说出“充电”,让 P0LY 进入能源中心

注意音效的变化。 它应该听起来很低沉、更安静。 如果可以用墙壁或其他对象将自己定位在你与能源中心之间,则你应会注意到,由于现实世界的遮挡,音效会进一步减弱。

  • 说出“过来”,让 P0LY 离开能源中心并定位在你面前

请注意,一旦 P0LY 退出能源中心,就会消除音效遮挡。 如果仍然能感受到遮挡,则 P0LY 可能是被现实世界遮挡了。 尝试移动以确保清晰看到 P0LY。

第 3 部分 - 房间模型

重要概念

  • 空间大小提供了有助于音效定位的潜意识队列。
  • 房间模型是按 AudioSource 设置的
  • MixedRealityToolkit for Unity 提供了用于设置房间模型的代码。
  • 对于混合现实体验,请选择最适合现实世界空间的房间模型。

如果你正在创建虚拟现实场景,请选择最适合虚拟环境的房间模型。

第 4 章 - 音效设计

目标

  • 了解有效音效设计的注意事项。
  • 学习混音技术和准则。

第 1 部分 - 音效和体验设计

本部分讨论关键的音效和体验设计注意事项及准则。

规范化所有音效

这可以避免使用特殊代码来调整每个音效的音量级别,否则此过程可能很耗时并且不能很轻松地更新音效文件。

无拘束体验设计

HoloLens 是一台完全自主性的、无拘束的全息计算机。 用户可以一边走动一边使用你的体验,而且乐在其中。 请务必通过四处走动来测试混音。

从全息影像上的逻辑位置发出声音

在现实世界中,狗的尾巴不会发出叫声,人也不会从脚发出声音。 避免从全息影像的意外部位发出声音。

对于较小的全息影像,从几何体的中心发出声音是合理的。

熟悉的声音最容易定位

人声和音乐很容易定位。 如果有人呼唤你的名字,则你可以非常准确地确定语音来自哪个方向,距你有多远。 短促而陌生的声音更难定位。

知道用户的预期

生活经验在我们识别声音位置的能力中发挥着重要作用。 这就是人声特别容易定位的原因之一。 在放置音效时,知道用户的预期非常重要。

例如,当人们听到鸟鸣时,他们通常会抬头看,因为鸟儿往往在视线上方(在飞翔或者在树上)。 一种不少见的情况是,用户朝着正确的声音方向转头,但却朝着错误的垂直方向望去,因此无法找到全息影像,并从而变得困惑或沮丧。

避免隐藏的发射器

在现实世界中,如果我们听到声音,则我们通常可以识别出发出声音的对象。 在你的体验中应该也是如此。 对于用户来说,听到声音、知道声音的来源但无法看到对象可能会非常令人不安。

这项准则存在几种例外情况。 例如,野外蟋蟀声之类的环境音效不需要是可见的。 生活经验使得我们无需亲眼看到就能知道这些声音的来源。

第 2 部分 - 混音

在 HoloLens 上将混音目标设为 70% 的音量

混合现实体验允许全息影像出现在现实世界中。 它们还应该允许现实世界的声音被听到。 70% 的音量目标使用户能够听到周围的世界以及你的体验音效。

设为 100% 的音量时,HoloLens 应该会淹没外部音效

100% 的音量级别类似于虚拟现实体验。 在视觉上,用户将传送到一个不同的世界。 听觉上应该也是如此。

使用 Unity AudioMixer 调整音效类别

设计混音时,如果创建音效类别并能够将其作为一个单元来提高或降低音量,则通常会很有帮助。 这可以保留每个音效的相对级别,同时可以快速轻松地更改整体混音。 常见的类别包括:音效、氛围、画外音和背景音乐。

根据用户的视线进行混音

在体验中根据用户正在(或不在)注视的位置更改混音通常很有用。 这种技术的一种常见用途是降低全息帧以外的全息影像的音量级别,使用户更容易专注于他们面前的信息。 另一种用途是提高音效的音量,以将用户的注意力吸引到重要事件上。

制作混音

制作混音时,建议从体验的背景音频开始,并根据重要性添加层。 通常,这会导致每一层比前一层更响亮。

将混音想象成一个倒置的漏斗,最不重要的(通常是最安静的)音效放在底部。建议如下图所示构建混音。

Sound mix structure

画外音是一个有趣的场景。 根据正在创建的体验,你可能希望使用立体声(非定位)音效或空间化画外音。 Microsoft 发布的两个体验极好地演示了每个场景的示例。

HoloTour 使用立体声画外音。 当讲述人描述正在查看的位置时,音效将保持一致,不会根据用户的位置而变化。 这使得讲述人能够在不关掉环境的空间化音效的情况下描述场景。

Fragments 以侦探形式使用空间化的画外音。 侦探音效用于帮助将用户的注意力吸引到重要提示上,就好像房间里有真人一样。 这使得用户更沉浸在一种解开谜团的体验中。

第 3 部分 - 性能

CPU 使用率

使用空间音效时,10 - 12 个发射器将占用大约 12% 的 CPU。

流式传输长音频文件

音频数据可能很大,尤其是在采用常见采样率(44.1 和 48 kHz)的情况下。 一般规则是,应流式传输长度超过 5 - 10 秒的音频文件,以减少应用程序的内存使用量。

在 Unity 中,可以在文件的导入设置中标记要流式传输的音频文件。

Audio import settings

第 5 章 - 特效

目标

  • 为“魔窗”增加深度。
  • 将用户带入虚拟世界。

魔窗

重要概念

  • 在隐藏的世界中创建视图会带来引人入胜的视觉效果。
  • 当全息影像或用户靠近隐藏的世界时,可以添加音频效果来增强真实感。

说明

  • 在“层次结构”面板中,展开“HologramCollection”并选择“Underworld”
  • 展开“Underworld”并选择“VoiceSource”
  • 在“检查器”面板中,单击“添加组件”并添加“用户语音效果”

“AudioSource”组件将添加到“VoiceSource”

  • 在“AudioSource”中,将“输出”设置为“用户语音(混音器)”
  • 选中“空间化”复选框
  • 将“空间混合”滑块一直拖到“3D”,或者在编辑框中输入“1”
  • 展开“3D 音效设置”
  • 将“多普勒级别”设置为“0”
  • 在“用户语音效果”中,将“父对象”设置为场景中的“Underworld”
  • 将“最大距离”设置为“1”

设置“最大距离”会告知“用户语音效果”在启用该效果之前用户必须离父对象有多远

  • 在“用户语音效果”中,展开“和声参数”
  • 将“深度”设置为“0.1”
  • 将“点击 1 音量”、“点击 2 音量”和“点击 3 音量”设置为“0.8”
  • 将“原始音量”设置为“0.5”

上述设置将配置 Unity AudioChorusFilter 的参数,这些参数使用户语音变得更丰富

  • 在“用户语音效果”中,展开“回声参数”
  • 将“延迟”设置为“300”
  • 将“衰减率”设置为“0.2”
  • 将“原始音量”设置为“0”

上述设置将配置 Unity AudioEchoFilter 的参数,这些参数导致用户语音产生回声

用户语音效果脚本负责:

  • 测量用户与脚本所附加到的 GameObject 之间的距离
  • 确定用户是否面对 GameObject

无论距离多远,用户都必须面向 GameObject 才能启用该效果。

  • 将 AudioChorusFilter 和 AudioEchoFilter 应用并配置到 AudioSource
  • 通过禁用筛选器来禁用效果。

用户语音效果使用 MixedRealityToolkit for Unity 中的麦克风流选择器组件来选择高质量的语音流并将其路由到 Unity 的音频系统中

  • 在“层次结构”面板中,选择“管理器”
  • 在“检查器”面板中,展开“语音输入处理程序”
  • 在“语音输入处理程序”中,展开“显示地下世界”
  • 将“无函数”更改为“UnderworldBase.OnEnable”

Keyword: Show Underworld

  • 展开“隐藏地下世界”
  • 将“无函数”更改为“UnderworldBase.OnDisable”

Keyword: Hide Underworld

生成和部署

  • 与前面一样,在 Unity 中生成项目,并在 Visual Studio 中部署项目。

部署应用程序后:

  • 面对一个表面(墙壁、地面、桌子)并说出“显示地下世界”

地下世界将会显示,所有其他全息影像将会隐藏。 如果看不到地下世界,请确保面对真实世界中的表面。

  • 靠近距离地下世界全息影像 1 米范围以内并开始说话。

现在,音频效果已应用于你的语音!

  • 远离地下世界,你将发现不再应用该效果。
  • 说出“隐藏地下世界”以隐藏地下世界

地下世界将会隐藏,之前隐藏的全息影像将重新出现。

结束

祝贺你! 现已完成“MR 空间 220:空间音效”

聆听世界,用音效赋予体验生命力!