MelGan原理與實踐篇

c2a2o2發表於2020-12-15

筆者最近對基於Gan的神經網路Vocoder進行了一系列實驗。 簡單做一下總結並提出一些列疑問,一起與行業大佬探討遇到的問題。

先來看melgan的模型結構,包括兩部分: Generator(生成器) 和 Discriminator(判別器)。

Generator

輸入為mel-spectrogram,輸出為raw waveform. 從 mel-spectrogram到 audio的過程很顯然是一個上取樣的過程。

這裡的上取樣是由一維反摺積(transpose1d)實現的,上取樣的倍數如何確定呢?

需要注意一下,上取樣的倍數是由hop_size來決定的,為什麼呢?

需要明白一點,mel幀數 * 幀移 = 音訊長度(取樣點個數,可換算為音訊時長,具體怎麼做不用說了吧)

因此,對於22050取樣率, hopsize大小設定為256, 那麼對應的mel-spectrogram需要上取樣 256倍

如果是16000取樣率呢? 使用幀長是50ms,幀移 12.5ms 那麼hopsize就是200啦,所以上取樣倍數就是200倍啦.

搞清楚了這些,那麼Generator Upsampling層中的上取樣倍數也就好理解了,22050的取樣倍數為 8 X 8 X 2 X 2 = 256

圖1 melgan模型結構

另外一點需要搞清楚的是反摺積是如何做上取樣的?

如果有人不明白反摺積(上取樣)是如何工作的,那就看一下這篇文章《Understanding transpose-convolutions》,裡面通過卷積矩陣的方式來講解了卷積運算和反摺積運算的過程。

上取樣的方法有很多種,除了反摺積之外,還有最近鄰、雙線性插值等,這些方法在Wave net的實現裡也都用到了。具體演算法實現,自行研究。

 

每一層Upsampling Layer之後會接一層的RedidualStack(由三層的dilatend 一維卷積構成), ResidualStack層通過三層不同dilation係數(1,3,9)的空洞卷積獲得了大小為27的感受野,來擴大時域上的感知能力,能夠更好的建模時域上的長距離依賴關係。

Generator網路的最後一層是一個一維卷積層 + tanh函式,輸出範圍為-[1,1], 滿足音訊的數值點的取值範圍。該層的輸出通道數為1,這裡的通道數對應的輸出的是全波段音訊(full band),這裡就與後續要講的multi-band melgan模型Generator的區別.

最後一點,棋盤效應(checkerboard artifacts). 具體什麼是棋盤效應,及如何減弱棋盤效應導致的音訊高頻映象問題(無法完全解決),請檢視這篇博文. 如果選擇的卷積核與stride大小不合適,會產生嚴重的棋盤效應,體現在音訊頻譜上就是高頻橫紋比較多,音質上滋滋的電流聲(如有不對,歡迎討論)。

講完了Generator, 我們再來說說Discriminator.

Discriminator

論文提出了multi-scale的discriminator, 基於的假設是每個scale的discriminator可以學習到不同頻率段的音訊的特徵。

每個discriminator的網路結構是由前後各一層1維卷積 和 4層分組卷積構成的downsampling layer構成. discriminator輸入是由ground truth的音訊和gererator生成的fake音訊兩部分構成的。 輸入維度為[B, T, 1], 輸出維度也是[B,T,1], 中間變換的只是通道數的變化, 最後一層的輸出和倒數第二層卷積網路的輸出被分別用來計算 featuremap 和 feature_score, 這兩部分被用來計算 generator的feature_matching_loss(L1_loss) 和discriminator的mse_loss

.上面我們知道了Generator輸入mel-spectrogram,生成音訊audio, 這個音訊可以表示為G (s), s為mel-spectrogram. 判別器要判斷生成器生成音訊的真假,這裡就涉及到Gan模型的原理啦,

Generator輸入mel-spectrogram生成音訊(fake), Discriminator輸入真(real)音訊和假(fake)音訊,學習一個二分類器(可以這麼理解),這裡使用的是mse損失來最小化real與1的差異,fake與0的差異。

通過對抗學習,使得generator生成的音訊達到判別器無法判斷真假的效果(loss接近0.5)。

這就是melgan學習訓練的過程。

幾點總結

1 生成音訊的時候(推理),只用Generator。discriminator只在訓練過程中輔助學習。

2 Gan模型的訓練,generator 和 discriminator是交替訓練的,先固定discriminator,訓練generator一個step,然後固定generator,訓練discriminator一個step.

3 訓練過程會比較長,單卡V100 GPU,能跑半個月,這個後續如果替換featurematching_loss為multi-resolution stft loss會縮短收斂時間。

4 訓練過程中間生成的音訊最開始會有很嚴重的棋盤效用,隨著迭代次數增加,這種效用會慢慢減弱。

5 melgan音訊高頻部分details不明顯,會有發音抖動和沙沙的底噪,此問題比較嚴重。

 

給出一個取樣率為16KHZ的樣例,此樣例為melgan ground truth訓練中生成的音訊頻譜。

相關文章