由聲學特征重建語音波形-聲碼器的最近進展


本文介紹近期出現的、具有代表性的,由聲學特征重建語音波形的相關工作。將聲學特征轉換為語音波形的這類模型通常被稱作聲碼器,一般來說,目前的端到端語音合成首先由聲學模型生成聲學特征,比如梅爾頻譜、線性譜等,再由聲碼器轉換為最終的語音。生成語音中的韻律、表現力等由聲學模型決定,而清晰度則由聲碼器決定,聲碼器限制了最終合成語音的音質,同時也是整個語音合成模型的計算瓶頸。

Efficient Neural Audio Synthesis

該文提出了一種使用雙Softmax的單層循環神經網絡WaveRNN用於波形重建。文中為了加快樣本點生成速度和減小模型大小,展示了參數裁剪、子尺度(subscale)等技術。

代碼地址:fatchord/WaveRNN

簡介

序列模型的生成耗時分析

序列模型的生成時間\(T(u)\)是序列長度\(|u|\)和生成每一個樣本點\(u\)耗費時間的乘積,而生成樣本點\(u\)的時間又可以分為模型\(N\)個網絡層/操作的計算時間\(c(op_i)\)和初始化時間\(d(op_i)\)

\[T(u)=|u|\sum_{i=1}^N(c(op_i)+d(op_i)),\tag{1} \]

對於波形重建而言,序列長度\(|u|\)本身就很大,特別對於高質量的語音進行重建時,每秒包括24000個16bit位深的樣本點。因此為了提高效率,可以通過:

  1. 減少上式中的\(N\),比如減少模型的層數,降低矩陣乘的次數。對於16bit的樣本點,在WaveRNN中僅需要\(N=5\)個矩陣乘操作,相比之下,WaveNet包含30個殘差模塊,每個殘差模塊又包含2個網絡層,每一個樣本點需要\(N=30\times 2=60\)個矩陣乘操作。

  2. 減少上式中的\(c(op_i)\),比如利用參數裁剪技術減少模型中的參數數量。在WaveRNN中通過參數裁剪(weight pruning)技術稀疏模型參數,在實驗中發現,對於固定的參數數量,大的稀疏WaveRNN要顯著優於小而密集的WaveRNN。

  3. 減少上式中的\(d(op_i)\),在WaveRNN中采用定制的GPU操作減少時間開銷。

  4. \(u\)生成的並行化,\(|u|\)固然不能減小,但在WaveRNN中采用了子尺度(subscaling)的生成技術。一個長度為\(L\)的向量折疊為\(B\)個長度為\(L/B\)的子向量,\(B\)個子向量依次生成,每一個都依賴於之前的子向量。子尺度技術使得在一個批次內能夠同時生成多個樣本點。實踐中,每個子向量的生成僅需要很小的下文信息,不需要依賴遙遠的未來信息,因此下一個子向量的生成,可以在上一個子向量生成過程開始的不久之后就進行。實驗中,子尺度WaveRNN能夠在每一步產生\(B=16\)個樣本,而不會損失音頻清晰度。

WaveRNN

卷積序列模型為了增大感受野,一般需要疊加很深的網絡層。WaveRNN講RNN的狀態分為兩個部分,分別用於預測16bit音頻樣本點更為重要的粗8位(8 coarse bits)\(c_t\)和較不重要的細8位(8 fine bits),每個部分都會饋送到相應的softmax層,細8位的預測要以粗8位為輸入條件。也即:

\[x_t=[c_{t-1},f_{t-1},c_{t}]\\ u_t=\sigma(R_uh_{t-1}+I_u^*x_t)\\ r_t=\sigma(R_rh_{t-1}+I_r^*x_t)\\ e_t=\tau(r_t\circ (R_eh_{t-1})+I_e^*x_t)\\ h_t=u_t\circ h_{t-1}+(1-u_t)\circ e_t\\ y_c,y_f=split(h_t)\\ p(c_t)=\mathop{softmax}(O_2 \mathop{relu}(O_1y_c))\\ p(f_t)=\mathop{softmax}(O_4 \mathop{relu}(O_3y_f)),\tag{2} \]

每個音頻樣本點要生成16bit,如果直接使用softmax需要\(2^{16}\)個標簽,WaveRNN將16bit分為兩個部分,也就是粗8位\(c_t\)和細8位\(f_t\),從而將輸出空間壓縮到\(2^8=256\)個值上。

由於\(f_t\)的值依賴於\(c_t\),因此需要先計算\(c_t\),注意到公式第1行中\(c_t\)既作為輸入,公式第7行又作為了輸出。這就是帶有\(*\)的這些矩陣的屏蔽作用了,矩陣\(I\)其實是一個掩蔽矩陣(mask matrix),用於切斷輸入中的\(c_t\)和輸出中的\(c_t\)的一切連接,最終作為輸入的粗8位\(c_t\)僅僅與細8位\(f_t\)的狀態\(u_t,r_t,e_t,h_t\)相連接,而不會在求\(c_t\)時,將\(c_t\)作為輸入,因此上式中除了最后兩個之外,其實都需要計算兩遍。

上圖中,輸入門首先從輸出分布\(p(c_t)\)中采樣出\(c_t\)\(c_t\)被采樣出來之后,\(f_t\)才能被計算和采樣出來。注意,上圖中的\(c_t\)並沒有作為\(p(c_t)\)的輸入。

Sparse WaveRNN

  1. 參數稀疏方法

為了降低模型大小和提高生成速率,必須減小模型的參數量。通過實驗發現,在同樣參數量的情況下,大而參數“稀疏”的模型要比小而參數“密集”的模型效果好得多。所謂參數“稀疏”是指在參數矩陣中,值為0的參數比較多,WaveRNN采用權重裁剪方法的方法減少模型中的非零權重。具體的做法是,對每一個參數矩陣都維護一個二元掩蔽(binary mask)矩陣,開始時二元掩蔽矩陣的元素值全為1,每訓練一段時間,就會對參數矩陣的元素進行排序,將參數矩陣值最小的\(k\)個元素對應的mask置為0。

\(k\)的計算需要考慮想要的稀疏度\(Z\)和參數矩陣中的元素總量,因此想要計算一個比例\(z\),這個比例\(z\)乘上參數總量就是\(k\)的值,在訓練過程中,從0開始逐漸增加到目標稀疏度\(Z\),比例系數\(z\)的計算公式如下:

\[z=Z(1-(1-\frac{t-t_0}{S})^3) \]

其中,\(t\)為此時的訓練步數,\(t_0\)為參數裁剪開始時的訓練步數,\(S\)是總的裁剪步數。在該文的實驗中,設置\(t_0=1000,S=200k\),共訓練\(500k\)步。文中使用該策略稀疏GRU單元的3個門矩陣。

同時,還可以通過編碼稀疏矩陣的方法提高計算效率。該文發現,對於非結構化稀疏而言,\(m=16\)的參數塊僅犧牲很小的表現,就能將稀疏矩陣所需的內存占用降低到\(\frac{1}{m}\)。(注:這里有點不懂,這是什么原理?)實驗中分別采用了\(4\times 4\)\(16\times 1\)塊,后者有更高的生成速率。

  1. 子尺度WaveRNN

如果可以一次同時生成多個樣本點,就可以“減小”序列長度,就是一個並行生成的概念。這里一次生成\(B\)個樣本點,因此序列長度就“縮小”了\(B\)倍:

\[T(u)=\frac{|u|}{B}\sum_{i=1}^N(c(op_i^B)+d(op_i^B)) \]

注意,這實際上並不代表着生成過程直接降低了\(B\)倍,因為每個批次的生成在一開始是串行生成的,只不過后續的批次只需要在前面批次開始生成后不久,就可以執行生成了。

如上圖,每個方塊表示一個16bit樣本點,白色方塊表示正在生成的樣本點。在中間一幅圖中,藍色方塊表示已經生成的,用於指導當前樣本點\(x\)生成的歷史樣本點;淺藍色方塊表示已經生成的,用於指導當前樣本點\(x\)生成的未來樣本點;最淺藍色方塊表示已經生成的,遠距離的未來樣本點。可以用於指導當前樣本點生成的歷史樣本點是幾乎沒有限制的,而未來樣本點的多寡與條件網絡的感受野有關,圖中以感受野大小\(F\)示意了這層關系。此外,注意圖中樣本點的折疊方式,有數字1、5、9、13示意了折疊后的順序,列從下至上是樣本點的真實排列順序,行從左至右是當前樣本點的索引值+8的未來樣本點。

從圖中可以發現,當前樣本點的生成不僅僅依賴於之前的樣本點,而且還會依賴未來的樣本點,生成樣本點的概率分布可以表示如下:

\[P(u)=\prod_{s=0}^{B}\prod_{i=0}^{|u|/B}P(u_{B_{i+s}}|u_{B_{j+s}}\ for\ j<i,\\ u_{B_{k+z}}\ for\ k\geq 0\ and\ z<s) \]

在上式中,樣本點\(u_{B_{i+s}}\)依賴於之前\(z<s,k\geq 0\)的所有樣本點\(u_{B_{k+z}}\)。樣本點\(u\)的生成過程是:首先生成第一個子向量;之后以第一個子向量為條件,生成第二個子向量;第三個子向量之前兩個子向量為條件,以此類推。

Parallel WaveGAN: A Fast Waveform Generation Model based on Generative Adversarial Networks with Multi-resolution Spectrogram

Parallel WaveGAN是一種利用生成對抗網絡(Generative Adversarial Networks,GAN)無需蒸餾、快速、小型的波形生成方法。在該模型中,使用聯合優化的多尺度頻譜和對抗損失函數訓練非自回歸“WaveNet”。

代碼地址:kan-bayashi/ParallelWaveGAN

簡介

基於GAN的並行波形生成

GAN是一種利用兩個神經網絡進行對抗升級的訓練策略,一般包括兩個模塊:生成器\(G\)和判別器\(D\)。和原始的WaveNet相比,該文中的Parallel WaveGAN(PWG)的生成器有以下的不同:

  1. 使用非因果卷積;

  2. 使用從高斯分布采樣的隨機噪聲作為輸入;

  3. 在訓練和推斷階段,該模型都采用的是非自回歸模式。

Parallel WaveGAN(PWG)基於穩定性的考慮,采用最小二乘GAN(least-squares GANs)。Parallel WaveGAN(PWG)的生成器努力學習真實波形的分布,最終以假亂真,能夠讓判別器將生成波形誤判為真實的。也即是最小化以下的對抗損失函數:

\[L_{adv}(G,D)=\mathbb{E}_{z\sim N(0,I)}[(1-D(G(z)))^2],\tag{1} \]

其中,\(z\)為輸入白噪聲。上式為了簡潔,將\(G\)的輔助部分省略掉了。

另一方面,判別器需要學習學習判定出真實音頻,而區分出生成音頻。也就是,使用的優化准則為:

\[L_D(G,D)=\mathbb{E}_{x\sim p_{data}}[(1-D(x))^2]+\mathbb{E}_{z\sim N(0,I)}[D(G(z))^2],\tag{2} \]

其中,\(x\)\(p_{data}\)分布表示目標波形和分布。

多尺度短時傅里葉變換輔助損失(Multi-resolution STFT auxilliary loss)

為了適用波形生成的需要,提出了多尺度短時傅里葉變換輔助損失。定義單個的短時傅立葉變換損失(STFT loss):

\[L_s(G)=\mathbb{E}_{z\sim p(z),x\sim p_{data}}[L_{sc}(x,\hat{x})+L_{mag}(x,\hat{x})],\tag{3} \]

其中,\(\hat{x}\)表示生成樣本,也即\(G(z)\)\(L_{sc}\)表示譜收斂(spectral convergence)損失,\(L_{mag}\)表示對數短時傅里葉變換幅度(log STFT magnitude)損失,分別定義如下:

\[L_{sc}(x,\hat{x})=\frac{||\ |STFT(x)|-|STFT(\hat{x})|\ ||_F}{|\ ||STFT(x)||\ |_F}, \\ L_{mag}(x,\hat{x})=\frac{1}{N}||\ \mathop{log}|STFT(x)|-\mathop{log}|STFT(\hat{x})|\ ||_1,\tag{4} \]

其中,\(||\cdot||_F\)表示Frobenius范數,就是矩陣元素的平方和再開方:

\[||A||_F=\sqrt{\sum_{i=1}^{m}\sum_{j=1}^{n}|a_{ij}|^2} \]

\(||\cdot||_1\)為L1范數:

\[||A||_1=\sum_{i=1}^{n}|a_i| \]

\(|SFTF(\cdot)|\)表示短時傅立葉變換的幅度值,\(N\)表示幅度值的元素個數。

該文中所謂的多尺度傅立葉變換損失,就是使用不同分析參數(比如傅立葉變換時的傅立葉變換大小FFT size,窗大小window size,幀移frame shift)的多個單短時傅立葉變換損失。假設有\(M\)個單短時傅立葉變換損失,則多尺度短時傅立葉變換輔助損失(\(L_{aux}\))定義為:

\[L_{aux}(G)=\frac{1}{M}\sum_{m=1}^{M}L_s^{(m)}(G)\tag{6} \]

在基於傅立葉變換的時域信號表示中,時域分辨率和頻域分辨率總是魚與熊掌不可兼得,比如增加窗長會提高頻域分辨率,而降低時域分辨率。通過結合不同分析參數下的多個短時傅立葉變換損失,可以幫助生成器學習語音的時域特性。此外,其也防止生成器對固定短時傅立葉變換的表示過擬合,能夠有效地提高整個生成波形的最終表現。

因此,最終的生成器損失就是多尺度短時傅立葉變換損失和對抗損失的線性組合:

\[L_G(G,D)=L_{aux}(G)+\lambda_{adv}L_{adv}(G,D).\tag{7} \]

其中,\(\lambda_{adv}\)是平衡兩個損失項的超參數。

實驗語料

實驗中使用24kHz,位深16bit的音頻,11449句話,23.09小時。80維對數梅爾頻譜(80-band log-mel spectrogram)作為輸入的聲學特征,梅爾頻譜的頻域范圍為70-8000Hz,幀長50ms,幀移12.5ms,在訓練之前將梅爾頻譜規范化到0均值單位方差上。

實驗細節

實際實現上,Parallel WaveGAN包含30個擴展殘差卷積層,3個指數級擴展周期。殘差和跳連的通道數設置為64,卷積核大小設置為3。判別器包含10個非因果擴展一維卷積,采用leaky ReLU激活函數(\(\alpha=0.2\)),步長設置為1,並且除了第一層和最后一層,一維卷積的擴展數線性增加,范圍為\([1,8]\)。生成器的通道數、卷積核大小和判別器保持一致。對於判別器和生成器中的所有卷積層,均進行權重歸一化(weight normalization)。

如上表,多尺度短時傅里葉變換損失是上表中三組分析參數計算出的單損失之和。經過實驗驗證,公式7中的超參數\(\lambda_{adv}\)設置為4.0。判別器在初始的100k步時固定,其后判別器和生成器聯合訓練。batch size設置為8,每一個音頻片段剪裁到24k個樣本點(1秒)。該模型通過上采樣和二維卷積,使得聲學特征的時間分辨率能夠匹配語音波形的采樣率。注意,聲學特征並沒有用於判別器。

如上表是Parallel WaveGAN與其它基線模型的生成速度和MOS得分。

如上表是Parallel WaveGAN與其它基線模型的訓練時間比較,所有模型均使用兩卡V100訓練。

MelGAN: Generative Adversarial Networks for Conditional Waveform Synthesis

MelGAN采用非自回歸前饋卷積架構,在不引入額外蒸餾和感知損失的前提下,依然能夠產生高質量的語音,是第一種利用生成對抗網絡(Generative Adversarial Networks,GANs)合成時域波形的方法。由於模型計算復雜度低,並行度高,因而合成速度極快。

代碼地址:

簡介

由於MelGAN是基於GAN的生成模型,因而主要由生成器和判別器組成。生成器輸入語音的壓縮表示,如梅爾頻譜,經過一層卷積后送入上采樣層,上采樣將梅爾頻譜的序列長度匹配波形的頻率。每次上采樣都嵌套殘差模塊,最后經過一個卷積層獲得音頻輸出。由於所要生成音頻的聲道數為1,因此最后一個的卷積層通道數也為1。對於判別器,主體是由卷積層和下采樣層組成,並且采用多尺度架構,也就是不但對原始音頻做判別,還將降頻處理之后的音頻饋送到判別器中進行判斷,這里的降頻采用平均池化的方法。MelGAN選擇基於分組卷積的判別器,並使用所允許的最大卷積核,保持較小參數量的同時,捕獲音頻幀之間的相關性。

判別器和生成器具體的損失函數為:

\[\mathop{min}_{D_k}(\mathbb{E}_x[(D_k(x)-1)^2]+\mathbb{E}_{s,z}[D_k(G(s,z))^2]),\tag{1} \]

其中,\(D_k\)是第\(k\)個判別器,\(K\)為判別器的數量,\(x\)表示原始波形,\(s\)梅爾頻譜,\(z\)表示高斯噪聲向量。

\[\mathop{min}_G(\mathbb{E}_{s,z}[\sum_{k=1}^K(D_k(G(s,z))-1)^2]+\lambda \sum_{k=1}^K L(G,D_k)),\tag{2} \]

其中,

\[L(G,D_k)=\mathbb{E}_{x,s}[\sum_{i=1}^T\frac{1}{N_i}||D_k^{(i)}(x)-D_k^{(i)}(G(s))||_1],\tag{3} \]

\(L(G,D_k)\)是特征匹配損失,\(D_k^{(i)}\)是第\(k\)個判別模塊的第\(i\)層的特征圖輸出,\(N_i\)是每一層的單元數,\(||\cdot||_1\)是L1范數。

最終MelGAN的訓練目標為:

\[\mathop{min}_G(\mathbb{E}_{s,z}[\sum_{k=1}^K(D_k(G(s,z))-1)^2]+\lambda\sum_{k=1}^KL(G,D_k)).\tag{4} \]

Multi-band MelGAN: Faster Waveform Generation for High-Quality Text-to-Speech

多頻帶MelGAN將Parallel WaveGAN中的多尺度短時傅里葉變換損失(multi-resolution STFT loss)引入到MelGAN中,並且在音頻的多個子帶上分別度量損失。

代碼地址:

簡介

盡管使用的特征匹配損失可以穩定整個網絡的訓練,但無法有效衡量真實和預測音頻之間的差異,因此引入了類似於Parallel WaveGAN的多尺度短時傅里葉變換損失(multi-resolution STFT loss)。對於單短時傅里葉變換損失,最小化真實音頻和生成音頻的譜收斂(spectral convergence)\(L_{sc}\)和對數短時傅里葉變換的幅度值(log STFT magnitude)\(L_{mag}\)

\[L_{sc}(x,\widetilde{x})=\frac{||\ |STFT(x)-STFT(\widetilde{x})|\ ||_F}{||\ |STFT(x)|\ ||_F},\tag{5} \]

\[L_{mag}(x,\widetilde{x})=\frac{1}{N}||\mathop{log}|STFT(x)-\mathop{log}|STFT(\widetilde{x})|\ ||_1.\tag{6} \]

其中,\(x\)是真實音頻,\(\widetilde{x}\)是生成器\(G(s)\)輸出的預測音頻,\(||\cdot ||_F\)\(||\cdot ||_1\)表示Frobenius和L1范數,\(|STFT(\cdot)|\)表示短時傅里葉變換,\(N\)是幅度譜的元素個數。

對於多尺度短時傅里葉變換目標函數,有\(M\)個不同分析參數的單短時傅里葉變換損失,加和平均這些單個損失:

\[L_{mr\_stft}(G)=\mathbb{E}_{x,\widetilde{x}}[\frac{1}{M}\sum_{m=1}^M(L_{sc}^m(x,\widetilde{x})+L_{mag}^m(x,\widetilde{x}))],\tag{7} \]

對於全頻帶版本的MelGAN(FB-MelGAN),使用多尺度短時傅里葉變換損失替換特征匹配損失,因此最終的損失函數為:

\[\mathop{min}_G \mathbb{E}_{s,z}([\lambda \sum_{k=1}^K(D_k(G(s,z))-1)^2]+\mathbb{E}_s(L_{mr\_stft}(G))),\tag{8} \]

而對於多頻帶MelGAN(MB-MelGAN),同時在全帶和各個子帶尺度上應用多尺度短時傅里葉變換損失:

\[L_{mr\_stft}(G)=\frac{1}{2}(L_{fmr\_stft}^{full}(G)+L_{smr\_stft}^{sub}(G)),\tag{9} \]

其中,\(L_{fmr\_stft}^{full}\)\(L_{smr\_stft}^{sub}\)分別表示多尺度短時傅里葉變換損失的全頻帶和子頻帶版本。

MB-MelGAN使用一個生成器生成所有子帶的信號,共享的生成器以梅爾頻譜作為輸入,同時預測所有子帶的信號以用於多尺度短時傅里葉變換的計算。具體的訓練方法如下。

  1. 初始化\(G\)\(D\)的參數。

  2. 如果是FB-MelGAN,使用公式7中的\(L_{mr\_stft}(G)\)預訓練\(G\),直至收斂;如果是MB-MelGAN,使用公式9中的\(L_{mr\_stft}\)預訓練\(G\),直至收斂。

  3. 使用公式1訓練\(D\)

  4. 使用公式8訓練\(G\)

  5. 重復步驟3、4,直至\(G-D\)模型收斂。

在訓練完成后,利用生成器\(G\)生成音頻即可。

總結

可以看到,為了平衡生成速率和音質,近期的工作主要集中在利用生成對抗網絡的改進上。WaveRNN能夠取得較好的音質,但速度比較慢;Parallel WaveGAN和Multi-Band MelGAN可以在較短時間內合成較好的音頻。目前的神經聲碼器已經可以實時生成波形。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM