Chapter6_Vocoder
文章目錄
- 1 Introduction
- 2 WaveNet
- 2.1 WaveNet的架構(gòu)
- 2.2 Softmax Distribution
- 2.3 Causal Convolution和Dilated Convolution
- 2.4 Gated Activation Unit
- 2.5 小結(jié)
- 3 FFTNet
- 4 WaveRNN
- 4.1 Dual Softmax Layer
- 4.2 Model Coarse
- 4.3 Model Fine
- 4.4 小結(jié)
- 5 WaveGlow
本文為李弘毅老師【Vocoder】的課程筆記,這次課程由助教同學(xué)許博竣講授,課程視頻youtube地址,點(diǎn)這里👈(需翻墻)。
下文中用到的圖片均來自于李宏毅老師的PPT,若有侵權(quán),必定刪除。
文章索引:
上篇 - 5 Speaker Verification
下篇 - 7-1 Overview of NLP Tasks
總目錄
1 Introduction
我們?cè)谥暗恼n程中有講過TTS(Text to Speech)模型和VC(Voice Conversion)模型。這兩個(gè)模型一般吐出來的都是一個(gè)叫做Spectrogram的東西,Spectrogram不是語音,它是一個(gè)表示各個(gè)時(shí)間點(diǎn)各個(gè)頻率的聲音強(qiáng)度的圖譜(下圖的圖譜中,橫軸為時(shí)間,縱軸為聲音頻率,顏色深淺表示強(qiáng)度)。因此要轉(zhuǎn)化為最終的語音,還需要一個(gè)叫做Vocoder的模型。總而言之,Vocoder就是把Spectrogram轉(zhuǎn)化為語音的模型。
為什么我們必須要有一個(gè)Vocoder,而不是讓我們的網(wǎng)絡(luò)直接生成一段語音呢?假設(shè)我們有一段語音xxx,然后這段語音xxx經(jīng)過短時(shí)傅里葉變換之后,可以得到一個(gè)與時(shí)間ttt和頻率fff相關(guān)的復(fù)數(shù),這個(gè)復(fù)數(shù)的幅值At,fA_{t,f}At,f?就是我們剛才聊到的Spectrogram,而eiθt,fe^{i\theta _{t,f}}eiθt,f?就是相位。TTS或者VC直接生成的結(jié)果都是At,fA_{t,f}At,f?,沒有相位。相位不同,產(chǎn)生的音質(zhì)的差別是很大的,所以相位是必須要有的,這個(gè)相位就需要一個(gè)叫做Vocoder的模型去生成。
其實(shí)要把相位直接放到模型里去end-to-end的train也行,但是這一方面會(huì)加大模型的訓(xùn)練難度,另一方面Vocoder是TTS和VC這樣的任務(wù)都需要的,單獨(dú)拿出來train的話,既可以兩邊通用,又可以降低TTS和VC的訓(xùn)練難度。
2 WaveNet
我們的聲音信號(hào)放大來看,就是一串點(diǎn)的序列,WaveNet借鑒了autogressive model的思想,泛一點(diǎn)來說就是輸入前t?1t-1t?1個(gè)點(diǎn),輸出第ttt個(gè)點(diǎn),然后把新生成的點(diǎn)放到隊(duì)列當(dāng)中去,繼續(xù)生成下一個(gè)點(diǎn)。WaveNet最重要的部分就是Causal Convolutions,說簡(jiǎn)單點(diǎn)就是一堆卷積。
2.1 WaveNet的架構(gòu)
WaveNet的整體架構(gòu)如下圖所示。Input就是聲音信號(hào)的前t?1t-1t?1個(gè)點(diǎn),然后Input會(huì)經(jīng)過一個(gè)Causal Conv,經(jīng)過Causal Conv之后,會(huì)經(jīng)過k層layers,layers就是由dialated conv和1×11 \times 11×1卷積組成的殘差網(wǎng)絡(luò),每層都會(huì)輸出一個(gè)特征,利用skip-connection組合起來之后,再經(jīng)過兩個(gè)1×11 \times 11×1卷積和Softmax就得到了最終的結(jié)果。
2.2 Softmax Distribution
我們的輸入和輸出都是one-hot的向量,所以這里要用到softmax。我們的聲音信號(hào)上每個(gè)點(diǎn)的數(shù)值是一個(gè)16-bit的int,范圍在[-32768, 32767],如果直接把這個(gè)進(jìn)行one-hot的話,我們softmax的layer將會(huì)有65536個(gè)類別,這太難了。所以這里用了一個(gè)叫做μ-law的方法,把[-32768, 32767] (16-bit int)的信號(hào)轉(zhuǎn)變到了[0, 255] (8-bit int)。這個(gè)過程如下所示,先將信號(hào)數(shù)值轉(zhuǎn)化到[-1, 1],然后用一個(gè)叫做μ-law的方法再轉(zhuǎn)換一下,范圍仍在[-1, 1],最后再轉(zhuǎn)化到[0, 255]。之所以要用μ-law是因?yàn)棣?law可以減小量化誤差。
[-32768, 32767] (16-bit int) -> [-1, 1] -> [-1, 1] (μ-law) -> [0, 255] (8-bit int)μ-law就是下面這個(gè)公式,這里不做過多介紹。
2.3 Causal Convolution和Dilated Convolution
Causal Convolution(因果卷積)就是下圖這個(gè)東西。它是專門針對(duì)時(shí)間序列設(shè)計(jì)的,所以它輸出的時(shí)候,不會(huì)考慮未來的信息,而且隱藏層越多,考慮過去的時(shí)間越久遠(yuǎn)。比如下圖是一個(gè)kernel size為2的Causal Convolution,最終的output會(huì)考慮前5個(gè)時(shí)間點(diǎn)的信息。
而Dilatied Convolution則是下圖所示的這樣,它的目的是在卷積中加入空洞來增加感受野。這樣一來就不用像標(biāo)準(zhǔn)的CNN那樣去pooling了。
而把這兩者結(jié)合起來就是Dilated Causal Convolution了。這樣一來模型就可以看到更長(zhǎng)遠(yuǎn)的信息了,這在點(diǎn)非常密集的語音里是非常必要的。
2.4 Gated Activation Unit
這里還有一個(gè)需要提一下的就是這個(gè)Gated Activation Unit,那其實(shí)就是經(jīng)過了兩個(gè)不同的激活函數(shù),如下圖所示。
如果我們要給模型加一些條件的話,就可以加載這個(gè)Gated Activation Unit的部分。如果一些全局的特征,比如說話人的一些條件,就像Global Condition那樣加,如果是要加Spectrogram這樣的隨時(shí)間變化的條件,就可以像Local condition這樣加。
2.5 小結(jié)
WaveNet可以直接使用waveform level的特征,利用到了Dilated Causal Convolution去增大感受野,同時(shí)也可以接受各種的條件輸入,最終出來的結(jié)果也是比較不錯(cuò)的。但是,它有一個(gè)問題就是速度太慢了,這也可以想象,畢竟autogressive這種方法計(jì)算下一個(gè)時(shí)間點(diǎn)的輸出時(shí),是需要利用到之前輸出的結(jié)果的,因此無法并行計(jì)算。所以之后提出的一些網(wǎng)絡(luò),基本都是為了解決速度的問題。
3 FFTNet
FFTNet和WaveNet一樣都是autogressive model,它簡(jiǎn)化了WaveNet中的一些繁瑣計(jì)算,同時(shí)提出了一種可以用到所有的autogressive model上的訓(xùn)練和合成技巧。
FFTNet的模型架構(gòu)如下圖所示,它會(huì)把輸入xxx分為xLx_LxL?和xRx_RxR?兩個(gè)部分,然后分別經(jīng)過一個(gè)卷積之后,加起來,再過一層卷積,使得總長(zhǎng)度減半,這樣運(yùn)行兩層,得到最終結(jié)果。這樣得到的特征,也是考慮了一定范圍的語音特征的,比如下圖中輸出的綠色部分就是考慮了xLx_LxL?生成的。
FFTNet提出了四個(gè)技巧:
- 在開頭做zero-padding可以讓訓(xùn)練結(jié)果更好
- 最后取結(jié)果是,不是直接去最大概率的那個(gè)值,而是根據(jù)概率分布去做sample
- 在訓(xùn)練時(shí),給輸入加上一些噪聲
- 加入去噪聲的后處理
FFTNet最終可以達(dá)到和WaveNet差不多的效果,但速度卻快上很多。
4 WaveRNN
WaveRNN是Google提出來的,說簡(jiǎn)單點(diǎn)就是用RNN去代替之前的CNN。
4.1 Dual Softmax Layer
WaveRNN沒有用之前把16bit轉(zhuǎn)成8bit的方法,而是把16bit轉(zhuǎn)成了兩個(gè)8bit,然后做兩次softmax的操作。
4.2 Model Coarse
產(chǎn)生ctc_tct?的部分如下圖所示,中間這塊我們可以把它看成一個(gè)GRU,它吃ct?1c_{t-1}ct?1?和ft?1f_{t-1}ft?1?,以及上一個(gè)time step的hiddent state,輸出ctc_tct?。
4.3 Model Fine
產(chǎn)生ftf_tft?的部分如下圖所示,中間這塊我們可以把它看成一個(gè)GRU,它吃ct?1c_{t-1}ct?1?和ft?1f_{t-1}ft?1?,以及上一個(gè)time step的hiddent state,除此之外,還有剛才產(chǎn)生的c+tc+tc+t,輸出ftf_tft?。
4.4 小結(jié)
WaveRNN還有一些加速的技巧,最終可以達(dá)到在手機(jī)cpu上real time的效果,非常強(qiáng)~
5 WaveGlow
WaveGlow放棄了autogressive的方法,基于flow-based model去做的,這個(gè)模型非常難train,有興趣的同學(xué)可以看一下視頻或者相關(guān)資料學(xué)習(xí),這里不做介紹了。
總結(jié)
以上是生活随笔為你收集整理的Chapter6_Vocoder的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1634. 求两个多项
- 下一篇: 心脏也会长肿瘤?没错,还能得癌症!