目錄
- 聲音的基本知識
- 時域壓擴(TSM)的原理
- 波形相似疊加(WSOLA)
- 資料
- 收穫
音頻的原始pcm數據是由 採樣率、採樣通道數以及位寬而定。常見的音頻採樣率是44100HZ,即一秒內採樣44100次,採樣通道數 一般爲2, 代表雙聲道,而位寬一般是16bit 即2個字節。
通過改變採樣率進行音頻的變速,比如音視頻播放器中的 2 倍速,0.5 倍速播放。如果想要實現音頻的2.0倍速播放,只需要每隔一個樣本點丟一個點,即採樣率降低一半。如果想要實現0.5倍速播放,只需要每隔一個樣本點插入一個值爲0的樣本點。就可以了,理想很豐滿,但是如果僅僅這樣做,帶來的不止是速度的變化,聲音的音調也發生變化了,比如 周杰倫的聲音變成了蘿莉音,這是我們不期望的。
本篇我們從原理上來學習瞭解下音頻變速不變調是如何實現的。
首先我們先了解下聲音的一些基本知識
一、聲音的基本知識
1.1 聲音是如何發生、傳播和接受的
聲音是由物體的振動產生的,以聲波的方式在介質中傳播。數字音頻通過數模轉換驅動喇叭振動,以聲波在空氣等介質中傳播,人耳接受到不同頻率 響度的聲音進行判別是什麼聲音。人類的耳朵一般只能聽到約在20Hz—20,000 Hz的聲音,並且上限會隨年齡增加而降低。
1.2 聲音的三要素
聲音的三要素包括: 響度、音調、音色。在變速時,需要變的是音頻的播放速度,同時要保持音調不變。下面來了解三要素的定義和特點
響度
響度代表聲音的能量強弱,主要取決於振幅大小,聲音的響度一般用聲壓來計量,聲壓的單位爲帕(Pa),它與基準聲壓比值的對數值稱爲聲壓級,單位是分貝(db spl)。人耳對於響度的感知變化並不是線性的,且對低頻和高品都不太敏感,對1000HZ-3000HZ的頻率比較敏感,具體如下面等響曲線描述:
等響曲線的橫座標爲頻率,縱座標爲聲壓級。在同一條曲線之上,所有頻率和聲壓的組合,都有着一樣的響度。有下圖可見,在 3 000 Hz 左右的頻率範圍,較低的聲壓級都能造成相同的響度,代表聽覺對該段頻率的聲音較爲敏感。
圖片來自 百科-響度
音調
聲波是有可以看作是有無數個不同頻譜、振幅和相位的正弦波組成,音調的大小主要取決於聲波基頻的高低,不同樂器的基頻不同,比如 bass的頻很低,而軍鼓的頻率就比較高;鋼琴鍵不同鍵的頻率也不同,男生和女生的基頻也不相同,女生聲音的基頻比男聲要高。
圖片來自:如果看了這篇文章你還不懂傅里葉變換,那就過來掐死我吧
音色
音色在百科中的定義如下:
不同音色的聲音,即使在相同響度和音調的情況下,也能讓人區分開來。聲音是由發聲的物體的振動產
生的。當發聲物體的主體振動時會發出一個基音,同時其餘各部分也有複合的振動,這些振動組合產
生泛音。正是這些泛音決定了發生物體的音色,使人能辨別出不同的樂器甚至不同的人發出的聲
音。所以根據音色的不同可以劃分出男音和女音;高音、中音和低音;絃樂和管樂等。所有泛音都比基
音的頻率高,但強度都相當弱。
1.3 音頻分析處理—時域和頻域
音頻分析處理領域可以分爲時域和頻域。
時域上表現爲 波形隨着時間變化而變化。
波形圖如下
頻域分析則是首先對時域信號分幀、加窗、做stft(短時傅立葉變換)等處理,更方便的進行計算。比如把20ms-50ms的一個波形看作一個週期,進行分幀加窗處理,計算出改幀不同頻率的響度值。
頻譜圖如下
音頻的分析處理也是一個非常有意思涉及內容很廣的領域,有些實現可以在時域比較方便的完成實現,比如我們今天的主題:變速不變調的TSM就是在時域上進行處理。而更多的需要頻域上進行分析處理,希望自己能在這個領域更深入堅持學習和輸出。
鋪墊了那麼多,終於到了今天的主題部分。其中下文大部分圖片來自變速不變調經典論文: A Review of Time-Scale Modification of Music Signals
二、 時域壓擴(TSM)的原理
變速不變調的經典算法爲 時域壓擴(TSM. Time-Scale Modifacaiton)
基本思路是:在時域上對音頻信號進行分幀(analysis fames)處理,一般選擇20ms-50ms週期波作爲分幀單元,爲了使分幀後不同幀之間平滑的過度,幀與幀之間會有一部分的重疊(overlap),通常爲50%或者75%的重疊,相鄰兩幀的起始位置的時間差成爲幀移。
圖片來自: 分幀,加窗
但變速的時候,不會直接取連續信號,比如 2倍速時進行間隔採樣,0.5倍速時間隔填充0信號。這樣就會造成非連續的信號在拼接時造成頻譜泄露(由於信號不連續拼接時產生了新的頻率成分)
圖片來自:A Review of Time-Scale Modification of Music Signals
爲此分幀後,對每幀要做加窗處理,窗口函數有很多類型,其中漢寧窗和sinc窗函數使用的比較多。
圖片來自: 分幀,加窗
好的窗函數設計使得能量集中在主瓣,儘量使旁瓣的能量低,使得窗口內的信號近似週期函數。而加窗函數帶來的每幀信號兩端信號變弱的問題,可以通過幀與幀之間的重疊合幀(Synthesis frames)來處理。
比如:採用漢寧窗對幀進行疊加
圖片來自:A Review of Time-Scale Modification of Music Signals
經過分幀、加窗再進行合幀處理,實現變速:如果分幀以50%的重疊(overlap),而合幀時以75%的重疊,就實現了慢播,反之則是快播。這就是時域壓擴的原理。
時域壓擴TSM的整體流程如下圖:
簡單回顧下本小節:
- 瞭解變速不變調的時域壓擴(TSM)基本原理和步驟
- 通過分幀、加窗、合幀等環節,使用簡單粗暴的OLA疊加算法進行合幀。
雖然採用窗函數緩解了波形不連續(基音斷裂)的問題,但無法保證每幀都能覆蓋完整的週期並保證相位對齊,帶來相位跳躍失真(phase jump artifacts)
這也是基礎的重疊疊加算法(OLA overlap-and-Add)的不足。下一節我們來繼續學習瞭解在工程應用中使用的波形相似疊加算法(WSOLA),來優化上述問題。
三、波形相似疊加(WSOLA)
圖片來自:A Review of Time-Scale Modification of Music Signals
核心算法思想如下:
- 圖(a): 在原音頻信號中取一幀,並加窗處理
- 圖(b): 在一個範圍內(第一個藍色框)選取第二幀,這個幀的相位參數和第一幀的相位對齊。
- 圖(c): 在另外一個範圍(第二個藍色框)中查找和第二幀最相似的第三幀(第二個藍色框中的紅色框)
- 圖(d): 對第三幀進行加窗處理,然後和第一幀進行疊加。
那麼如何尋找最相似的第三幀吶?
有兩個波形相似疊加算法的實現,一個是Soundtouch,另外一個時Sonic,但它們在尋找最相似幀採用了不同的算法。其中Soundtouch採用了尋找相關峯算法來實現,而Sonic採用了AMDF(平均幅度差函數法)來實現。
圖片來自:Android 音頻倍速的原理與算法分析
四、資料
- 音頻變速不變調經典論文 — A Review of Time-Scale Modification of Music Signals
- TSM時域壓擴(變速不變調)算法總結
- 變聲導論-變聲器原理及實現(核心算法實現篇)
- 合成重疊相加與信號重建
- sinc插值(香農插值whittaker-shannon interpolation formula)實現
- 你真的懂語音特徵背後的原理嗎?
- 音頻變速變調原理及soundtouch代碼分析
- Android 音頻倍速的原理與算法分析
- 如果看了這篇文章你還不懂傅里葉變換,那就過來掐死我吧
五、收穫
通過本篇的學習,
- 瞭解了聲音的三要素:響度、音調和音色,在變速時如果音調發生變化會使男生音變成蘿莉音的
- 瞭解音頻分析的時域和頻譜的思路
- 學習時域壓擴TSM變速不變調的原理
- 瞭解重疊疊加算法OLA和波形相似疊加算法(WSOLA)
感謝你的閱讀
下一篇我們通過Sonic源碼分析,進一步來學習它是如何實現WSOLA以及通過AMDF(平均幅度差函數法)尋找波形相似幀的,歡迎關注公衆號“音視頻開發之旅”,一起學習成長。
歡迎交流