iT邦幫忙

2021 iThome 鐵人賽

DAY 6
1
AI & Data

AI Voice Conversion系列 第 6

【Day6】窗涵式,n_fft ,hop_length 到底什麼意思啊?

回填之前的坑

在往 Vocoder 邁進之前,我們先回顧一下之前我們在做 melspectrogram 的時候,其實是有一些參數可以設定的.

spec = librosa.feature.melspectrogram(sig,n_fft=2048,hop_length=256,window="hann")

如同前面文章所講的,真正在取 spectrogram 的時候呢,並不是單純的只做 STFT ,在做 STFT 之前還會有一些操作,通常是這三個:

  • Step1. 預強調(Pre-emphasis)

將語音訊號 s(n) 通過一個高通濾波器

H(z) = 1−a∗z−1 where 0.9 < a < 1.0

若以時域的運算式來表示,預強調後的訊號 s2(n) 就是

s2(n) = s(n)−a∗s(n−1)

這樣處理是為了消除發聲過程中聲帶和嘴唇的效應,來補償語音信號受到發音系統所壓抑的高頻部分。也有另一種說法是說要突顯在高頻的共振峰

  • Step 2. 音框化(Frame Blocking)

將 N 個取樣點集合成一個觀測單位,稱為音框(Frame),通常 N 的值是 256 或 512,涵蓋的時間約 20~30 ms。

為了避免相鄰兩音框的變化過大,會讓兩相鄰音框之間有一段重疊區域,此重疊區域包含了 M 個取樣點,通常 M 的值是 N 的一半或 1/3。

假設所用的音訊的 sample rate 為 16 KHz 且音框長度為 256 ,對應的時間長度就是 256/16000*1000 = 16 ms。

n_fft 指的就是這個 N 值,默認是 2048,對應的 sample rate 是 22.05 KHz,是最適合處理音樂訊號的

  • Step3. 乘上窗涵式(window)

窗函數是一種除在給定區間之外取值均為 0 的實函數,任何函數與窗函數的乘積還是一個窗函數

把每一個音框乘上窗涵式(漢明窗,三角窗 …etc),就可以增加音框左端和右端的連續性,保持連續性的主要原因是因為在進行 FFT 時,都是假設一個音框內的訊號是代表一個週期性訊號,如果這個週期性不存在,FFT 會為了要符合左右端不連續的變化,而產生一些不存在原訊號的能量分佈,造成分析上的誤差。

如果在取音框時,已經確定音框中的訊號包含了基本週期的整數倍,這時的音框左右端會是連續的,就可以不用乘窗涵式了。但在實作上基本週期的計算會需要額外的時間,而且容易算錯,因此都用窗涵式來達到類似的效果。

我們假設音框化的訊號為 S(n)

S(n), n=0,…N−1。

乘上 Hanning 窗 W(n)

(n) = S(n)∗W(n)

其中 W(n) 形式如下:

所以 window="hann" 的意思就是使用 "Hanning" 這個窗涵式,你也可以用其他窗涵式,再做完以上三步之後才會進行 STFT。

hop_lenght 指的就是 STFT 的音頻樣本數,預設值是 win_length // 4,加窗之後的窗口長度,默認是等於 n_fft 的長度,假設現在的窗口長度是 256, hop_lenght 是 250,那出來的結果就會變成兩個,因為從 251 開始又被視為新的一幀。

下面是一個簡單的實驗,其中 sig 的長度為 2047

最後我們得到的結論是 librosa.stft 的輸出幀數為

(sig_length // hop_length) + 1

小結 & 碎念

這些參數在之後訓練模型的時候也會遇到,算是一個會被忽略的細節,要稍微了解一下比較好。

最近要開學了忙著做實驗室的工作 QAQ,集氣一下希望下周不要被電 XD

參考資料

librosa 語音信號處理,你可以在這裡找到更多的介紹

/images/emoticon/emoticon09.gif/images/emoticon/emoticon13.gif/images/emoticon/emoticon14.gif/images/emoticon/emoticon22.gif/images/emoticon/emoticon28.gif


上一篇
【Day5】從頻域到 wave 的轉換,淺談虛數可以拿來 Train Model 嗎?
下一篇
【Day7】Vocoder Model 以及 WaveNet 介紹
系列文
AI Voice Conversion30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言