HoloLens (第 1 代) Spatial 220:空間音效
重要
Mixed Reality Academy 教學課程是使用 HoloLens (第 1 代) 、Unity 2017 和 Mixed Reality 沈浸式頭戴式裝置所設計。 因此,對於仍在尋找這些裝置開發指引的開發人員而言,我們覺得這些教學課程很重要。 這些教學課程不會使用用於 HoloLens 2 的最新工具組或互動進行更新,而且可能無法與較新版本的 Unity 相容。 系統會保留這些資訊,以繼續在支援的裝置上運作。 已針對 HoloLens 2 公佈一系列新的教學課程。
空間音效 可讓生命進入全像投影,並讓他們存在於我們的世界中。 全像投影是由光線和音效所組成,如果您看到全像投影,空間音效可協助您找到它們。 空間音效不像您在無線電上聽到的一般音效,它是位於 3D 空間的音效。 透過空間音效,您可以讓全像投影聽起來像位於您後面、您旁邊,或甚至是在您的頭上! 在此課程中,您將:
- 將您的開發環境設定為使用 Microsoft Spatial Sound。
- 使用空間音效來增強互動。
- 搭配 空間對應使用空間音效。
- 瞭解音效設計和混合最佳做法。
- 使用音效來增強特殊效果,並將使用者帶入 Mixed Reality 世界。
裝置支援
課程 | HoloLens | 沉浸式頭戴裝置 |
---|---|---|
MR Spatial 220:空間音效 | ✔️ | ✔️ |
在您開始使用 Intune 之前
必要條件
- Windows 10 已安裝正確工具的計算機。
- 一些基本的 C# 程式設計能力。
- 您應該已完成 MR Basics 101。
- 已 設定用於開發的 HoloLens 裝置。
專案檔
- 下載專案所需的 檔案 。 需要 Unity 2017.2 或更新版本。
- 將檔案解除封存到桌面或其他容易觸達的位置。
注意
如果您想要在下載之前查看原始程式碼,可在 GitHub 上取得。
Errata 和 Notes
- 必須在 Visual Studio 的 [工具->選項偵>錯] 下停用 [啟用 Just My Code] (未核取的) ,才能在程式代碼中叫用斷點。
第 1 章 - Unity 設定
目標
- 將 Unity 的音效設定變更為使用 Microsoft Spatial Sound。
- 將 3D 音效新增至 Unity 中的物件。
指示
- 啟動 Unity。
- 選取 [開啟]。
- 瀏覽至您的桌面,並尋找您先前未封存的資料夾。
- 按兩下 [開始\Decibel ] 資料夾,然後按 [ 選取資料夾 ] 按鈕。
- 等候專案在 Unity 中載入。
- 在 [專案] 面板中,開啟 Scenes\Decibel.unity。
- 在 [ 階層] 面板中,展開 [全像投影][集合 ],然後選取 [P0LY]。
- 在 [偵測器] 中,展開 [AudioSource ],並注意到沒有 [空間化 ] 複選框。
根據預設,Unity 不會載入空間化程式外掛程式。 下列步驟會在項目中啟用空間音效。
- 在 Unity 的頂端選單中,移至 [編輯 > 項目設定 > 音訊]。
- 尋找 [空間化程式外掛程式 ] 下拉式清單,然後選取 [MS HRTF Spatializer]。
- 在 [ 階層] 面板中,選取 [HologramCollection > P0LY]。
- 在 [偵測器 ] 面板中,尋找 [音訊來源] 元件。
- 選取 [Spatialize] \(空間化\) 核取方塊。
- 將 空間混合 滑桿一直拖曳到 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 位址,請查看 [設定 > 網络] & [因特網 > 進階選項]。
- 在頂端功能表欄中,按一下 [偵錯 - 啟動但不>偵錯],或按 Ctrl + F5。 如果這是第一次部署到您的裝置,您必須 將它與 Visual Studio 配對。
如果部署至沉浸式頭戴裝置:
- 使用 Visual Studio 中的頂端工具列,將目標從 [偵錯] 變更為 [發行 ],並將目標從 ARM 變更為 x64。
- 請確定部署目標已設定為 本機計算機。
- 在頂端功能表欄中,按一下 [偵錯 - 啟動但不>偵錯],或按 Ctrl + F5。
第 2 章 - 空間音效和互動
目標
- 使用音效增強全像投影實境。
- 使用音效引導用戶的注視。
- 使用音效提供手勢回饋。
第 1 部分 - 增強實境
重要概念
- 空間化全像投影音效。
- 音效來源應該放在全像投影的適當位置。
音效的適當位置將取決於全像投影。 例如,如果全像投影是人類,音效來源應該位於靠近口附近,而不是腳部。
指示
下列指示會將空間化音效附加至全像投影。
- 在 [ 階層] 面板中,展開 [全像投影][集合 ],然後選取 [P0LY]。
- 在 [偵測器 ] 面板中的 [AudioSource] 中,按兩下 AudioClip 旁的圓形,然後從彈出視窗中選取 [PolyHover ]。
- 按兩下 [ 輸出 ] 旁的圓形,然後從彈出視窗中選取 SoundEffects 。
Project Decibel 使用 Unity AudioMixer 元件,為音效群組啟用調整音效等級。 藉由以這種方式分組音效,可以調整整體音量,同時維持每個音效的相對音量。
- 在 AudioSource 中,展開 [3D 音效設定]。
- 將 Doppler 層級 設定為 0。
將 Doppler 層級設定為零會停用動作 (或使用者) 所造成的音調變更。 Doppler 的傳統範例是快速移動的汽車。 當汽車接近固定接聽程式時,引擎的音調就會增加。 當接聽程式通過時,音調會隨著距離而降低。
第 2 部分 - 引導使用者的注視
重要概念
- 使用音效來注意重要的全像投影。
- 耳機可協助引導眼睛看起來的位置。
- 大腦有一些學習到的期望。
學習到期望的其中一個範例是,鳥通常高於人類頭部。 如果用戶聽到鳥聲,則其初始反應是查閱。 將鳥放在使用者下方,可能會導致他們面臨聲音的正確方向,但無法根據需要查閱的預期找到全像投影。
指示
下列指示可讓 P0LY 隱藏在您後方,以便使用音效來找出全像投影。
- 在 [ 階層] 面板中,選取 [ 管理員]。
- 在 [偵測器] 面板中,尋找 語音輸入處理程式。
- 在 [語音輸入處理程式] 中,展開 [移至隱藏]。
- 將 No 函 式變更為 PolyActions.GoHide。
第 3 部分 - 手勢意見反應
重要概念
- 使用音效為使用者提供正面手勢確認
- 不要讓使用者過度大聲聲響起
- 細微音效效果最佳 - 不要遮蔽體驗
指示
- 在 [ 階層] 面板中,展開 全像投影Collection。
- 展開 [EnergyHub ],然後選取 [ 基底]。
- 在 [偵測器 ] 面板中,按兩下 [ 新增元件 ],然後新增 手勢音效處理程式。
- 在 [手勢音效處理程式] 中,按兩下 導覽開始剪輯 和 導覽更新剪輯 旁的圓形,然後從兩者的彈出視窗中選取 RotateClick 。
- 按兩下 “GestureSoundHandler” 以在Visual Studio 中載入。
手勢音效處理程式會執行下列工作:
- 建立及設定 AudioSource。
- 將 AudioSource 放在適當 GameObject 的位置。
- 播放與手勢相關聯的 AudioClip 。
建置和部署
- 在 Unity 中,選取 [ 檔案 > 建置設定]。
- 按一下 [建置]。
- 按兩下 [ 應用程式 ] 資料夾。
- 按 [選取資料夾]。
檢查工具列是否顯示 「發行」、「x86」或「x64」和「遠端裝置」。 如果沒有,這是Visual Studio的編碼實例。 您可能需要從 [應用程式] 資料夾重新開啟解決方案。
- 如果出現提示,請重載項目檔。
- 如同先前一樣,從 Visual Studio 部署。
部署應用程式之後:
- 觀察音效在您繞著 P0LY 移動時如何變更。
- 說 「移至隱藏」 ,讓 P0LY 移至您後方的位置。 依音效尋找它。
- 注視能源中樞的基底。 點選左或向右旋轉全像投影,並注意按兩下音效如何確認手勢。
注意:有一個文字面板會與您一起標記。 這將會包含您可以在本課程中使用的可用語音命令。
第 3 章 - 空間音效和空間對應
目標
- 使用音效確認全像投影與真實世界之間的互動。
- 使用實體世界遮蔽音效。
第 1 部分 - 實體世界互動
重要概念
- 當遇到表面或其他物件時,實體物件通常會發出音效。
- 音效應該是體驗中適當的內容。
例如,在數據表上設定杯子應該比在一塊金屬上卸除布爾值更靜音。
指示
- 在 [ 階層] 面板中,展開 全像投影Collection。
- 展開 [EnergyHub],選取 [ 基底]。
- 在 [偵測器 ] 面板中,按兩下 [ 新增元件 ],然後新增 [點選到使用音效和動作放置]。
- 在 點選 [使用音效和動作放置] 中:
- 點選 [放置父系]。
- 將 [放置音效 ] 設定為 [放置]。
- 將 [取貨音效 ] 設定為 [取貨]。
- 在 [ 上車動作 ] 和 [ 放置動作] 下,按右下角的 [ + ]。 將 EnergyHub 從場景拖曳到 [無] ([物件) ] 字段。
- 在 [取貨動作] 下,按兩下 [無函式 ->EnergyHubBase ->ResetAnimation]。
- 在 [放置動作] 底下,按兩下 [無函式 ->EnergyHubBase ->OnSelect]。
第 2 部分 - 音效遮蔽
重要概念
- 音效,例如光線,可以遮蔽。
傳統範例是一個音樂場。 當接聽程式位於大廳外,而門已關閉時,音樂音效會混音。 通常也會減少磁碟區。 當門開啟時,會在實際音量上聽到音效的完整範圍。 高頻率音效通常會被吸收超過低頻率。
指示
- 在 [ 階層] 面板中,展開 [全像投影][集合 ],然後選取 [P0LY]。
- 在 [偵測器 ] 面板中,按兩下 [ 新增元件 ],然後新增 音訊發出器。
音訊發出器類別提供下列功能:
- 將任何變更還原至 AudioSource 的磁碟區。
- 從使用者的位置執行 Physics.RaycastNonAlloc,其方向為 AudioEmitter 所附加的 GameObject 方向。
RaycastNonAlloc 方法可用來做為效能優化,以限制配置以及傳回的結果數目。
- 針對每個 遇到 IAudioInfluencer ,呼叫 ApplyEffect 方法。
- 針對不再遇到的每個先前 IAudioInfluencer ,呼叫 RemoveEffect 方法。
請注意,AudioEmitter 會根據人為時間調整來更新,而不是以每個畫面為基礎。 這是因為人類通常無法快速移動,因此效果需要比每季或半秒更頻繁地更新。 從某個位置快速傳送到另一個位置的全像投影可能會中斷假像。
- 在 [ 階層] 面板中,展開 全像投影Collection。
- 展開 [EnergyHub ],然後選取 [ BlobOutside]。
- 在 [偵測器 ] 面板中,按兩下 [ 新增元件 ],然後新增 音訊遮蔽器。
- 在 [音訊遮蔽器] 中,將 [關閉頻率 ] 設定為 1500。
此設定會將 AudioSource 頻率限製為 1500 Hz 和以下。
- 將 磁碟區傳遞 設定為 0.9。
此設定會將 AudioSource 的音量減少為目前層級的 90%。
音訊遮蔽器會實作 IAudioInfluencer 以:
- 使用 AudioLowPassFilter 套用遮蔽效果,該效果會附加至 AudioSource 受控購買 AudioEmitter。
- 將音量衰減套用至 AudioSource。
- 藉由設定中性截斷頻率並停用篩選條件,以停用效果。
作為中性使用的頻率是 22 kHz (22000 Hz) 。 由於此頻率高於人類聽聽到的最大頻率,因此不會對音效造成可辨識的影響。
- 在 [ 階層] 面板中,選取 [SpatialMapping]。
- 在 [偵測器 ] 面板中,按兩下 [ 新增元件 ],然後新增 音訊遮蔽器。
- 在 [音訊遮蔽器] 中,將 [關閉頻率 ] 設定為 750。
當多個遮蔽器位於使用者與 AudioEmitter 之間的路徑時,最低頻率會套用至篩選。
- 將 磁碟區傳遞 設定為 0.75。
當多個遮蔽器位於使用者與 AudioEmitter 之間的路徑時,會加加套用音量通過。
- 在 [ 階層] 面板中,選取 [ 管理員]。
- 在 [偵測器] 面板中,展開 [語音輸入處理程式]。
- 在 [語音輸入處理程式] 中,展開 [Go Charge]。
- 將 No 函式變更為 PolyActions.GoCharge。
- 展開 [在這裡]。
- 將 No 函式 變更為 PolyActions.ComeBack。
建置和部署
- 如同先前,在 Unity 中建置專案並在 Visual Studio 中部署。
部署應用程式之後:
- 說 「Go Charge」 ,讓 P0LY 進入能源中樞。
請注意音效中的變更。 它應該聽起來很混音,而且稍微靜音。 如果您能夠將自己放在您與能源中樞之間的牆或其他物件,您應該注意到由於真實世界遮蔽而進一步的音效。
- 說 「在這裡」 ,讓 P0LY 離開能源中樞,並將自己放在您前面。
請注意,一旦 P0LY 結束能源中樞,就會移除聲音遮蔽。 如果您仍然聽到遮蔽,P0LY 可能會被真實世界遮蔽。 請嘗試移動以確保您能清楚看到 P0LY。
第 3 部分 - 會議室模型
重要概念
- 空間的大小提供有助於聲音本地化的子佇列。
- 會議室模型是針對每個 AudioSource 設定的。
- MixedRealityToolkit for Unity 提供設定會議室模型的程序代碼。
- 針對 Mixed Reality 體驗,請選取最符合真實世界空間的會議室模型。
如果您要建立虛擬實境案例,請選取最適合虛擬環境的會議室模型。
第 4 章 - 音效設計
目標
- 瞭解有效音效設計的考慮。
- 瞭解混合技術和指導方針。
第 1 部分 - 音效與體驗設計
本節討論重要音效和體驗設計考慮和指導方針。
將所有音效正規化
這可避免需要特殊案例程式代碼來調整每個音效的音量層級,這可能會很耗時,並限制輕鬆更新音效檔案的能力。
針對未連線體驗進行設計
HoloLens 是完全自主的全像攝影電腦。 您的用戶可以在移動時使用您的體驗。 請務必逐步測試音訊混合。
從全像投影上的邏輯位置發出音效
在真實世界中,狗不會從其尾端擷取,而人類的聲音不會來自他/她的腳。 避免音效從全像投影的非預期部分發出。
對於小型全像投影,從幾何中心發出音效是合理的。
熟悉的音效最可當地語系化
人類語音和音樂很容易當地語系化。 如果有人呼叫您的名稱,您可以非常精確地判斷語音來自哪個方向,以及距離有多遠。 簡短、不熟悉的音效很難當地語系化。
了解使用者的期望
生活體驗在能夠識別音效的位置中扮演一部分。 這是人類語音特別容易當地語系化的原因之一。 請務必留意您在放置音效時所學到的預期。
例如,當有人聽到一般會查閱的鳥聲時,因為鳥通常會高於 (飛出或樹狀結構) 。 使用者不常會以正確的音效方向來轉轉,但查看錯誤的垂直方向,並在找不到全像投影時感到困惑或挫折。
避免隱藏的發出器
在真實世界中,如果我們聽到聲音,我們通常可以識別發出音效的物件。 這也應該在您的體驗中保留 true。 使用者可能會非常不慎聽到音效、知道音效的來源,而且無法看到物件。
此指導方針有一些例外狀況。 例如,不需要在欄位中看見環境音效,例如 Cricket。 生活體驗可讓我們熟悉這些音效的來源,而不需要看到它。
第 2 部分 - 音效混合
以 HoloLens 上 70% 的混合磁碟區為目標
Mixed Reality 體驗可讓全像投影在真實世界中看到。 他們也應該允許聽到真實世界音效。 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],然後選取 [下層]。
- 展開 [下階層 ],然後選取 [VoiceSource]。
- 在 [偵測器] 面板中,按兩下 [ 新增元件 ] 並新增 [使用者語音效果]。
AudioSource 元件將會新增至 VoiceSource。
- 在 AudioSource 中,將 [輸出 ] 設定為 [UserVoice] ([混音器) ]。
- 選取 [Spatialize] \(空間化\) 核取方塊。
- 將 空間混合 滑桿一路拖曳到 3D,或在編輯框中輸入 1 。
- 展開 [3D 音效設定]。
- 將 Doppler 層級 設定為 0。
- 在 [使用者語音效果] 中,從場景將 [父物件 ] 設定為 [下層] 。
- 將 [最大距離] 設定為 1。
設定 [最大距離 ] 會告知 使用者語音效果 在啟用效果之前,用戶必須接近父物件。
- 在 [用戶語音效果] 中,展開 [Chorus 參數]。
- 將 [深度 ] 設定為 0.1。
- 將 點選 1 個磁碟區、 點選 2 個磁碟區 ,然後 點選 3 個磁碟區 設為 0.8。
- 將 原始音效音量 設定為 0.5。
先前的設定會設定 Unity AudioChorusFilter 的參數,以將豐富度新增至使用者的語音。
- 在 [用戶語音效果] 中,展開 [響應參數]。
- 將 [延遲 ] 設定為 300
- 將 衰減比例 設定為 0.2。
- 將 原始音效音量 設定為 0。
先前的設定會設定用來造成使用者語音回應的 Unity AudioEchoFilter 參數。
使用者語音效果文稿負責:
- 測量使用者與附加腳本之 GameObject 之間的距離。
- 判斷使用者是否面臨 GameObject。
無論距離為何,用戶都必須面對 GameObject,才能啟用效果。
- 將 AudioChorusFilter 和 AudioEchoFilter 套用並設定至 AudioSource。
- 藉由停用篩選來停用效果。
使用者語音效果會使用 適用於 Unity 的 MixedRealityToolkit 中的 Mic Stream 選取器元件,選取高品質的語音串流,並將其路由傳送至 Unity 的音訊系統。
- 在 [ 階層] 面板中,選取 [ 管理員]。
- 在 [ 偵測器] 面板中,展開 [語音輸入處理程式]。
- 在 [語音輸入處理程式] 中,展開 [顯示下世界]。
- 將 No 函式 變更為 UnderworldBase.OnEnable。
- 展開 [隱藏下世界]。
- 將 No 函式 變更為 UnderworldBase.OnDisable。
建置和部署
- 如同先前,在 Unity 中建置專案,並在 Visual Studio 中部署。
部署應用程式之後:
- 臉部 (牆、樓層、表格) ,並說 出「顯示下層」。
將會顯示下世界,並隱藏所有其他全像投影。 如果您沒有看到下層,請確定您面臨真實世界表面。
- 在世界全像投影的 1 公尺內進行方法,並開始交談。
現在已將音訊效果套用至您的語音!
- 離開下世界,並注意不再套用效果的方式。
- 說 「隱藏下世界」 以隱藏下世界。
下世界將會隱藏,而先前隱藏的全像投影將會重新出現。
結束
恭喜! 您現在已完成 MR Spatial 220:空間音效。
聆聽世界,並以音效將您的體驗帶入生活!