MelGan原理與實踐篇
筆者最近對基於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訓練中生成的音訊頻譜。
相關文章
- iOS開發·runtime原理與實踐: 基本知識篇iOS
- angr原理與實踐(一)——原理
- Webpack原理與實踐Web
- Vue CLI 原理與實踐Vue
- Redis核心原理與實踐--事務實踐與原始碼分析Redis原始碼
- 代理重加密原理與實踐加密
- mysql 複製原理與實踐MySql
- JDK ThreadPoolExecutor核心原理與實踐JDKthread
- Spark Connector Reader 原理與實踐Spark
- WebSocket原理與實踐(一)---基本原理Web
- Redis核心原理與實踐--列表實現原理之ziplistRedis
- 前端效能優化原理與實踐前端優化
- Webpack原理與實踐(一):打包流程Web
- Docker容器的原理與實踐 (下)Docker
- Flutter原理與美團的實踐Flutter
- Spring Boot Enable* 的原理與實踐Spring Boot
- Flink Sql Gateway的原理與實踐SQLGateway
- Guava Cache 原理分析與最佳實踐Guava
- 執行緒池原理與實踐執行緒
- 分散式鎖實現原理與最佳實踐分散式
- Tree-Shaking效能優化實踐 – 原理篇優化
- Redis核心原理與實踐--列表實現原理之quicklist結構RedisUI
- 流式處理新秀Flink原理與實踐
- 前端 JS 安全對抗原理與實踐前端JS
- WebSocket原理與實踐(二)---WebSocket協議Web協議
- 中間人攻擊原理與實踐
- 微服務快取原理與最佳實踐微服務快取
- Redis、Zookeeper實現分散式鎖——原理與實踐Redis分散式
- 典型伺服器模式原理分析與實踐伺服器模式
- WebSocket原理與實踐(三)--解析資料幀Web
- 深入淺出 PLT/GOT Hook與原理實踐GoHook
- 前端響應式佈局原理與實踐前端
- Spring Boot自動配置原理與實踐(一)Spring Boot
- WebSocket原理與實踐(四)--生成資料幀Web
- Spring Boot自動配置原理與實踐(二)Spring Boot
- 新書介紹 -- 《Redis核心原理與實踐》新書Redis
- 深入理解 ProtoBuf 原理與工程實踐(概述)
- MySQL高可用架構之MHA 原理與實踐MySql架構