音視頻開發之旅(66) - 音頻變速不變調的原理

目錄

  1. 聲音的基本知識
  2. 時域壓擴(TSM)的原理
  3. 波形相似疊加(WSOLA)
  4. 資料
  5. 收穫

音頻的原始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的整體流程如下圖:

簡單回顧下本小節:

  1. 瞭解變速不變調的時域壓擴(TSM)基本原理和步驟
  2. 通過分幀、加窗、合幀等環節,使用簡單粗暴的OLA疊加算法進行合幀。

雖然採用窗函數緩解了波形不連續(基音斷裂)的問題,但無法保證每幀都能覆蓋完整的週期並保證相位對齊,帶來相位跳躍失真(phase jump artifacts)


這也是基礎的重疊疊加算法(OLA overlap-and-Add)的不足。下一節我們來繼續學習瞭解在工程應用中使用的波形相似疊加算法(WSOLA),來優化上述問題。

三、波形相似疊加(WSOLA)

圖片來自:A Review of Time-Scale Modification of Music Signals

核心算法思想如下:

  1. 圖(a): 在原音頻信號中取一幀,並加窗處理
  2. 圖(b): 在一個範圍內(第一個藍色框)選取第二幀,這個幀的相位參數和第一幀的相位對齊。
  3. 圖(c): 在另外一個範圍(第二個藍色框)中查找和第二幀最相似的第三幀(第二個藍色框中的紅色框)
  4. 圖(d): 對第三幀進行加窗處理,然後和第一幀進行疊加。

那麼如何尋找最相似的第三幀吶?
有兩個波形相似疊加算法的實現,一個是Soundtouch,另外一個時Sonic,但它們在尋找最相似幀採用了不同的算法。其中Soundtouch採用了尋找相關峯算法來實現,而Sonic採用了AMDF(平均幅度差函數法)來實現。


圖片來自:Android 音頻倍速的原理與算法分析

四、資料

  1. 音頻變速不變調經典論文 — A Review of Time-Scale Modification of Music Signals
  2. TSM時域壓擴(變速不變調)算法總結
  3. 變聲導論-變聲器原理及實現(核心算法實現篇)
  4. 合成重疊相加與信號重建
  5. sinc插值(香農插值whittaker-shannon interpolation formula)實現
  6. 你真的懂語音特徵背後的原理嗎?
  7. 音頻變速變調原理及soundtouch代碼分析
  8. Android 音頻倍速的原理與算法分析
  9. 如果看了這篇文章你還不懂傅里葉變換,那就過來掐死我吧

五、收穫

通過本篇的學習,

  1. 瞭解了聲音的三要素:響度、音調和音色,在變速時如果音調發生變化會使男生音變成蘿莉音的
  2. 瞭解音頻分析的時域和頻譜的思路
  3. 學習時域壓擴TSM變速不變調的原理
  4. 瞭解重疊疊加算法OLA和波形相似疊加算法(WSOLA)

感謝你的閱讀

下一篇我們通過Sonic源碼分析,進一步來學習它是如何實現WSOLA以及通過AMDF(平均幅度差函數法)尋找波形相似幀的,歡迎關注公衆號“音視頻開發之旅”,一起學習成長。

歡迎交流

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章