重要
混合现实 Academy 教程设计时, (第一代 holoLens) ,Unity 2017 年,并混合现实沉浸式头戴显示设备。 因此,我们认为,对于仍在为这些设备进行开发指南的开发人员来说,保留这些教程非常重要。 这些教程不会使用用于HoloLens 2的最新工具集或交互进行更新,并且可能与较新版本的 Unity 不兼容。 适用于HoloLens 2的新教程系列。
空间声音 为全息影像注入活力,并赋予它们在我们的世界中的存在。 全息影像由光线和声音组成,如果碰巧看不到全息影像,空间音效可以帮助你找到它们。 空间声音与在收音机上听到的典型声音不一样,它是定位在 3D 空间中的声音。 借助空间音效,可以让全息影像听起来像你身后、在你旁边,甚至在你的头上! 在本课程中,你将:
- 将开发环境配置为使用Microsoft空间声音。
- 使用空间声音增强交互。
- 将空间声音与 空间映射配合使用。
- 了解声音设计和混合最佳做法。
- 使用声音来增强特殊效果,并将用户带入混合现实世界。
设备支持
| 课程 | HoloLens | 沉浸式头戴显示设备 |
|---|---|---|
| MR 空间 220:空间声音 | ✔️ | ✔️ |
准备工作
先决条件
- 配置了正确工具的Windows 10电脑。
- 一些基本的 C# 编程功能。
- MR Basics 101。
- 配置用于开发的 HoloLens 设备。
项目文件
- 下载项目所需的 文件 。 需要 Unity 2017.2 或更高版本。
- 将文件解压缩到桌面或其他易于访问的位置。
注意
如果要在下载之前查看源代码,可在 GitHub 上获取。
勘误表和备注
- 需要禁用“仅启用我的代码”, (取消选中 Visual Studio 中的“工具选项”>->“调试”) ,才能命中代码中的断点。
第 1 章 - Unity设置
目标
- 更改Unity的声音配置以使用Microsoft空间声音。
- 将 3D 声音添加到 Unity 中的 对象。
说明
- 启动Unity。
- 选择 “打开”。
- 导航到桌面并找到以前取消存档的文件夹。
- 单击“ 开始”\“分贝 ”文件夹,然后按 “选择文件夹” 按钮。
- 等待项目加载到 Unity。
- 在 “项目 ”面板中,打开 Scenes\Decibel.unity。
- 在 “层次结构 ”面板中,展开 “HologramCollection ”,然后选择“ P0LY”。
- 在检查器中,展开“AudioSource”,并注意到没有“空间化检查”框。
默认情况下,Unity不加载空间化器插件。 以下步骤在项目中启用空间音效。
- 在Unity的顶部菜单中,转到“编辑>项目设置>音频”。
- 找到 “空间化器插件 ”下拉列表,然后选择“ MS HRTF Spatializer”。
- 在 “层次结构 ”面板中,选择“ HologramCollection > P0LY”。
- 在 “检查器” 面板中,找到 “音频源” 组件。
- 选中 “空间化” 复选框。
- 将 “空间混合” 滑块一直拖动到 3D,或在编辑框中输入 1 。
在 Unity 中生成项目,并在 Visual Studio 中配置解决方案。
- 在“Unity”中,选择“文件>生成设置”。
- 单击“ 添加打开场景 ”以添加场景。
- 在“平台”列表中选择“通用 Windows 平台”,然后单击“切换平台”。
- 如果要专门为 HoloLens 进行开发,请将 “目标设备 ”设置为 “HoloLens”。 否则,请将其保留在 任何设备上。
- 确保“生成类型”设置为 D3D,SDK设置为“最新安装 (应为 SDK 16299 或更高版本) 。
- 单击“ 生成”。
- 创建名为“App” 的新文件夹 。
- 单击“ 应用 ”文件夹。
- 按 “选择文件夹”。
完成Unity后,将显示文件资源管理器窗口。
- 打开 “应用” 文件夹。
- 打开 Decibel Visual Studio 解决方案。
如果部署到 HoloLens:
- 使用 Visual Studio 中的顶部工具栏,将目标从“调试”更改为 “发布” ,将“ARM”更改为 “x86”。
- 单击“本地计算机”按钮旁边的下拉箭头,然后选择“ 远程计算机”。
- 输入 HoloLens 设备 IP 地址 ,并将“身份验证模式”设置为 “通用 (未加密协议) 。 单击“选择”。 如果不知道设备 IP 地址,请查看 “设置 > 网络 & Internet > 高级选项”。
- 在顶部菜单栏中,单击“ 调试 -> 启动但不调试” 或按 Ctrl + F5。 首次部署到设备时,需要 将其与 Visual Studio 配对。
如果部署到沉浸式头戴显示设备:
- 使用 Visual Studio 中的顶部工具栏,将目标从“调试”更改为 “发布” ,将“ARM”更改为 “x64”。
- 确保部署目标设置为 “本地计算机”。
- 在顶部菜单栏中,单击“ 调试 -> 启动但不调试” 或按 Ctrl + F5。
第 2 章 - 空间声音和交互
目标
- 使用声音增强全息影像真实感。
- 使用声音引导用户的视线。
- 使用声音提供手势反馈。
第 1 部分 - 增强现实主义
关键概念
- 空间化全息影像声音。
- 声源应放置在全息影像上的适当位置。
声音的适当位置将取决于全息影像。 例如,如果全息影像是人类的,则声源应位于嘴边而不是脚附近。
说明
以下说明将空间化声音附加到全息影像。
- 在 “层次结构 ”面板中,展开 “HologramCollection ”,然后选择“ P0LY”。
- 在 “检查器” 面板中的 “AudioSource”中,单击 “AudioClip ”旁边的圆圈,然后从弹出窗口中选择“ PolyHover ”。
- 单击“ 输出 ”旁边的圆圈,然后从弹出窗口中选择“ 声音效果 ”。
Project Decibel 使用 Unity AudioMixer 组件来调整声音组的声音级别。 通过以这种方式对声音进行分组,可以调整总体音量,同时保持每个声音的相对音量。
- 在 AudioSource 中,展开 “3D 声音设置”。
- 将 “多普勒级别 ”设置为 0。
将多普勒级别设置为零会禁用由全息影像或用户) 运动 (引起的音调变化。 多普勒的一个经典示例是一辆快速移动的汽车。 当汽车接近静止的侦听器时,发动机的音调上升。 当它通过侦听器时,音调会随着距离而降低。
第 2 部分 - 引导用户凝视
关键概念
- 使用声音来引起对重要全息影像的注意。
- 耳朵有助于引导眼睛应该看的地方。
- 大脑有一些学到的期望。
所学期望的一个例子是,鸟类通常高于人类的头部。 如果用户听到鸟鸣声,他们最初的反应是查找。 将鸟置于用户下方可能会导致它们面对正确的声音方向,但无法根据需要查找的期望找到全息影像。
说明
以下说明使 P0LY 能够隐藏在身后,以便你可以使用声音来查找全息影像。
- 在 “层次结构 ”面板中,选择“ 经理”。
- 在 “检查器” 面板中,找到 “语音输入处理程序”。
- 在 “语音输入处理程序”中,展开“ 转到隐藏”。
- 将 No 函数 更改为 PolyActions.GoHide。
第 3 部分 - 手势反馈
关键概念
- 使用声音为用户提供正面手势确认
- 不要淹没用户 - 过大的声音会妨碍用户
- 微妙的声音效果最好 - 不要掩盖体验
说明
- 在 “层次结构 ”面板中,展开 “HologramCollection”。
- 展开 “EnergyHub ”,然后选择“ 基本”。
- 在 “检查器” 面板中,单击“ 添加组件 ”并添加 “手势声音处理程序”。
- 在 “手势声音处理程序”中,单击 “导航开始剪辑 ”和“ 导航更新 剪辑”旁边的圆圈,然后从弹出窗口中选择“ 旋转” “两者”。
- 双击“GestureSoundHandler”以在 Visual Studio 中加载。
手势声音处理程序执行以下任务:
- 创建并配置 AudioSource。
- 将 AudioSource 放在相应 GameObject 的位置。
- 播放与手势关联的 AudioClip 。
生成和部署
- 在“Unity”中,选择“文件>生成设置”。
- 单击“ 生成”。
- 单击“ 应用 ”文件夹。
- 按 “选择文件夹”。
检查工具栏是否显示“发布”、“x86”或“x64”和“远程设备”。 否则,这是 Visual Studio 的编码实例。 可能需要从 App 文件夹重新打开解决方案。
- 如果出现提示,请重新加载项目文件。
- 与以前一样,从 Visual Studio 进行部署。
部署应用程序后:
- 观察在 P0LY 中移动时声音的变化。
- 说 出“隐藏” 以使 P0LY 移动到你身后的位置。 通过声音找到它。
- 凝视能源中心的基地。 点击并向左或向右拖动可旋转全息影像,并注意单击声音如何确认手势。
注意:有一个与你一起标记的文本面板。 这将包含可在本课程中使用的可用语音命令。
第 3 章 - 空间声音和空间映射
目标
- 使用声音确认全息影像与现实世界之间的交互。
- 使用物理世界遮挡声音。
第 1 部分 - 物理世界交互
关键概念
- 物理对象通常在遇到表面或其他对象时发出声音。
- 声音应在体验中适合上下文。
例如,在桌子上设置一个杯子应该发出比在一块金属上放一块巨石更安静的声音。
说明
- 在 “层次结构 ”面板中,展开 “HologramCollection”。
- 展开 “EnergyHub”,选择“ 基本”。
- 在 “检查器 ”面板中,单击“ 添加组件 ”,并添加 “点击放置声音和作”。
- 在 点击“使用声音和作放置”中:
- 选中 “点击时放置父级”。
- 将 “放置声音 ”设置为 “放置”。
- 将 “拾取声音” 设置为 “拾取”。
- 在“上车作”和“放置作”下按右下角的 +。 将 EnergyHub 从场景中拖动到 “无 (对象) 字段。
- 在“提货作”下,单击“无函数->EnergyHubBase-ResetAnimation>”。
- 在 “放置作”下,单击“ 无函数 ”->EnergyHubBase ->OnSelect”。
第 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%。
Audio Occluder 实现 IAudioInfluencer 以:
- 使用附加到 AudioSource 托管的 AudioLowPassFilter 应用遮挡效果,购买 AudioEmitter。
- 将音量衰减应用于 AudioSource。
- 通过设置中性截止频率并禁用筛选器来禁用效果。
用作中性的频率为 22 kHz (22000 Hz) 。 选择此频率是因为它高于人耳听到的标称最大频率,因此对声音没有明显影响。
- 在 “层次结构 ”面板中,选择“ 空间映射”。
- 在 “检查器” 面板中,单击“ 添加组件 ”并添加 “音频遮挡器”。
- 在 “音频遮挡”中,将 “截止频率 ”设置为 750。
当用户和 AudioEmitter 之间的路径中存在多个遮挡器时,会将最低频率应用于筛选器。
- 将 “音量直通” 设置为 0.75。
当用户和 AudioEmitter 之间的路径中存在多个遮挡器时,将累加应用音量通过。
- 在 “层次结构 ”面板中,选择“ 经理”。
- 在 “检查器” 面板中,展开 “语音输入处理程序”。
- 在 “语音输入处理程序”中,展开 “Go Charge”。
- 将 No 函数 更改为 PolyActions.GoCharge。
- 展开 “来到此处”。
- 将 No 函数 更改为 PolyActions.ComeBack。
生成和部署
- 与以前一样,在 Unity 中生成项目并在 Visual Studio 中部署。
部署应用程序后:
- 说 “充电” 让 P0LY 进入能源中心。
请注意声音中的更改。 它应该听起来闷闷不乐,稍微安静一点。 如果你能够在你和能源中心之间用一堵墙或其他物体来定位自己,你应该注意到由于现实世界的遮挡,声音进一步闷闷不乐。
- 说 “来这里” ,让P0LY离开能源中心,并把自己放在你面前。
P0LY 退出能源中心后,将删除声音遮挡。 如果仍然听到遮挡,P0LY 可能会被现实世界遮挡。 请尝试移动,确保对 P0LY 有清晰的视线。
第 3 部分 - 房间模型
关键概念
- 空间的大小提供有助于声音本地化的潜意识队列。
- 房间模型按 AudioSource 设置。
- 适用于 Unity 的 MixedRealityToolkit 提供了用于设置房间模型的代码。
- 对于混合现实体验,请选择最适合真实空间的房间模型。
如果要创建虚拟现实方案,请选择最适合虚拟环境的房间模型。
第 4 章 - 声音设计
目标
- 了解有效声音设计的注意事项。
- 了解混合技术和指南。
第 1 部分 - 声音和体验设计
本部分讨论关键声音和体验设计注意事项和指南。
规范化所有声音
这避免了特殊情况代码需要调整每个声音的音量级别,这可能非常耗时,并限制了轻松更新声音文件的能力。
针对不受束缚的体验进行设计
HoloLens 是一台完全包含的、不受限制的全息计算机。 用户可以在移动时使用你的体验。 请务必四处走动来测试音频混合。
从全息影像上的逻辑位置发出声音
在现实世界中,狗不会从尾巴上叫出来,人的声音也不会来自他们的脚。 避免让声音从全息影像的意外部分发出。
对于小型全息影像,从几何图形中心发出声音是合理的。
熟悉的声音最可本地化
人类的声音和音乐很容易本地化。 如果有人叫你的名字,你可以准确地确定声音来自哪个方向和距离多远。 短而不熟悉的声音更难本地化。
了解用户期望
生活经验在我们识别声音位置的能力中起着一定的作用,人类的声音很容易本地化。 在放置声音时,请务必了解用户所学的期望值。
例如,当有人听到鸟鸣声时,他们通常会抬头,因为鸟往往在飞行 (或树) 的视线之上。 用户向声音的正确方向翻转的情况并不少见,但在无法找到全息影像时,向错误的垂直方向看,并感到困惑或沮丧。
避免隐藏的发射器
在现实世界中,如果我们听到声音,我们通常可以识别发出声音的对象。 这在你的体验中也应如此。 用户听到声音、知道声音的来源以及无法看到对象,可能会非常令人不安。
此准则有一些例外。 例如,环境中的声音(如字段中的板球)不需要可见。 生活经验让我们熟悉这些声音的来源,而无需看到它。
第 2 部分 - 声音混合
在 HoloLens 上以 70% 的音量为目标组合
混合现实体验允许在现实世界中看到全息影像。 它们还应允许听到现实世界的声音。 70% 的音量目标使用户能够听到周围的世界以及你的体验的声音。
100% 音量的 HoloLens 应淹没外部声音
100% 的卷级别类似于虚拟现实体验。 从视觉上看,用户被传输到另一个世界。 同样,在听觉上应该成立。
使用 Unity AudioMixer 调整声音类别
在设计混合时,创建声音类别并能够增加或减少其音量作为一个单位通常很有帮助。 这可以保留每个声音的相对级别,同时可以快速轻松地更改整体混音。 常见类别包括:音效、氛围、配音和背景音乐。
根据用户的视线混合声音
根据用户 (或不) 外观的位置更改体验中的混合声音通常很有用。 此方法的一个常见用途是降低全息帧之外的全息影像的音量级别,以便用户更轻松地专注于它们前面的信息。 另一个用途是增加声音的音量,以将用户的注意力吸引到重要事件。
构建混合
生成混合时,建议从体验的背景音频开始,并根据重要性添加层。 通常,这会导致每个层比前一层响亮。
假设你的混合是一个倒置漏斗,底部) 最不重要的 (和通常最安静的声音,建议将混合结构如下图所示。
语音是一个有趣的场景。 根据正在创建的体验,你可能希望使用立体声 (未本地化) 声音或空间化语音。 两Microsoft发布的体验说明了每个方案的优秀示例。
HoloTour 使用立体声语音。 当讲述人描述正在查看的位置时,声音是一致的,并且不会因用户的位置而变化。 这使讲述人能够描述场景,而不会从环境的空间化声音中移走。
片段 以侦探的形式利用空间化语音。 侦探的声音用于帮助用户注意一个重要的线索,就好像房间里有一个真正的人一样。 这使你能够更深入地沉浸于解谜的体验中。
第 3 部分 - 性能
CPU 使用率
使用空间声音时,10 -12 个发射器将占用大约 12% 的 CPU。
流式传输长音频文件
音频数据可能很大,尤其是在 (44.1 和 48 kHz) 的常见采样率下。 一般规则是,应流式传输超过 5 到 10 秒的音频文件,以减少应用程序内存使用量。
在Unity中,可以在文件的导入设置中标记要流式传输的音频文件。
第 5 章 - 特殊效果
目标
- 将深度添加到“Magic Windows”。
- 将用户带入虚拟世界。
Magic Windows
关键概念
- 在隐藏世界中创建视图在视觉上很有吸引力。
- 当全息影像或用户靠近隐藏世界时,通过添加音频效果来增强现实感。
说明
- 在 “层次结构 ”面板中,展开 “HologramCollection ”,然后选择“ 黑社会”。
- 展开 “黑社会 ”,然后选择“ 语音源”。
- 在 “检查器” 面板中,单击“ 添加组件 ”并添加 “用户语音效果”。
AudioSource 组件已添加到 VoiceSource。
- 在 AudioSource 中,将 “输出 ”设置为 UserVoice (Mixer) 。
- 选中 “空间化” 复选框。
- 将 “空间混合” 滑块一直拖动到 3D,或在编辑框中输入 1 。
- 展开 “3D 声音设置”。
- 将 “多普勒级别 ”设置为 0。
- 在 “用户语音效果”中,将 “父对象 ”设置为场景中的 “黑社会 ”。
- 将 “最大距离 ”设置为 1。
设置 最大距离 告知 用户语音效果 在启用效果之前用户必须与父对象的距离。
- 在 “用户语音效果”中,展开 “合唱参数”。
- 将 “深度 ”设置为 0.1。
- 将点击 1 个卷、点击 2 个音量和 3 个音量设置为 0.8。
- 将 “原始音量” 设置为 0.5。
前面的设置配置用于为用户语音添加丰富性的 Unity AudioChorusFilter 的参数。
- 在 “用户语音效果”中,展开 “回显参数”。
- 将 “延迟” 设置为 300
- 将 “衰减比率” 设置为 0.2。
- 将 “原始音量” 设置为 0。
前面的设置配置用于使用户语音回显的 Unity AudioEchoFilter 的参数。
用户语音效果脚本负责:
- 测量用户与脚本所附加到的 GameObject 之间的距离。
- 确定用户是否面对 GameObject。
无论距离如何,用户都必须面对 GameObject,才能启用效果。
- 向 AudioSource 应用和配置 AudioChorusFilter 和 AudioEchoFilter。
- 通过禁用筛选器来禁用效果。
用户语音效果使用用于Unity的 MixedRealityToolkit 中的麦克风流选择器组件来选择高质量的语音流并将其路由到Unity的音频系统。
- 在 “层次结构 ”面板中,选择“ 经理”。
- 在 “检查器” 面板中,展开 “语音输入处理程序”。
- 在 “语音输入处理程序”中,展开 “显示黑社会”。
- 将 No 函数 更改为 UnderworldBase.OnEnable。
- 展开 “隐藏黑社会”。
- 将 No 函数 更改为 UnderworldBase.OnDisable。
生成和部署
- 与以前一样,在 Unity 中生成项目并在 Visual Studio 中部署。
部署应用程序后:
- 面对 (墙、地板、桌子) 的表面,说“展示黑社会”。
显示黑社会,并隐藏所有其他全息影像。 如果你看不到黑社会,请确保你面对的是真实的表面。
- 接近黑社会全息影像1米以内,开始说话。
现在,已将音频效果应用于语音!
- 远离黑社会,注意效果如何不再应用。
- 说 “隐藏黑社会” 以隐藏黑社会。
黑社会被隐藏,以前隐藏的全息影像重新出现。
结束
恭喜! 已完成 MR 空间 220:空间声音。
聆听世界,用声音将你的体验带入生活!