C語言中文網 目錄
TensorFlow
1 TensorFlow是什么
2 TensorFlow安裝和下載
3 第一個TensorFlow程序
4 TensorFlow程序結構
5 TensorFlow常量、變量和占位符
6 TensorFlow矩陣基本操作
7 TensorFlow TensorBoard數據流圖可視化
8 TensorFlow代碼自動升級為1.0版本
9 TensorFlow XLA
10 TensorFlow指定CPU和GPU設備
11 TensorFlow與深度學習
12 TensorFlow常用Python擴展包
13 回歸算法有哪些
14 TensorFlow損失函數
15 TensorFlow優化器
16 TensorFlow csv文件讀取數據
17 TensorFlow實現簡單線性回歸
18 TensorFlow實現多元線性回歸
19 TensorFlow邏輯回歸處理MNIST數據集
20 感知機與神經網絡
21 TensorFlow常用激活函數(6種)
22 TensorFlow實現單層感知機
23 TensorFlow實現反向傳播算法
24 TensorFlow多層感知機實現MINIST分類
25 TensorFlow多層感知機函數逼近
26 TensorFlow超參數
27 TensorFlow Keras
28 CNN卷積神經網絡
29 三維卷積神經網絡預測MNIST數字
30 卷積神經網絡分類圖片
31 遷移學習
32 DeepDream網絡
33 TensorFlow實現文本情感分析
34 VGG網絡濾波器
35 VGGNet、ResNet、Inception和Xception
36 預建深度學習提取特征及實現
37 TensorFlow實現InceptionV3
38 TensorFlow WaveNet聲音合成
39 TensorFlow視頻分類(6種方法)
40 RNN循環神經網絡
41 神經機器翻譯(seq2seq RNN)
42 注意力機制(基于seq2seq RNN)
43 RNN訓練模型并生成文本
44 RNN循環神經網絡實現預測比特幣價格
45 主成分分析法(PCA)
46 k均值聚類算法
47 SOM自組織映射法
48 受限玻爾茲曼機訓練
49 推薦系統的實現(基于RBM)
50 基于DBN實現情緒檢測
51 自編碼器
52 標準自編碼器
53 稀疏自編碼器
54 去燥自編碼器
55 卷積自編碼器
56 堆疊自編碼器
57 強化學習
58 OpenAI Gym安裝和使用
59 全連接神經網絡實現玩Pac-Man游戲
60 Q learning實現Cart-Pole平衡游戲
61 DQN算法(深度Q網絡)
62 David Silver策略梯度算法
63 深度學習在移動端的應用
64 Android移動端部署TensorFlow mobile
65 iPhone移動端部署TensorFlow mobile
66 移動端優化TensorFlow代碼
67 GAN生成式對抗網絡
68 GAN生成式對抗網絡虛構MNIST圖像
69 DCGAN虛構MNIST圖像
70 DCGAN虛構名人面孔和其他數據集
71 VAE變分自編碼器
72 CapsNet膠囊網絡
73 TensorFlow分布式
74 TensorFlow GPU的安裝和使用
75 TensorFlow分布式
76 TensorFlow分布式訓練MNIST分類器
77 TensorFlow Serving運行Docker容器
78 TensorFlow分布式在谷歌云平臺運行
79 TensorFlow分布式在谷歌CloudML運行
80 TensorFlow分布式在Microsoft Azure上運行
81 TensorFlow分布式在Amazon AWS上運行
首頁 > TensorFlow 閱讀:222

TensorFlow WaveNet聲音合成詳解

WaveNet 是生成原始音頻波形的深層生成模型。這項突破性的技術已經被 Google DeepMind 引入(https://deepmind.com/blog/generate-mode-raw-audio/),用于教授如何與計算機對話。結果確實令人驚訝,在網上你可以找到合成聲音的例子,電腦學習如何用名人的聲音與人們談話。

所以,你可能想知道為什么學習合成音頻是如此困難。聽到的每個數字聲音都是基于每秒 16000 個樣本(有時是 48000 個或更多)建立一個預測模型,在這個模型中學習基于以前所有的樣本來重現樣本,這是一個非常困難的挑戰。

盡管如此,有實驗表明,WaveNet 已經改進了當前最先進的文本到語音(Text-To-Speech,TTS)系統,降低了英語和普通話之間 50% 的差異。

更酷的是,DeepMind 證明了 WaveNet 可以教會電腦如何產生樂器的聲音,比如鋼琴音樂。

下面給出一些定義。TTS 系統通常分為兩個不同的類別:
  • 連續TTS:其中單個語音片段首先被記憶,然后在語音再現時重新組合。這種方法沒有大規模應用,因為它只能再現記憶過的語音片段,并且不可能在沒有記憶片段的情況下再現新的聲音或不同類型的音頻。
  • 參數TTS:其中創建模型用于存儲要合成的音頻的所有特征。在 WaveNet 之前,使用參數 TTS 生成的音頻不如連續 TTS 自然。WaveNet 通過直接建模音頻聲音的生成來改進現有技術,而不是使用過去常用的中間信號去處理算法。

原則上,WaveNet 可以看作是一堆卷積層(已經在前面章節中看到了二維卷積圖像),而且步長恒定,沒有池化層。請注意,輸入和輸出的結構具有相同的尺寸,所以 ConvNet 非常適合對音頻聲音等連續數據進行建模。

然而,實驗表明,為了達到輸出神經元中的感受野大尺寸,有必要使用大量的大型濾波器或者不可避免地增加網絡的深度。請記住,一個網絡中一層神經元的感受野是前一層神經元對其提供輸入的橫截面。由于這個原因,純粹的卷積網絡在學習如何合成音頻方面效率不高。

WaveNet 的關鍵在于所謂的擴張因果卷積(有時稱為帶孔卷積),這就意味著當應用卷積層的濾波器時,一些輸入值被跳過。例如,在一個維度上,一個具有擴張 1、大小為 3 的濾波器 w 將計算如下所示的加權和。

簡而言之,在擴張值為 D 的擴張卷積中,通常步長是 1,你也可使用其他的步長。下圖給出了一個例子,擴大(孔)尺寸為 0,1,2:


圖 1 擴張網絡的一個例子

由于引入“孔”這個簡單的想法,使得堆疊多個擴張的卷積層與指數增加的過濾器、學習長距離輸入而不用擔心有一個過深的網絡成為可能。

因此,WaveNet 屬于卷積網絡,其卷積層具有各種擴張因子,使得感受野隨深度呈指數增長,有效地覆蓋了數千個音頻時間步長。

當訓練時,輸入是來自人類說話者的錄音。這些波形量化為一個固定的整數范圍。WaveNet 定義了一個初始卷積層,只訪問當前和之前的輸入。然后,有一堆擴大的卷積層,仍然只能訪問當前和之前的輸入。最后,有一系列密集層結合了前面的結果,接下來是分類輸出的 softmax 激活函數。

在每個步驟中,從網絡預測一個值并將其反饋到輸入中。同時,計算下一步的新預測。損失函數是當前步驟的輸出和下一步的輸入之間的交叉熵。

NSynth是最近由 Google Brain 小組發布的一個 WaveNet 的演變,它不是因果關系,而是旨在看到輸入塊的整個上下文。如下圖所示,神經網絡確實是復雜的,但是作為介紹性討論,知道網絡學習如何通過使用基于減少編碼/解碼期間的誤差的方法來再現其輸入就足夠了:

圖 2 NSynth架構的一個案例

本節直接使用網上的代碼來演示(https://github.com/tensorflow/magenta/tree/master/magenta/models/nsynth),你還可以從 Google Brain 中找到一些。

感興趣的讀者也可以閱讀論文“Neural Audio Synthesis of Musical Notes with WaveNet Autoencoders”(Jesse Engel,Cinjon Resnick,Adam Roberts,Sander Dieleman,Douglas Eck,Karen Simonyan,Mohammad Norouzi,2017.4,https://arxiv.org/abs/1704.01279)。

具體做法

  1. 通過創建單獨的 conda 環境來安裝 NSynth。使用支持 Jupyter Notebook 的 Python 2.7 創建并激活 Magenta conda 環境:


     
  2. 安裝用于讀取音頻格式的 Magenta pip 軟件包和 librosa:


     
  3. 從網上下載安裝一個預先建立的模型(http://download.magenta.tensorflow.org/models/nsynth/wavenet-ckpt.tar)并下載示例聲音(https://www.freesound.org/people/MustardPlug/sounds/395058/),然后運行 demo 目錄中的筆記。第一部分包含了稍后將在計算中使用的模塊:


     
  4. 加載從互聯網下載的演示聲音,并將其放在與筆記本電腦相同的目錄中。這將在約 2.5 秒內將 40000 個樣品裝入機器:


     
  5. 使用從互聯網上下載的預先訓練的 NSynth 模型以非常緊湊的表示方式對音頻樣本進行編碼。每 4 秒給一個 78×16 的尺寸編碼,然后可以解碼或重新合成。編碼是張量(#files=1x78x16):


     
  6. 保存稍后用于重新合成的編碼。另外,用圖形表示快速查看編碼形狀,并將其與原始音頻信號進行比較。如你所見,編碼遵循原始音頻信號中的節拍:


     
  7. 我們觀察如下圖所示的音頻信號和 NSynth 編碼:


     
  8. 現在對剛剛制作的編碼進行解碼。換句話說,如果重新合成的聲音類似于原來的,這里試圖以緊湊表示再現對原始音頻的理解。事實上,如果你運行實驗并聽取原始音頻和重新合成的音頻,會感覺它們聽起來非常相似:

總結

WaveNet 是一種卷積網絡,卷積層具有各種擴張因子,使得感受野隨深度呈指數級增長,因此可以有效地覆蓋數千個音頻時間步長。NSynth 是 WaveNet 的一種演變,其中原始音頻使用類似 WaveNet 的處理來編碼,以學習緊湊的表示。然后,這個緊湊的表示被用來再現原始音頻。

一旦學習如何通過擴張卷積創建一段緊湊的音頻,可以發現其中的樂趣,比如說:
  • 你會發現在互聯網上很酷的演示。例如,可以看到模型如何學習不同樂器的聲音(https://magenta.tensorflow.org/nsynth):
  • 你可以看到一個環境中學習的模型如何在另一個環境中重新混合。例如,通過改變揚聲器的身份,可以使用 WaveNet 用不同的聲音描述同樣的事情(https://deepmind.com/blog/wavenet-generative-model-raw-audio/)。
  • 另一個非常有趣的實驗是學習樂器的模型,然后重新混合,這樣就可以創造出以前從未聽過的新樂器。這真的很酷,它打開了一個新世界。
    例如,在這個例子中,把西塔琴和電吉他結合起來,形成一種很酷的新樂器。還不夠酷?那么把低音貝斯和狗的叫聲結合起來怎么樣(https://aiexperiments.withgoogle.com/sound-maker/view/)?

精美而實用的網站,提供C語言、C++、STL、Linux、Shell、Java、Go語言等教程,以及socket、GCC、vi、Swing、設計模式、JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo