音频特效生成与算法 1
14|音效三劍客:變調、均衡器、混響
《名偵探柯南》里的變聲器在現實中能否實現?百萬調音師能讓本來唱歌跑調的人的歌聲變得好聽,這到底是用了什么神奇的方法?現在介紹的音頻中的音效,就是為了實現這些變聲、修音等特效而設計的一系列的音頻處理算法。
為了實現某種特定的效果,音效算法的種類有很多,這里主要介紹三種常見的音效算法:變調、均衡器和混響的設計和使用方法。
變調
其實在之前介紹弱網對抗部分的時候,在做快慢放操作時就使用到了變速不變調算法,這其實是變調算法中的一種用法。在說算法具體實現之前先想一下,變調的物理含義是什么?
介紹語音信號分析的時候說過,不同的人發音的基頻是不一樣的。而音調和基頻是直接相關的,要變調其實就是要改變基頻。而基頻的本質是一個信號的循環周期的倒數,比如基頻是 250Hz,那么當前時間的語音信號就是以 4ms 為周期的信號。要變調,其實就是把這個循環周期進行擴大或者縮小。
如圖 1 所示,如果把語音信號的基頻提升一倍,或者說提升一個八度或者 12 個半音,那么時域信號(綠線部分,上面為變調前,下面為變調后)語音的波形還是很相似的,只是每一個周期都縮短了一半。
再看看頻域信號(紅色部分)是不是變得更稀疏了?最下面的那根亮線代表的基頻從 250Hz 左右提升到了大約 500Hz 的位置。由于諧波的頻率是基頻的倍數,所以諧波之間的間隔也變大了。
圖1 升調后的語音時域和頻域圖如何實現音調提升?
其實方法很簡單,就是把原來的信號進行重采樣,但不改變播放信號的采樣率。簡單來說,比如把原來 20ms 的音頻每兩個點取一個點,然后按照相同的采樣率進行播放,這樣 10ms 內需要播放原來 20ms 的內容。這樣一來,原本的信號循環時間周期就變成了二分之一,從而實現了升調。
但這里有個問題,因為每一段時間內需要播放的音頻信號的采樣點是固定的。也就是說,通過下采樣的方法,音頻從原來的 20ms 縮短成了 10ms。直觀的感受就是這個人的音調變高了,但說話的語速也變快了,也就是變速又變調。
但想實現的變聲只是改變音調,也就是所謂的“變調不變速”。其實,實現的方法也很簡單,核心思想就是通過把音頻中的信號按照一定的規律拼接起來,把音頻的長度拉長或者縮短,這就是要介紹的第一種變調算法 OLA(Overlap-and-Add)。
之前介紹過?STFT 。其實 OLA 的思想和 STFT 中的 Overlap 的思想很相似。
如圖 2 所示,x 為輸入信號、y 為輸出信號。OLA 的過程按照圖 2 中 b、c、d 的順序:取一幀 xm?,選擇間隔長度 Ha? 的下一幀 xm+1?,然后把這兩幀加窗(漢寧窗)后,以步長 Hs? 把兩幀重疊、相加在一起。很顯然 Ha? 和 Hs? 的比值就是原始信號和輸出信號長度的比值。這樣就可以把原始音頻拼接成不同長度的音頻了,然后再經過重采樣把音頻恢復成和原始音頻相同長度的音頻再播放,這樣就實現了變速不變調。
圖2 OLA算法的基本原理有趣的是,如果不進行重采樣直接播放,由于拼接起來的音頻沒有改變原始語音的基頻周期,只是改變了音頻的長短,這就實現了弱網對抗中用的“變速不變調”的算法。
但是采用這種 Overlap 的方式雖然可以防止連接處的信號產生跳變,但不能保證每一個窗內覆蓋的信號都處于周期中的相同相位,或者說兩個窗內信號周期的起始位置不相同。這就會導致常說的“相位失真”。
如圖 3 所示,拼接的信號會出現時高時低的現象。所以如果能實時的根據信號本身的自相關屬性,也就是把信號中相似的兩段直接拼接在一起,這樣就不會有相位的問題了。基于這樣的思想,于是就有了波形相似疊加 WSOLA(Waveform similarity Overlap-Add)算法。
圖3 Overlap導致的幅度變化WSOLA 算法的計算步驟如圖 4 所示,其實相比于 OLA,WSOLA 會在 xm+1? 幀的附近尋找和輸入信號中如果也移動步長 Hs? 的信號 x~m? 相似度最高的一段 x’m+1? 來做拼接。
圖4 WSOLA的計算步驟根據相似性原理,其實 WSOLA 合成出來的變調雜音基本已經沒有了,WebRTC 中的快慢放用的就是 WSOLA。但 WSOLA 算法在實時變調中有一個問題,那就是每一幀出現的位置由于需要相似性搜索,所以需要更多的未來幀的信息,也就是說,需要引入更多的延遲。
在時域變調的算法中還有一種PSOLA(Pitch Synchronous Overlap and Add),顧名思義需要先計算 pitch,然后根據基音周期來改變 Overlap 的大小,這樣就直接實現了變調。但是基頻檢測的魯棒性沒有 WSOLA 的相似性搜索高,所以 PSOLA 的生成可能會出現不穩定的情況。
其實變調算法除了在時域上做拼接,還可以在頻域上實現,比如常見的 LSEE-MSTFTM、Phase Vocoder 等算法。
可以看到 WSOLA 等方法通過相似性來尋找拼接對象,但是相似性說到底是通過計算兩段時域信號的 MSE(mean squared error)取最小值來得到的,這種方法能盡量保持低頻相位的連續性,但高頻信號的相位差異可能不能確保一致。
其中 Phase Vocoder 利用 STFT 中提供的相位信息,在變調擴展的同時會對每個傅里葉頻點做相位修正,生成出的音質會比較高,所以在實時變調中常被使用。
理解了變調,就可以通過算法來改變音頻的音調了。比如電影《小黃人大眼萌》中“小黃人”的聲音,就是通過變調算法把原本男聲的音調提高來實現的。
那么電影《綠巨人》中浩克的那種低沉、怪異的音色又是怎么實現的?
均衡器
我們知道每個人都有自己獨特的音色,比如有的人聲音比較低沉,有的人聲音比較清脆。其實對這些音色的感知主要是由于人們在發音時,頻譜中不同頻段的能量分布不同而導致的。
比如聲音低沉的人,可能低頻分量比較低,而唱高音、音色飽滿的人可能高頻的能量也能保持得比較多。而其中最直接的可以改變音色,或者說改變聲音在不同頻率的能量分布的方法就是 EQ,也就是均衡器(Equalizer)。
那么如何實現一個均衡器來對不同頻段的能量進行調整?
其實均衡器就是一組濾波器,比如常見的高通、低通、帶通、帶阻等形式。這些可能你之前在大學里的數字信號處理課程里學過。看字面意思應該就可以理解,高通、低通和帶通就是讓高頻、低頻或者某個頻帶的音頻保留,而其它的頻帶都加以削弱,而帶阻就是削弱某個頻帶的音頻能量。比如我們覺得人聲中齒音太多,想要去齒音,可以在 10kHz~14kHz 左右加一個帶通濾波器,削減一下這部分的能量。
音頻濾波器有很多種,比如常用的 FIR(Finite Impulse Response)和 IIR(Infinite Impulse Response)Filter。如何根據你想要的頻段和增益來設計 FIR 和 IIR 濾波器,可以參考《數字信號處理》這本書。
當然 EQ 的處理經過多年的發展已經有很多通用的濾波器可以選用了,比如橢圓、切比雪夫、巴特沃斯和貝塞爾濾波器等等。如果想快速實現一個濾波器看看效果也可以直接使用 Matlab 中的濾波器設計 toolbox 來加速實現進程。
如果不想自己編程實現,也可以利用一些音頻處理軟件來進行可視化的處理。比如在 Adobe Audition 中,可以看到各種常見的 EQ 均衡器。如圖 5 所示,由上到下依次為 FFT 濾波器、圖形均衡器以及科學濾波器。我們在離線自己做一些音頻處理時,可以選擇其中的一個或者多個串行使用。
圖5 Audition中常見的均衡效果器混響
知道了如何調節音色,再來看看和空間相關的混響。
之前已經多次提及了混響的概念。在之前介紹空間音頻時,知道了可以通過采樣的方式或者鏡像法得到房間的混響 RIR,這樣得到的混響叫做采樣混響。采樣混響真實,但是不一定好聽,并且 RIR 需要和音頻信號做卷積才能得到混響信號。當混響時間很長的時候需要的算力也是巨大的。在音樂制作時,為了營造更好的聽感經常會使用一些人工混響效果器來產生混響,在實時音效里也可能因為要節省算力而采用人工混響效果器的方式來生成混響。
簡單地理解,混響信號可以看作是直達聲和許多逐步衰減、不斷延遲的回聲信號疊加而成的。假設一個衰減系數 a 和延遲 D,那么混響信號 y(n) 可以用下面的等比數列來表示:
其中 x(n) 是輸入信號,D 為回聲的延遲。而這種形式正是梳狀濾波器的形式。如圖 6 所示,所謂梳狀濾波器,其實就是因為它的頻率響應呈一個梳子的形狀。梳狀濾波常被用來消除某些不需要的諧波,但這里主要是利用了它的拖尾效應。
圖6 梳狀濾波器的頻率響應但也如圖 6 所示,梳狀濾波器的頻譜曲線不平坦,呈現明顯的梳狀效應。從而對不同的頻率成分幅度會產生波動,導致梳狀濾波器的拖尾聲音帶有很強的金屬染色效應。而且回聲只在延遲為 D 和 D 的倍數的時候出現,這就顯得過于稀疏了。所以在梳狀濾波器的基礎上 Schroeder 使用多個梳狀濾波器來解決混響不夠密集的問題,然后用全通濾波器(Allpass filter)來消除金屬聲。
圖7 Schroeder混響模型流程圖 7 為 Schroeder 混響模型的結構圖,其中每個 Comb 代表一個梳狀濾波器。但 Schroeder 依靠全通濾波器生成的混響依舊不夠密集。
后續 Moorer 又對 Schroeder 模型進行了改良,把混響的生成拆成了直達聲、早期混響、晚期混響這三個部分。加入了 FIR 模塊來模擬早期混響,用 6 個梳狀濾波器和一個全通濾波器來模擬晚期混響,并可以控制各部分的增益。
其實 Moorer 模型之后,人們會用各種方式來對混響模型進行改造,現在的混響生成器基本上也都是開放出很多參數,可調節的混響效果器了。比如混響的初始延遲、干濕比、混響 RT60 時間等。
小結
改變聲音可以從三個基本的方向來修改,也就是改變音調、音色和混響,分別對應了變調、均衡器和混響這三種算法。
其中變調算法比較常用的有:基于拼接的 OLA、WSOLA 以及頻域的 Phase Vocoder 等。而均衡器主要是通過一個濾波器組對不同頻段的能量來進行調節,成熟的算法有很多,但大多是 FIR 或者 IIR 濾波器的組合。人工混響則是可以采用多個梳狀濾波器的濾波器組,串聯全通濾波器來實現,比較常見的有 Scheoeder 和 Moorer 混響模型。
當然音效的種類還遠不止這三種。
總結
以上是生活随笔為你收集整理的音频特效生成与算法 1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python画图代码100行_用100行
- 下一篇: 抛弃flex执念:利用border-co