尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️
文章目錄[ 隱藏 ]
- 使用樹莓派和Python做到目標檢測
- 傑出數據科學家的關鍵技能是什麼?
- 初學者怎樣使用Keras進行遷移學習
- 如果你想學數據科學,這 7 類資源千萬不能錯過
- 深度學習目標檢測算法綜述
- 一文教你如何用PyTorch構建 Faster RCNN
- 高級DQNs:利用深度強化學習玩吃豆人遊戲
- 用於深度強化學習的結構化控制網路 (ICML 論文講解)
本文為 AI 研習社編譯的技術博客,原標題 :
WaveNet: Google Assistant’s Voice Synthesizer
作者 | Janvijay Singh
翻譯 | 醬番梨、王立魚、莫青悠、Disillusion
校對、整理 | 菠蘿妹
原文鏈接:
https://towardsdatascience.com/wavenet-google-assistants-voice-synthesizer-a168e9af13b1
一文帶你讀懂 WaveNet:Google助手的聲音合成器
有沒有想過有可能使機器合成的人類聲音幾乎和人類本身的聲音一樣自然? WaveNet使其成為可能。
語音合成. 波音拼接合成. 參數合成. 深度學習.
機器合成擬人化語音(文語轉換)的想法已經存在很長時間了。在深度學習出現之前,存在兩種主流的建立語音合成系統的方式,即波音拼接合成和參數合成。
在波音拼接合成的文語轉換中,它的思路就是通過收集一個人的一長列句子的發聲錄音,將這些錄音切割成語音單元,嘗試著將那些和最近提供的文本相匹配的語音單元進行拼接縫合,從而生成這文本對應的發聲語音。通過波音拼接合成產生的語音,對於那些文本已經存在於用於初始收集的錄音之中的部分,文語轉換後的語音聽上去比較自然,但是那些初次遇見的文本,就會聽上去有些異樣。除此之外,修飾聲音要求我們對整個新錄音集進行操作。反之在參數合成的文語轉換中,它的思路是通過參數物理模型(本質上來說就是一個函數)來模擬人類的聲道並使用記錄的聲音來調整參數。通過參數合成文語轉換生成的聲音聽上去沒有通過音波結合文語轉換生成的聲音那麼自然,但是這種方式更容易通過調整某些模型中的參數來修飾聲音。
最近來,隨著WavNet的面世,對我們來說以端對端(來自聲音記錄本身)的方式來生成未處理的聲音樣本成為可能,可以簡單的修飾聲音,更重要的是和現存的語音處理方式相比,得到的聲音明顯的更加自然。所有的一切都要感謝深度學習的出現。
為什麼WaveNet會讓人如此的激動?
為了能夠描繪出WaveNet和現存的語音合成方法的區別,採用了主觀5分平均意見分法(MOS)測試進行統計。在平均意見分測試中,提供給對象(人)從各個聲音合成系統中合成的聲音樣本,並被要求以5分制來評估樣本的自然度(1:很差 2:較差 3:一般 4:好 5:優秀)。
用於主觀5分平均意見分法的聲音樣本分別從基於長短期記憶-循環神經網路(LSTM-RNN)的參數合成,基於隱馬爾可夫模型(HMM)的語音單元集的波音拼接合成,和基於WaveNet的語音合成得到的。
從柱狀圖中可以清晰看到,WaveNet在5分制中得到了大概4.0分左右,很明顯是優於其他的系統基線的,並且非常接近真實的人類聲音。查閱了DeepMind’s blog 可以認識到在合成的語音的自然度方面這些方法的區別所在。除了能夠輸出合成的語音樣本,WaveNet能夠輕鬆的適應各種各樣的語音特性,如:文本,發言者特性等,來生成滿足我們需求的聲音。這使它更加的令人感到激動。
WaveNet. 生成式模型.
生成式模型。這是指什麼呢?給出的一般的未標記的數據點,一個生成式模型會嘗試去學習什麼樣的概率分布可以生成這些數據點,目的是為了通過利用學習分布來產生新的數據點(與輸入數據點相似)。生成式模型可以通過不同的方式對概率分布建模,隱式(具有可處理或近似密度)或者顯式。當我們說一個生成式模型是顯式建模模型的話,意味著我們明確的定義概率分布並嘗試去適配每一個輸入的未標記數據點。與它形成對比,一個隱式生成式模型學習一個概率分布,可以直接取樣新數據點而不需要明確的定義。GANs(生成對抗網路),目前深度學習領域的聖杯,就屬於隱式生成式模型。然而,WaveNet和它的表親Pixel CNNs/RNNs(像素卷積神經網路模型/遞歸神經網路模型) 都屬於顯示生成式模型。
WaveNet如何明確的建立概率分布模型?WaveNet試圖對一個數據流X的聯合概率分布建立模型,對數據流X中的每一個元素Xt的條件概率求乘積。因此對於一段未處理音波X = {X1, X2, X3 … XT},構建的聯合概率函數如下:
每一個樣本Xt 因此而受限於所有的先前時間步長的樣品。在一個時間步長上的觀察結果取決於先前時間步長的觀察結果(這就是我們試圖使用每一個條件分布項去構建的模型),這看上去難道不像是一個時間序列預測模型嗎?事實上,WaveNet是一個自動回歸模型。
我們要如何去對這些條件分布項進行建模呢?RNs(遞歸神經網路模型)或者LSTMs(長短記憶網路模型)作為強有力的非線性時序模型是最顯而易見的選擇。事實上,像素遞歸神經網路使用同樣的思路來生成與輸入的圖像相似的合成圖像。我們可以使用這種思路來生成合成語音嗎?語音是從至少16KHZ的頻率取樣,這意味著,每秒的音頻至少有16000個樣本。RNNs(遞歸神經網路)或者LSTMs(長短記憶網路)還未曾對如此長(大約10000時間步長序列)的時間依賴性進行建模,他們目前能建模的最長時間依賴性是100時間步長序列,因此這兩種模型並不能很好的適用於語音合成。我們能否適用CNN(卷積神經網路)來處理呢?等一下,CNNs(卷積神經網路模型)?如何做到呢?相似的思路已經被使用於像素卷積神經網路模型中了。
卷積神經網路模型. 因果卷積. 膨脹卷積.
為什麼我們要嘗試使用CNNs(卷積神經網路模型)?CNNs(卷積神經網路模型)訓練速度與RNNs(遞歸神經網路模型)或者LSTMs(長短記憶網路模型)相比是典型地更快速,尤其是應用於長的一維序列,因為與每一個掩模或過濾器的卷積位置相關的操作可以以一個並行,獨立的方式進行。更快的訓練速度。聽上去很棒!自回歸(一個時間步長的輸出是只依賴於先前時間步長的輸出而與未來時間步長的輸出無關)的性能如何呢?因果卷積在此轉化成行動。一維因果卷積可以輕易的通過左填充輸入的一維序列來執行,在這里通過為卷積補充適量的0來得到一個可用的卷機。與RNNs(遞歸神經網路模型)和LSTMs(長短記憶網路模型)相比,因果卷積可以允許我們去對長的多的時間依賴性(也允許我們指定回看長度)進行建模。
因果卷積確保模型不會違反我們對數據構建的模型的規則
很好!我們已經可以輕易地處理自回歸違規的問題。但是關於管理幾千個樣本序列的回看長度的問題呢(例如我們的模型在當前時間步長上畫一個關於輸出的卷機之前,回看至少一秒的音頻)? 能想到的最簡單做到的方式就是將過濾器的規格增加到足夠可以回看適當長度,但是這種方式真的有效嗎? 我認為這種做法會使模型減少非線性,這會導致模型難以學習複雜的暫時依賴性,從而限制了模型的性能。你想到的下一個想法可能是增加神經網路的層數 。這種方法可能有效。但是計算上是不可能的,因為對輸出中的一個時間步長內的接受域大小或者回看長度,隨模型中的隱藏層數線性增長,而對於我們計算上來說是不希望有一個有著幾千個隱藏層的模型。現在我們要考慮的是限制隱藏層的數量、過濾器的大小和增加回看長度?我們將如何做到呢?膨脹卷積將會幫助我們。
膨脹卷積嘗試通過將過濾器應用在超過它本身長度的區域上和按特定步驟跳過輸入值的方式,來增加回看長度或者接受域大小。 這等同於一個卷積使用通過0來擴充原過濾器得到更大的過濾器但是顯然這種方式更加有效。在WaveNet中,多重膨脹卷積層一個個疊放來通過極少的層來獲得極大的接受域。
膨脹因果卷積層堆:加倍每層的膨脹因子會使接受域以 O(2^n)倍增。
Softmax(柔性最大傳輸函數)分布. Mu-law 壓縮.
為了對條件概率見面,WaveNet採用softmax分布(分類分布)來替代其他的混合模型,分類分布沒有對它的形狀進行假設,因此而更加靈活,更容易對任意分布建模。 未處理音頻被作為16位整數值(-32,768…32,767)存儲,使用一個softmax層輸出概率分布需要我們的模型在一個時間步長上輸出65,5535個數值。這會拉慢模型表現嗎?這確實會。我們可以做什麼來改善呢?減少位深度會起到作用。如果我們使用線性位深度減少(除以256)對低振幅樣本的影響會比對高振幅樣本的影響更大。 考慮一個初始值是32767的16位樣本,可取的最大正數值。轉化為8位,樣本值變為127(32767/256 = 127餘255),舍入誤差是255/32768。 這是一個小於1%的量化誤差。但是將這個誤差與最小量級的16位樣本,那些取值在0與255之間的樣本,獲得的量化誤差相比較。當最小量級的16位樣本簡化成8位的時候,轉化後的值會接近於0,誤差是100%。所以使用線性位深度縮減方法舍入,對低振幅樣本的影響會比對高振幅樣本的影響更大。 如果我們可以重新分配樣本數值,更多的量化等級在較低的振幅,少量的量化等級在較高的振幅,就可以減少量化誤差。這就是在WaveNet中使用Mu-law分布(非線性量化)來代替使用簡單的線性量化的原因。
執行Mu-law壓縮的表達式比使用線性量化的可以等到更優的重構輸出(更接近與原音頻) 。
在上面的表達式中,−1
選通激活函數. 跳躍連接和殘差連接.
非線性激活函數對於任何一個學習輸出與輸入之間的複雜關係的深度學習模型來說都是要素之一。RELU(線性單元)最初在WaveNet中被使用,但是在執行實驗後發現,對於WaveNet來說,使用一個非線性的tan-hyperbolic(tanh)函數選通sigmoid (S型)函數的激活函數效果更好。
在WaveNet中使用的選通激活函數表達式
在上面的表達式中,W 表示可許阿西過濾器,* 表示卷積算子,⊙表示同或數學運算符。殘差連接,不斷疊加底層和它上層的輸出,跳躍連接,直接將底層輸出疊加到輸出層,這兩者已經證實在減少神經網路與訓練深層網路的收斂時間方面是有效的。因此,如下圖所示,殘差連接已經在WaveNet的架構中被使用。
WaveNet架構:選通激活函數,跳躍連接,殘差連接
調節. 本地. 全局.
現在還沒有講到,我們如何根據演講者身份,相應文本等各種功能來調節輸出語音。WaveNet的輸出語音可以通過兩種方式進行調節:(1)全局調節,(2)單個特徵偏置輸出所有時間步驟,如說話者的身份或局部調節,具有多個特徵,實際上是不同的時間序列特徵,其在不同時間步驟偏置輸出,如語音的基礎文本。如果我們更正式地表達這一點,那麼這將意味著在實際模型中在條件分布術語(本地條件中的Ht和全局調節中的H)中引入新參數。
在引入條件輸入之後修改條件分布項
在本地調節中,調節輸入的時間序列可能具有比音頻更短的長度,並且對於局部調節,要求兩個時間序列必須具有相同的長度。為了匹配長度,我們可以使用轉置的CNN(一種可學習的上采樣方案)或其他上采樣方案來增加調節輸入的長度
引入偏差項h後的表達式
在上面的表達式中,V是可學習的線性投影,其基本上用於兩個目的變換h以校正尺寸並學習偏置輸出的正確權重。
很棒的模型. 快速的訓練. 緩慢的推理?
WaveNet的架構,無論我們到目前為止討論了什麼,都很好地捕獲了複雜的時間依賴性和條件。除此之外,高度並行化使訓練變得非常迅速。但是推理呢?由於時間步長的輸出依賴於前一個時間步長的輸出,所以對新音頻的采樣本質上是連續的。產生1秒的輸出大約需要1分鐘的GPU時間。如果Google將這個模型部署到他們的助手上,那麼對於像「嘿Google!天氣怎麼樣?」這樣簡單的問題也得花上幾個小時來思考。那麼他們是如何縮短推理時間的呢?IAF就是答案。
規範化流程 IAF
什麼是規範化流程?規範化流程是一系列轉換的過程,可以學習從從簡單概率密度(如高斯)到豐富的複雜分布的映射(雙射)。設想一下,如果你從概率分布q(z)和概率分布q(x)中采樣中得到足夠多的點,那麼這個規範化流程可以用來學習轉換過程,也就是從q(x)采樣的點映射到其在分布q中的相應映射(Z)的過程。這個過程如何完成的?讓我們先考慮有一個轉換f,f是一個一個可逆和平滑的映射。如果我們使用此映射來轉換具有分布q(z)的隨機變量z,那麼,我們得到的隨機變量z’= f(z)具有分布q(z’):
為了向你更加直觀地介紹,我們是如何為變換後的隨機變量的分布得出這個表達式,請查看Eric Jang的這篇博客文章。一個轉換是否足夠?實際上,我們可以通過組合幾個簡單的變換,並連續應用上述表達式來構造任意複雜的密度。通過將分布q0通過K變換鏈fk連續變換隨機變量z0而獲得的密度qK(z)是:
這些變換中的每一個都可以使用矩陣乘法(具有可學習的值)輕鬆建模,然後是非線性,例如ReLU。然後,通過優化在變換的概率分布qK(z)下從q(x)采樣的點的似然性(對數似然),使用任何您喜歡的優化算法來更新變換的可學習參數。這將使分布qK(z)與q(x)非常相似,從而學習從q(z)到q(x)的適當映射。
經過一系列可逆變換的分布流
規範化流程的想法如何幫助我們快速推理?請記住,WaveNet是一個生成模型,它除了嘗試學習可能產生訓練數據的概率分布之外,什麼都不做。因為它是一個明確定義的生成模型(具有易處理的密度),我們可以很容易地學習一個可以映射簡單點的轉換,像Gaussian這樣的分布到WaveNet學習的複雜分類分布。如果學習到的具有快速推理方案的規範化流程,我們可以輕鬆地對WaveNet中的慢推理問題進行排序。 IAF(反向自回歸流)可以很好地適應這種想法。 在IAF中,我們的想法是首先從z~Logistic(0,I)中抽取隨機樣本,然後將以下變換應用於繪制的樣本。
zt上的簡單縮放和移位變換,其中縮放因子(s)和移位因子(μ)通過使用可學習參數(θ)和來自先前時間步長的輸入樣本z中的值來計算
為了輸出時間步長xt的正確分布,逆自回歸流 基於噪聲輸入z1到zt-1的序列,可以隱含地推斷它之前的time-step x1到xt-1的序列。噪聲輸入序列可以在給定zt的情況下並行輸出所有xt。下面的圖片會讓事情變得更加清晰(注意改變記譜法)。
在逆自回歸流中,可以並行計算不同時間步的輸出,因為時間步的輸出不依賴於先前時間步的輸出
太棒啦! IAF具有快速推理方案(甚至可以並行計算條件概率),但它們訓練較慢。為什麼比較慢呢?因為如果你給我們一個新的數據點並要求評估密度,我們需要恢復u,這個過程固有的順序很慢。 Parallel WaveNet利用這一事實,提出了使用簡單的WaveNet(教師WaveNet)培訓IAF(學生WaveNet)的概念。
並行. 更快. WaveNet.
與WaveNet差不多,我們的想法是利用IAF具有快速推理方案的特性。因此,在第一階段,我們訓練出一個簡單的WaveNet模型(我們稱之為教師培訓)。在第二階段,我們凍結教師WaveNet的權重,並利用它來訓練IAF(Student Distillation)。我們的想法是先從z~Logistic(0,I)中抽取一個隨機樣本,然後以並行方式傳遞給IAF。這將為我們提供轉換分布和相關條件概率的要點。我們的想法是通過簡單的教師WaveNet將這一點轉換為轉換後的分布,這將產生關於已經訓練過的教師WaveNet的條件概率。然後我們嘗試最小化從任一模型接收的條件概率之間的KL-差異。這將允許IAF(學生WaveNet)學習與其教師幾乎相似的概率分布,並且結果驗證了這一事實,因為從教師和學生WaveNet收到的輸出之間的5級MOS分數幾乎可以忽略不計。
Parallel WaveNet的培訓程序
部署的速度是否足夠快?是的。實際上,它能夠以比實時快20倍的速度生成語音樣本。但是仍然存在一個問題,每當我們需要重新訓練我們的模型時,我們首先會訓練WaveNet教師然後訓練學生WaveNet。此外,學生WaveNet的表現在很大程度上取決於教師WaveNet的培訓情況。但總的來說,進行部署是件好事。
「理論是廉價的,請給我代碼。(實踐出真知)」
在網上有許多的關於簡單的WaveNet的實踐可以使用,但是關於並行實踐目前還沒有找到。
1.Keras實踐
2.PyTorch實踐
3.TensorFlow實踐(這是目前網上可被使用的實踐中被引用借鑒最多的)
參考文獻:
-
Audio Companding.
-
Convolutional Layers in NLP tasks.
-
Dilated Convolutions.
-
Normalising Flows: Tutorial by Eric Jang – Part 1, Part 2. Variational Inference with Normalizing Flows (Paper).
-
Deep Voice: Real-time Neural Text-to-Speech (Paper): Appendix is pretty useful to understand WaveNet.
-
WaveNet: A generative model for raw audio (Paper).
-
Parallel WaveNet: Fast High-Fidelity Speech Synthesis (Paper).
-
PixelCNN, Wavenet & Variational Autoencoders — Santiago Pascual — UPC 2017.
想要繼續查看該篇文章相關鏈接和參考文獻?
長按鏈接點擊打開或點擊【一文帶你讀懂WaveNet:Google助手的聲音合成器】:
https://ai.yanxishe.com/page/TextTranslation/1228
AI研習社每日更新精彩內容,觀看更多精彩內容:雷鋒網雷鋒網雷鋒網
使用樹莓派和Python做到目標檢測
傑出數據科學家的關鍵技能是什麼?
初學者怎樣使用Keras進行遷移學習
如果你想學數據科學,這 7 類資源千萬不能錯過
等你來譯:
深度學習目標檢測算法綜述
一文教你如何用PyTorch構建 Faster RCNN
高級DQNs:利用深度強化學習玩吃豆人遊戲
用於深度強化學習的結構化控制網路 (ICML 論文講解)