參考博文:https://www.jianshu.com/p/bb13ae73e427
聲明:轉載請聲明作者,並添加原文鏈接。
簡介
WaveNet是probabilistic and autoregressive的生成,對每個預測的audio sample的分布都基於前面的前面的sample分布。在TTS的應用中,能達到state_of_art的效果,聽覺感受上優於parametric and concatenative的系統。同時系統還可以生成音樂,作為discriminative model對phoneme做識別。Wavenet模型是一種序列生成模型,可以用於語音生成建模。在語音合成的聲學模型建模中,Wavenet可以直接學習到采樣值序列的映射,因此具有很好的合成效果。目前wavenet在語音合成聲學模型建模,vocoder方面都有應用,在語音合成領域有很大的潛力。
這篇博客主要解讀WaveNet 語音識別/合成算法。 這篇論文另辟蹊徑, 主要使用dilated casual CNN 而不是LSTM 去實現語音算法, 非常值得學習。 主要內容可以總結如下
1. WaveNet 通用模型介紹, 不只是針對於語音模型
2. WaveNet 實驗結果介紹
3. 實戰tensorflow WaveNet 的實驗過程, 實戰選擇的是 WaveNet ASR. 主要原因是ASR 的標注比較容易判斷, 而語音合成text-to-speech很不好判斷, 主要通過人工打分。
本文實戰代碼是 https://github.com/buriburisuri/speech-to-text-wavenet, WaveNet 論文是https://arxiv.org/pdf/1609.03499.pdf
WaveNet 模型
通用WaveNet

這里dilated casual convolution 翻譯成帶洞因果卷積。帶洞對應的就是dilated, 就是和普通卷積步長stride 不同, stride會更大一些, 這樣關注的范圍 (receptive field)就變大了. casual 對應的就是因果,主要就是不要用未來的輸出/結果做當前的輸入。 這個方法對比RNN, 好處就是可以並行計算, 提高預測訓練速度。 但是這個方法還是有他本身的局限性。 在測試時,需要使用自回歸 當前的輸出語言當做輸入進行下一時刻的計算 (auto regressive) 限制了他的速度。下面這個圖, Fig. 2 解釋了自回歸的特點, 即當前的輸出會當做下一時刻的輸入進行計算。


Fig. 3 這里介紹了多層的帶洞卷積wavenet. 這樣做的目的就是提高感受視野(receptive field). 比如Fig. 3的output, 就是基於16 個Input 產生的, 這樣感受視野會遠遠大於dilation =1 的多層網絡。 WaveNet 的文章里用的dilation 是1, 2, 4, …, 512, 1, 2, 4, …, 512, 1, 2, 4, …, 512, 這個相當於有30層帶洞卷積, 能關注的視野也就很大了。 具體計算,1,2,4,...512 需要有1024個輸入。 那么1024*3/(16*1000), 就能關注192ms的信息了, 對於16kHz 的聲音信號。

WaveNet的整體結構就如Fig. 4 所示, 其中包含了殘差連接,和gated activation unit.這個就是圖中的兩路, tanh 和sigmoid 的計算。 其他也沒什么復雜的啦。
Conditional WaveNet

前面講的都是WaveNet 的通用屬性,還沒涉及到text-to-speech 或者speech recognition. 文章這里加了個h, 就是用來加一些依賴關系。 比如添加聲音ID, 音樂器械的信息之類的。 對於text-to-speech, h 的信息就應該是 語音/語言特征值了。這里要說下, 由於使用了提前算好的特征值, WaveNet不是端到端的訓練。
WaveNet 實驗結果:

WaveNet 這里的實驗結果是主觀測試, 判斷生成的生意是否聽起來自然。打分如下:
1: Bad, 2: Poor, 3: Fair, 4: Good, 5: Excellent。所以也就是算所有人打分的平均值啦。
實戰tensorflow WaveNet
使用的代碼再次強調 https://github.com/buriburisuri/speech-to-text-wavenet
模型架構

Fig. 5 WaveNet-ASR
這里使用的是MFCC feature. MFCC 如果不了解, 讀者可以去學這個課。
https://nlp.stanford.edu/courses/lsa352/lsa352.lec6.6up.pdf
CTC loss 在我以前的博客中有講解過。

整體的架構 就如Table, Layer 1, 2 就是front layer, 主要是全連接層+bn, 接下來Layer3-10 就是一個block, 這樣的block 有 15個。 這些block 的區別就是dilation 不同。 dialtion 會從1, 2, 4, 8, 16 這樣改變,重復三次, 就是15個block.
數據集
這個實驗使用的數據集是
Libir speech http://www.openslr.org/12/http://www.openslr.org/12/