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