基於物件的實時空間音訊渲染丨Dev for Dev 專欄
本文為 「Dev for Dev 專欄」 系列內容,作者為聲網音訊演算法工程師 李嵩。
隨著元宇宙概念的引入,空間音訊這項技術慢慢映入大家的眼簾。關於空間音訊的基礎原理,我們做過一期科普視訊 —— 「空間音訊背後的原理」,想要了解的朋友可以複製文末的連結檢視。
本期文章,我們將主要討論基於物件 (object-based) 的實時空間音訊渲染,也就是如耳機等應用場景中,渲染物件為一個音源時的渲染思路與方案。
虛擬聲是指利用空間音訊技術合成的一路虛擬聲源。
在現實生活中,人們可以利用雙耳感知到真實聲源的位置, 所謂的虛擬聲渲染,便是模模擬實聲源到達我們耳朵的過程 ,使聽者感受到虛擬聲源在空間中的位置等資訊。
渲染過程中,我們需要幾個基礎的資訊來進行訊號處理,比如:聲源、房間的模型、聲源和聽者的位置、聲源的朝向等等。在聲源和聽者之間沒有阻礙物的情況下,聲源發出的聲音會直接到達聽者的耳朵,我們把這個聽到的聲音叫做直達聲。
在直達聲到達後,聲源從牆壁、地板、天花板或其他障礙物反射產生的反射聲也會陸續到達聽者的耳朵。這些反射一開始很稀疏,隨著時間的推移會越來越密集,能量也會呈指數下降。通常,我們將一開始稀疏的反射稱作早期反射,一般在 50ms 到 80ms 內;把該段時間後的密集反射叫做後期混響 (具體的時間和房間大小等環境因素有關) 。
前文描述的是聲源在房間內通過空氣傳播到達人耳的過程,接下來我們討論這一過程如何實現。考慮到聲源經過空氣到人耳的傳遞過程一般是線性的,如圖一所示,因此對於渲染來說最簡單的方法是卷積已知的單聲道聲源和一對雙耳房間的脈衝響應 (Binaural room impulse response, BRIR) 。
■ 圖一:卷積BRIR獲得雙耳聲
其中 BRIR 指的是在房間內從聲源到人耳的雙耳房間脈衝響應,包括了直達聲和反射 (這裡的反射包括了早期反射和後期混響) 。我們可以將其理解成當聲源是一個脈衝訊號 (比如拍手,發令槍發出的聲音等) 的時候,你聽到的聲音。正如我們前文所說,BRIR 與房間、聲源和聽者的位置有關。
圖二所示是一對在某個房間內真實測量的 30° 水平角的 BRIR,其中藍色和紅色線分別代表左耳和右耳的 BRIR。我們可以清晰的看到在時域中的直達聲、早期反射和後期混響部分。
■ 圖二:一對真實測量的雙耳房間脈衝響應 (來源: University of Surrey, IoSR-Surrey資料庫)
那麼 BRIR 如何獲取呢?測量是一個真實並且準確的做法,尤其是對於現實增強 (AR) 的場景而言。但即使在不考慮個性化的情況下,在每個房間藉助人工頭來真實測量所有可能位置的 BRIR 都是不現實的。
另外 BRIR 的長度和房間的混響大小有很大關係,且實時卷積很長的 BRIR 需要耗費很大的算力。因此通常會使用合成的方法來模擬真實的 BRIR。
1)直達聲的合成
BRIR 的第一部分是直達聲的脈衝響應。直達聲的合成可以通過卷積聲源和頭部相關脈衝響應 (Head-related impulse response, HRIR) 來獲取。HRIR 是頭部相關函式 HRTF 的時域表達。
關於 HRTF 相信大家已經有所瞭解,它表示的是聲源到人耳的傳遞方程,但並不包含反射 (早期反射和後期混響) 部分。也就是說,如果只是用 HRTF 去渲染的一個聲源,我們所在的虛擬聽音場景是無反射的場景,類似消聲室,雪山頂等特殊場地。
■ 圖三:直達聲部分渲染
圖三為直達聲部分的渲染鏈路,包括聲源朝向的渲染、隨距離改變的聲壓、空氣衰減的模擬,和一對指定方向的 HRTF 濾波。這裡的每一個模組在之前的文章中都有介紹過 (歷史文章詳見文末拓展閱讀) 。
在實時音訊處理中,考慮到 HRIR 的長度,一般不會在時域上直接進行卷積,而是在頻域上通過快速傅立葉變化 (FFT) 進行。當聲源的位置發生改變時,就需要切換使用對應的 HRIR。為了防止切換 HRIR 時產生雜音,前一個和後一個的 HRIR 會進行類似淡入淡出操作。
如果 HRIR 對應的取樣點不是很密集,則需要在渲染時進行實時插值來獲取對應方位的 HRIR。當然也可以先進行離線插值直到足夠密集為止 (小於 Just noticeable difference) ,在實時渲染的時候就可以直接選擇離目標位置最近的 HRTF 來使用。
這樣一來可以減少實時插值帶來的算力,但需要儲存的 HRIR 的包體積會變大。因此需要在 HRIR 儲存體積和實時插值的算力間進行取捨。
2) 反射的合成
BRIR 的第二部分是早期反射的脈衝響應。早期反射對音色,聲源定位等有著很大的影響。由於早期反射比較稀疏,每個早期反射會被當作一個虛擬聲源。這些虛擬聲源的位置可以通過鏡面法、光線追蹤法或者數值求解等方法得到。
鏡面法是一種比較省算力且相對直觀的方法,但一般只適用於牆面光滑的情況,其無法模擬由於牆面不光滑引起的散射場景。光線追蹤法可以模擬反射和散射場景,但聲線方向以及數量的選擇需要做更為仔細的考慮。 在模擬低階早期反射時,算力會比鏡面反射要大。數值計算的精確度是最高的,但是其計算複雜度很高,適用於做線下模擬和模擬。
在實時計算早期反射的時候,考慮到算力問題,一般我們會精確計算 1-2 階早期反射。這裡的階數是指和牆面經過幾次碰撞,比如一階反射是指聲源和牆面經過一次碰撞到達人的耳朵。當這些早期反射的位置計算出來後,需要對每一個反射做和直達聲一樣的處理,包括反射聲源的朝向,和距離有關的聲壓和空氣衰減模擬,以及對應的 HRTF 濾波。
需要注意的是,由於每個反射到達人耳的時間不同,需要計算反射到達人耳相對於直達聲的延遲時間。如果按照嚴格的物理意義,直達聲也需要包括一段由聲源到達人耳的延遲。
假如在一個虛擬場景,聲源離聽者 100 米,那麼需要額外引入大概 291 毫秒的延遲。這樣處理的話,雖然符合了物理含義,但是額外增加了延遲,並且這段直達聲的延遲對空間感沒有任何幫助。因此反射的延遲只會考慮相對於直達聲到達人耳的延遲。
另外,由於反射聲源是經過牆壁的反射/散射造成的,需要模擬牆壁反射/散射造成的能量衰減。要真實的模擬這一個音效,就要知道牆面材料等房間資訊。
■ 圖四:早期反射的渲染
生成早期反射的大致流程由圖四所示。圖示是將每一個早期反射都進行了單獨處理,最後生成雙耳聲的時候,每一個反射都經過對應的 HRTF 濾波。另外一種方式是先合成早期反射的脈衝響應,當然長度會隨著房間增大而增大,但最後聲源只需要進行一次和早期反射脈衝響應的卷積。
3) 後期混響的合成
BRIR 的最後一部分是後期混響。需要注意的是所有的混響部分都可以像計算早期反射一樣進行計算,但是計算高階早期反射需要很大的算力,並且我們人耳對高階反射所在的位置不敏感,因此我們不需要精確的計算高階反射,也就是多級經過牆面反射/散射的聲波的具體位置。
通常情況下,我們可以用人工混響器來渲染生成後期混響。比較常見的人工混響器有:全通濾波器、反饋梳狀濾波器、全通濾波器和梳狀濾波器的組合濾波器等。在混響器中,反饋延遲網路是一種比較常見也是價效比很高的實現方法。
4) 實時空間音訊渲染流程
■ 圖五:雙耳聲渲染過程
整體的實時空間音訊渲染流程圖如圖五所示。要注意的是,其中每一個模組都可以設計的很複雜,也可以很簡單。舉例來說,每一個房間都是形狀各異,但有時候為了簡化計算複雜度,會用一個簡單的長方體的房間模型來代替。空氣衰減的模擬可以用 FIR 濾波器來實現,但是在實際應用中,會用低階的 IIR 濾波器來逼近結果從而節省算力。
這當中的核心模組如 HRTF 也是一直很熱門的研究話題。HRTF 是高度個性化的,如果使用了非個性化 HRTF,可能會出現定位不準確,前後混淆的現象。雖然真實測量的個性化 HRTF 準確度最高,但是在實際應用中,測量 HRTF 是不現實的。在實際應用中,基於耳朵照片的個性化HRTF預測或者個性化 HRTF 選擇會是一種更為合適的方式。
除了 HRTF 的個性化問題外,HRTF 在遠場 (一般來說聲源和聽者的距離大於 1 米) 時候,頻譜和距離無關。也就是說在同一個方向下,2 米的 HRTF 的頻譜和 3 米的 HRTF 頻譜是一樣的,只是幅度不一樣了。
然而 HRTF 在近場 (一般來說聲源和聽者的距離小於 1 米) 的時候,頻譜會隨著距離發生巨大變化。為了更加真實的渲染近場聲源的效果,需要用遠場 HRTF 通過外插的方法來合成近場 HRTF。
當音源不是一個物件,而是一個聲場或者是有大量的物件需要同時被渲染時候,上述的方法就不太適用了,可以用 Ambisonic 的方法進行實時渲染。
另外丟擲一個問題, 假設我們正確地渲染了基於某個房間的空間音訊,我們就會有很好地沉浸式體驗了嗎? 我們會在之後的文章聊一聊如何使用 Ambisonic 的方法進行空間音訊的實時渲染以及關於空間音訊的主觀聽感,請大家持續關注 Dev for Dev 專欄。
拓展閱讀:
1、 3D 空間音效、空氣衰減模擬、人聲模糊,三大黑科技完美模擬現實聽覺
2、RTC科普丨空間音訊背後的原理
http://www.bilibili.com/video/BV13Y4y187z3
- 保姆級教程!整合聲網 SDK 實現 iOS 平臺音視訊通話和虛擬背景功能
- 在 Flutter 多人視訊中實現虛擬背景、美顏與空間音效
- 基於聲網 Flutter SDK 實現互動直播
- 保姆級教程!基於聲網 Web SDK實現音視訊通話及螢幕共享
- 基於聲網 Flutter SDK 實現多人視訊通話
- 把 ChatGPT 加入 Flutter 開發,會有怎樣的體驗?
- 如何基於開源 demo 在 Web 端實現一個多人數獨遊戲
- 《鵝鴨殺》爆火,一文帶你瞭解如何實現頂流社交遊戲
- 聲網許振明:RTC 場景 UHD 視訊應用和探索
- RTE 領域的發展,為視訊編解碼標準帶來哪些新變化?丨Dev for Dev 專欄
- 人臉關鍵點的應用場景及重難點解析丨Dev for Dev 專欄
- 糾刪碼在實時視訊流中的應用丨Dev for Dev 專欄
- 音訊技術的下一個“熱點”,會出現在哪個領域?丨一期一會 • 音訊工程師專場
- 一片紅的泛娛樂出海,藍色在哪裡?
- 聲網“失聲”的危機
- 百鍊成鋼 —— 聲網實時網路的自動運維丨Dev for Dev 專欄
- 桌面軟體開發框架大賞
- 基於物件的實時空間音訊渲染丨Dev for Dev 專欄
- 即時通訊場景下安全合規的實踐和經驗
- 基於 Web SDK 實現視訊通話場景 | 聲網 SDK 教程