機器學習之語音生成&&音樂生成

jasonliu1919發表於2016-10-18

簡介

WaveNet利用神經網路系統對原始音訊波形(Raw SoundWave)建模該網路。基於WaveNet生成的音訊質量優於目前所有的文字轉語音(Text-to-Speech,TTS)系統,將計算機輸出音訊與人類自然語音差距縮小50%。最常用的TTS方法是拼接式語音合成(Concatenative Synthesis):先錄製單一說話者的大量語音片段,建立一個大型語料庫,然後簡單地從中進行選擇併合成完整的大段音訊、詞語和句子。這種“機械式”方法使得計算機輸出音訊經常產生語音毛刺、語調的詭異變化、甚至結巴,並且無法調整語音的語調,強調性音節或情緒。對於這種方式來說,一種新的聲音,是需要一個新的完全資料庫的。
另外一種方法是所謂的引數化方法,利用數學模型對已知的聲音進行排列、組裝成詞語或句子來重新創造音訊,其中生成資料所需的所有資訊都儲存在模型的引數中,因此語音的內容和特徵都可以通過該模型的輸入進行控制。但是,到目前為止,引數 TTS 往往聽起來都不如拼接 TTS 那樣自然——至少在英語等語音的合成上是這樣。現有的引數模型往往是通過將它們輸出經過訊號處理演算法(被稱為語音編碼器(vocoders))來生成音訊訊號。

WaveNet 神經網路架構選擇直接建模音訊訊號的原始波形,一次處理一個樣本。除了能夠產出聽起來更為自然的聲音,使用原始波形意味著 WaveNet 可以建模幾乎任何型別的音訊,包括音樂。

WaveNet:

研究者通常會避免對原始音訊進行建模,因為波形波動得非常快:每秒通常有 16,000 甚至更多個樣本,而且在許多時間尺度上都存在重要的結構。在這些結構中(完全自迴歸模型),對每一個樣本的預測都會受到之前所有樣本的影響(用統計學的話來說:每一個預測分佈的前提是所有先前的觀察),這顯然是一個具有挑戰性的任務。
谷歌今年初發布的 PixelRNN 和 PixelCNN 模型表明不僅一次一個畫素式地生成複雜的自然影象是可能的,而且也可以一次一個顏色通道(colour-channel)地生成,這需要對每張影象進行數千次預測。在這啟發下他們將二維 PixelNet 調整為一維的 WaveNet。
WaveNet 的結構的結構:

![WaveNet 的結構](https://img-blog.csdn.net/20161020202303230) 這是一個完全卷積的神經網路,其中的卷積層有不同的膨脹係數( dilation factors),這讓其感受野(receptive field)可在深度(depth)上**指數式地增長**並可覆蓋數千個時間步驟(timesteps)。 在訓練時間內,其輸入序列是由人類說話者錄製的真實波形。訓練之後,我們可以對這個網路進行取樣以生成合成的語音。在取樣的每一個時間步驟,都會從該網路所計算出的概率分佈中取出一個值。然後這個值會被反饋到輸入,併為下一個步驟生成一個新的預測。像這樣一次一步地構建樣本具有很高的計算成本,但我們發現這對生成複雜的、聽起來真實感強的音訊而言至關重要。 使用谷歌的一些 TTS 資料集訓練 WaveNet,所以我們能評估其表現。與谷歌目前最好的 TTS 系統(parametric 和 concatenative)和使用平均意見得分(Mean Opinion Socres,MOS)測試的人類語音相比,下圖顯示了 WaveNet 從 1 到 5 的質量表現。MOS 是一個主觀的聲音質量測試的標準測量方法,包含帶有人類受試者的盲測(在 100 條測試語句上的超過 500 個評級)。就像我們看到的那樣,在英語和漢語普通話上,WaveNet 減少了頂尖水平與人類水平之間的差距,減小的這個差距超過了 50%。 無論是漢語還是英語,谷歌目前的 TTS 系統被認為是全球最好的,所以使用一個模型對兩者都有改進是一件非常重大的成就。 ![這裡寫圖片描述](https://img-blog.csdn.net/20161020203417440) **知道說什麼** 為了使用 WaveNet 將文字轉化為語音,我們需要讓WaveNet知道待識別的文字中是什麼。我們通過將文字轉換為一序列的**語言特徵**和**語音特徵**(包含了當前音素、音節、詞等方面的資訊)並將其輸送到 WaveNet 中實現這一點。這意味著網路的預測不只以先前的音訊樣本為條件,也以我們想要它說的文字為條件。 如果我們在沒有文字序列的情況下訓練網路,它仍能生成語音,但現在它需要編造它所說的內容。 注意,非語音聲音,比如呼吸和動嘴產生的聲音,有時也會被 WaveNet 生成。這反映出了原音訊模型的更強大的適應性。就像你能從這些樣本中聽到的那樣,一個簡單的 WaveNet 能夠學習許多不同聲音的特性,不論男性女性。為了保證它知道使用給定話語的哪些聲音,我們將對說話者的識別作為該網路的條件之一。有趣的是,我們發現在多個說話者中建模一個說話者的訓練要比單個說話者的訓練更好,表現出了一定形式的遷移學習(transfer learning)。 通過改變說話者身份,我們能使用 WaveNet 用不同的聲音說同樣的事,語音片段省略。 類似地,我們能為模型提供額外的輸入,比如情緒或口音,使得語言更加多變且有趣。 **製造音樂** 因為 WaveNet 可被用於建模任何音訊訊號,我們認為用它來生成音樂也會很有意思。和 TTS 實驗不同,我們沒有調節該網路的輸入序列,以告訴它該播放什麼(比如,一個音樂評分);相反,我們只是讓它生成任何其想生成的東西。當我們在一個古典鋼琴曲的資料集上訓練它時,它產出了一個如下的讓人驚歎的樣本(此處音訊省略,可以看後文實踐生成的音樂)。 WaveNet 為開啟了 TTS、音樂生成和廣義上的音訊建模的大量可能。可以使用深度神經網路一個時間步驟一個時間步驟地直接生成在所有的 16 kHz 音訊上都是有效的,這個事實非常讓人驚訝,更不要說其表現還優於當前最佳的 TTS 系統。我們很高興看到下一步我們能用它來做什麼。

原理

WaveNet利用真實的人類聲音剪輯相應的語言語音特徵來訓練其卷積神經網路(convolutional neural networks),讓其能夠辨別這兩方面(語言和語音)的音訊模式。使用中,對WaveNet系統輸入新的文字資訊,也即相對應的新的語音特徵,WaveNet系統會重新生成整個原始音訊波形來描述這個新的文字資訊。

該網路可基於所有給定的樣本和可能的額外引數的條件下,通過建模條件概率(conditional probability)來生成音訊波形的下一個樣本。
在一個音訊處理步驟之後,其輸入波形會被量化到一個固定的整數範圍內。然後這個整數振幅(integer amplitudes)會被獨熱(one-hot)編碼以生成一個形狀的張量(num_samples, num_channels)。
每個卷積層只能獲得當前和之前的輸入,然後減少通道維度(channel dimension)。
該網路的核心被構建為一個因果擴張層(causal dilated layers)的堆疊,其中每一層都是一個擴張的卷積(dilated convolution,即帶有 hole 的卷積),它只能獲取當前和過去的音訊樣本。
所有層的輸出通過一系列密集的後處理層(postprocessing layers)被結合起來並擴充套件回原來的通道數量,後面再跟上一個 softmax 函式將這些輸出轉換成一個分類分佈(categorical distribution)。
其損失函式是每個時間步驟的輸出和其下一個時間步驟的輸入之間的交叉熵(cross-entropy)。
在這個 repository 中,該網路的實現可以在 wavenet.py 檔案中找到。

安裝和生成

1.wavenet
wave介紹
先用一個短視訊介紹一下wavenet效果
http://v.qq.com/x/page/w0328zc2azc.html

2.下載tensorflow-wavenet
讀者自己先配置好tensorflow
git clone –recursive https://github.com/ibab/tensorflow-wavenet

3.程式碼目錄
wavenet_params.json 這是配置模型的一些相關引數

4.安裝依賴包
注意,需要先安裝TensorFlow,且版本要在TensorFlow 0.10及其以上,0.8版本的坑,我踩過了,在讀取引數的時候,會出現引數數量不匹配的錯誤。請務必注意,TensorFlow的版本。
此外,還需要安裝librosa,以支援音訊的讀寫操作。除了TensorFlow需要自行安裝之外,其他的安裝依賴可以通過以下命令列完成。

pip install -r requirements.txt

5.下載語料庫
語料庫有10個g,解壓後有12個g左右,請預備好足夠的空間,機器不太行的可以忽略此步。
VCTK-Corpus.tar.gz
語料庫的介紹

5.準備語料
我在這裡選擇一小段的鋼琴語料做訓練,piano_sample.wav。當然也可以採用上述語料庫中的其他音訊。注意,這裡只支援wav格式的音訊。
cd tensorflow-wavenet
mkdir corpus #corpus #用於存放多個訓練的.wav檔案

6.開始訓練
檢視各個引數的含義:

python train.py --help #--batch_size,--num_steps,--learning_rate等等引數

開始訓練:

python train.py --data_dir=corpus  --logdir=logdir

如果採用預設的引數:
python train.py –data_dir=corpus –logdir=logdir進行訓練的話,個人經驗,大約8個小時以上。(在虛擬機器下面,4G記憶體,雙核處理器)。
wavenet_params.json檔案則是用以配置模型引數,在訓練和生成過程中,該模型引數需要一致。
訓練過程截圖:
這裡寫圖片描述

7.模型
訓練過程中在logdir有train檔案,train檔案裡有會生成訓練model。
如下圖所示:
這裡寫圖片描述

8.生成模擬聲音
用generate.py指令碼和對應的模型生成模擬聲音。這些模型在訓練的時候,生成於logdir資料夾下。引數 --samples指定生成的音訊樣本數量(16000相當於1秒,此為預設的預設值)。--wav_out_path 指定生成音訊的位置。在其之後增加附加引數--save_every 引數則可以實現對正在進行的wav檔案,每n個樣本儲存一次。
python generate.py –wav_out_path=generated.wav –samples 160000 ./logdir/model.ckpt-xxx #–samples 16000 16000相當於1秒
預設的生成方式是最快的,其實現是基於 Fast Wavenet庫。從上述連結可以檢視具體的實現邏輯。該方法生成的音訊所需要的時間,大概可以縮短到幾分鐘之內。
如果不採用快速的方式的話:

python generate.py --samples 16000 model.ckpt-1000 --fast_generation=false

生成結果截圖:
這裡寫圖片描述

9.本次訓練的效果放在附件
測試資料1:
piano_sample.wav #樣本
generated.wav #生成模擬聲音
下載地址:
訓練資料和產生的聲音

測試資料2:
有歌手唱的非純曲調音樂,比如訓練的是李宗盛、林憶蓮 - 當愛已成往事.wav
對於訓練模型進行生成,生成的是帶有強烈雜音的。不像純音樂生成的音樂是純粹的音樂。所以,是需要先將人聲去除,用純曲來進行訓練。
下載地址:
帶有和聲的訓練資料和生成結果

第二部分 文字轉為語音

文字轉語音(TTS)。當被應用於文字轉語音時,該系統可以得到當前最佳的表現,人類聽眾評價它在英語和漢語上比當前最好的引數(parametric)和拼接(concatenative)系統所生成的音訊聽起來都顯著更為自然。
【有待補充!尚未進行】

本文專案地址:
https://github.com/ibab/tensorflow-wavenet
https://deepmind.com/blog/wavenet-generative-model-raw-audio/
https://github.com/Zeta36/tensorflow-tex-wavenet

擴充專案地址
https://github.com/llSourcell/Music_Generator_Demo/blob/master/README.md

相關文章