目錄
- 聲音的基本知識
- 時(shí)域壓擴(kuò)(TSM)的原理
- 波形相似疊加(WSOLA)
- 資料
- 收獲
音頻的原始pcm數(shù)據(jù)是由 采樣率、采樣通道數(shù)以及位寬而定。常見的音頻采樣率是44100HZ,即一秒內(nèi)采樣44100次,采樣通道數(shù) 一般為2, 代表雙聲道,而位寬一般是16bit 即2個字節(jié)。
通過改變采樣率進(jìn)行音頻的變速,比如音視頻播放器中的 2 倍速,0.5 倍速播放。如果想要實(shí)現(xiàn)音頻的2.0倍速播放,只需要每隔一個樣本點(diǎn)丟一個點(diǎn),即采樣率降低一半。如果想要實(shí)現(xiàn)0.5倍速播放,只需要每隔一個樣本點(diǎn)插入一個值為0的樣本點(diǎn)。就可以了,理想很豐滿,但是如果僅僅這樣做,帶來的不止是速度的變化,聲音的音調(diào)也發(fā)生變化了,比如 周杰倫的聲音變成了蘿莉音,這是我們不期望的。
本篇我們從原理上來學(xué)習(xí)了解下音頻變速不變調(diào)是如何實(shí)現(xiàn)的。
首先我們先了解下聲音的一些基本知識
一、聲音的基本知識
1.1 聲音是如何發(fā)生、傳播和接受的
聲音是由物體的振動產(chǎn)生的,以聲波的方式在介質(zhì)中傳播。數(shù)字音頻通過數(shù)模轉(zhuǎn)換驅(qū)動喇叭振動,以聲波在空氣等介質(zhì)中傳播,人耳接受到不同頻率 響度的聲音進(jìn)行判別是什么聲音。人類的耳朵一般只能聽到約在20Hz—20,000 Hz的聲音,并且上限會隨年齡增加而降低。
1.2 聲音的三要素
聲音的三要素包括: 響度、音調(diào)、音色。在變速時(shí),需要變的是音頻的播放速度,同時(shí)要保持音調(diào)不變。下面來了解三要素的定義和特點(diǎn)
響度
響度代表聲音的能量強(qiáng)弱,主要取決于振幅大小,聲音的響度一般用聲壓來計(jì)量,聲壓的單位為帕(Pa),它與基準(zhǔn)聲壓比值的對數(shù)值稱為聲壓級,單位是分貝(db spl)。人耳對于響度的感知變化并不是線性的,且對低頻和高品都不太敏感,對1000HZ-3000HZ的頻率比較敏感,具體如下面等響曲線描述:
等響曲線的橫坐標(biāo)為頻率,縱坐標(biāo)為聲壓級。在同一條曲線之上,所有頻率和聲壓的組合,都有著一樣的響度。有下圖可見,在 3 000 Hz 左右的頻率范圍,較低的聲壓級都能造成相同的響度,代表聽覺對該段頻率的聲音較為敏感。

圖片來自 百科-響度
音調(diào)
聲波是有可以看作是有無數(shù)個不同頻譜、振幅和相位的正弦波組成,音調(diào)的大小主要取決于聲波基頻的高低,不同樂器的基頻不同,比如 bass的頻很低,而軍鼓的頻率就比較高;鋼琴鍵不同鍵的頻率也不同,男生和女生的基頻也不相同,女生聲音的基頻比男聲要高。

圖片來自:如果看了這篇文章你還不懂傅里葉變換,那就過來掐死我吧
音色
音色在百科中的定義如下:
不同音色的聲音,即使在相同響度和音調(diào)的情況下,也能讓人區(qū)分開來。聲音是由發(fā)聲的物體的振動產(chǎn)
生的。當(dāng)發(fā)聲物體的主體振動時(shí)會發(fā)出一個基音,同時(shí)其余各部分也有復(fù)合的振動,這些振動組合產(chǎn)
生泛音。正是這些泛音決定了發(fā)生物體的音色,使人能辨別出不同的樂器甚至不同的人發(fā)出的聲
音。所以根據(jù)音色的不同可以劃分出男音和女音;高音、中音和低音;弦樂和管樂等。所有泛音都比基
音的頻率高,但強(qiáng)度都相當(dāng)弱。
1.3 音頻分析處理—時(shí)域和頻域
音頻分析處理領(lǐng)域可以分為時(shí)域和頻域。
時(shí)域上表現(xiàn)為 波形隨著時(shí)間變化而變化。
波形圖如下

頻域分析則是首先對時(shí)域信號分幀、加窗、做stft(短時(shí)傅立葉變換)等處理,更方便的進(jìn)行計(jì)算。比如把20ms-50ms的一個波形看作一個周期,進(jìn)行分幀加窗處理,計(jì)算出改幀不同頻率的響度值。
頻譜圖如下

音頻的分析處理也是一個非常有意思涉及內(nèi)容很廣的領(lǐng)域,有些實(shí)現(xiàn)可以在時(shí)域比較方便的完成實(shí)現(xiàn),比如我們今天的主題:變速不變調(diào)的TSM就是在時(shí)域上進(jìn)行處理。而更多的需要頻域上進(jìn)行分析處理,希望自己能在這個領(lǐng)域更深入堅(jiān)持學(xué)習(xí)和輸出。
鋪墊了那么多,終于到了今天的主題部分。其中下文大部分圖片來自變速不變調(diào)經(jīng)典論文: A Review of Time-Scale Modification of Music Signals
二、 時(shí)域壓擴(kuò)(TSM)的原理
變速不變調(diào)的經(jīng)典算法為 時(shí)域壓擴(kuò)(TSM. Time-Scale Modifacaiton)
基本思路是:在時(shí)域上對音頻信號進(jìn)行分幀(analysis fames)處理,一般選擇20ms-50ms周期波作為分幀單元,為了使分幀后不同幀之間平滑的過度,幀與幀之間會有一部分的重疊(overlap),通常為50%或者75%的重疊,相鄰兩幀的起始位置的時(shí)間差成為幀移。

圖片來自: 分幀,加窗
但變速的時(shí)候,不會直接取連續(xù)信號,比如 2倍速時(shí)進(jìn)行間隔采樣,0.5倍速時(shí)間隔填充0信號。這樣就會造成非連續(xù)的信號在拼接時(shí)造成頻譜泄露(由于信號不連續(xù)拼接時(shí)產(chǎn)生了新的頻率成分)

圖片來自:A Review of Time-Scale Modification of Music Signals
為此分幀后,對每幀要做加窗處理,窗口函數(shù)有很多類型,其中漢寧窗和sinc窗函數(shù)使用的比較多。

圖片來自: 分幀,加窗
好的窗函數(shù)設(shè)計(jì)使得能量集中在主瓣,盡量使旁瓣的能量低,使得窗口內(nèi)的信號近似周期函數(shù)。而加窗函數(shù)帶來的每幀信號兩端信號變?nèi)醯膯栴},可以通過幀與幀之間的重疊合幀(Synthesis frames)來處理。
比如:采用漢寧窗對幀進(jìn)行疊加

圖片來自:A Review of Time-Scale Modification of Music Signals
經(jīng)過分幀、加窗再進(jìn)行合幀處理,實(shí)現(xiàn)變速:如果分幀以50%的重疊(overlap),而合幀時(shí)以75%的重疊,就實(shí)現(xiàn)了慢播,反之則是快播。這就是時(shí)域壓擴(kuò)的原理。
時(shí)域壓擴(kuò)TSM的整體流程如下圖:

簡單回顧下本小節(jié):
- 了解變速不變調(diào)的時(shí)域壓擴(kuò)(TSM)基本原理和步驟
- 通過分幀、加窗、合幀等環(huán)節(jié),使用簡單粗暴的OLA疊加算法進(jìn)行合幀。
雖然采用窗函數(shù)緩解了波形不連續(xù)(基音斷裂)的問題,但無法保證每幀都能覆蓋完整的周期并保證相位對齊,帶來相位跳躍失真(phase jump artifacts)

這也是基礎(chǔ)的重疊疊加算法(OLA overlap-and-Add)的不足。下一節(jié)我們來繼續(xù)學(xué)習(xí)了解在工程應(yīng)用中使用的波形相似疊加算法(WSOLA),來優(yōu)化上述問題。
三、波形相似疊加(WSOLA)

圖片來自:A Review of Time-Scale Modification of Music Signals
核心算法思想如下:
- 圖(a): 在原音頻信號中取一幀,并加窗處理
- 圖(b): 在一個范圍內(nèi)(第一個藍(lán)色框)選取第二幀,這個幀的相位參數(shù)和第一幀的相位對齊。
- 圖(c): 在另外一個范圍(第二個藍(lán)色框)中查找和第二幀最相似的第三幀(第二個藍(lán)色框中的紅色框)
- 圖(d): 對第三幀進(jìn)行加窗處理,然后和第一幀進(jìn)行疊加。
那么如何尋找最相似的第三幀吶?
有兩個波形相似疊加算法的實(shí)現(xiàn),一個是Soundtouch,另外一個時(shí)Sonic,但它們在尋找最相似幀采用了不同的算法。其中Soundtouch采用了尋找相關(guān)峰算法來實(shí)現(xiàn),而Sonic采用了AMDF(平均幅度差函數(shù)法)來實(shí)現(xiàn)。

圖片來自:Android 音頻倍速的原理與算法分析
四、資料
- 音頻變速不變調(diào)經(jīng)典論文 — A Review of Time-Scale Modification of Music Signals
- TSM時(shí)域壓擴(kuò)(變速不變調(diào))算法總結(jié)
- 變聲導(dǎo)論-變聲器原理及實(shí)現(xiàn)(核心算法實(shí)現(xiàn)篇)
- 合成重疊相加與信號重建
- sinc插值(香農(nóng)插值whittaker-shannon interpolation formula)實(shí)現(xiàn)
- 你真的懂語音特征背后的原理嗎?
- 音頻變速變調(diào)原理及soundtouch代碼分析
- Android 音頻倍速的原理與算法分析
- 如果看了這篇文章你還不懂傅里葉變換,那就過來掐死我吧
五、收獲
通過本篇的學(xué)習(xí),
- 了解了聲音的三要素:響度、音調(diào)和音色,在變速時(shí)如果音調(diào)發(fā)生變化會使男生音變成蘿莉音的
- 了解音頻分析的時(shí)域和頻譜的思路
- 學(xué)習(xí)時(shí)域壓擴(kuò)TSM變速不變調(diào)的原理
- 了解重疊疊加算法OLA和波形相似疊加算法(WSOLA)
感謝你的閱讀
下一篇我們通過Sonic源碼分析,進(jìn)一步來學(xué)習(xí)它是如何實(shí)現(xiàn)WSOLA以及通過AMDF(平均幅度差函數(shù)法)尋找波形相似幀的,歡迎關(guān)注公眾號“音視頻開發(fā)之旅”,一起學(xué)習(xí)成長。
歡迎交流