日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Chapter6_Vocoder

發布時間:2024/7/5 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Chapter6_Vocoder 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1 Introduction
  • 2 WaveNet
    • 2.1 WaveNet的架構
    • 2.2 Softmax Distribution
    • 2.3 Causal Convolution和Dilated Convolution
    • 2.4 Gated Activation Unit
    • 2.5 小結
  • 3 FFTNet
  • 4 WaveRNN
  • 4.1 Dual Softmax Layer
  • 4.2 Model Coarse
    • 4.3 Model Fine
    • 4.4 小結
  • 5 WaveGlow

本文為李弘毅老師【Vocoder】的課程筆記,這次課程由助教同學許博竣講授,課程視頻youtube地址,點這里👈(需翻墻)。

下文中用到的圖片均來自于李宏毅老師的PPT,若有侵權,必定刪除。

文章索引:

上篇 - 5 Speaker Verification

下篇 - 7-1 Overview of NLP Tasks

總目錄

1 Introduction

我們在之前的課程中有講過TTS(Text to Speech)模型和VC(Voice Conversion)模型。這兩個模型一般吐出來的都是一個叫做Spectrogram的東西,Spectrogram不是語音,它是一個表示各個時間點各個頻率的聲音強度的圖譜(下圖的圖譜中,橫軸為時間,縱軸為聲音頻率,顏色深淺表示強度)。因此要轉化為最終的語音,還需要一個叫做Vocoder的模型。總而言之,Vocoder就是把Spectrogram轉化為語音的模型。

為什么我們必須要有一個Vocoder,而不是讓我們的網絡直接生成一段語音呢?假設我們有一段語音xxx,然后這段語音xxx經過短時傅里葉變換之后,可以得到一個與時間ttt和頻率fff相關的復數,這個復數的幅值At,fA_{t,f}At,f?就是我們剛才聊到的Spectrogram,而eiθt,fe^{i\theta _{t,f}}eiθt,f?就是相位。TTS或者VC直接生成的結果都是At,fA_{t,f}At,f?,沒有相位。相位不同,產生的音質的差別是很大的,所以相位是必須要有的,這個相位就需要一個叫做Vocoder的模型去生成。

其實要把相位直接放到模型里去end-to-end的train也行,但是這一方面會加大模型的訓練難度,另一方面Vocoder是TTS和VC這樣的任務都需要的,單獨拿出來train的話,既可以兩邊通用,又可以降低TTS和VC的訓練難度。

2 WaveNet

我們的聲音信號放大來看,就是一串點的序列,WaveNet借鑒了autogressive model的思想,泛一點來說就是輸入前t?1t-1t?1個點,輸出第ttt個點,然后把新生成的點放到隊列當中去,繼續生成下一個點。WaveNet最重要的部分就是Causal Convolutions,說簡單點就是一堆卷積。

2.1 WaveNet的架構

WaveNet的整體架構如下圖所示。Input就是聲音信號的前t?1t-1t?1個點,然后Input會經過一個Causal Conv,經過Causal Conv之后,會經過k層layers,layers就是由dialated conv和1×11 \times 11×1卷積組成的殘差網絡,每層都會輸出一個特征,利用skip-connection組合起來之后,再經過兩個1×11 \times 11×1卷積和Softmax就得到了最終的結果。

2.2 Softmax Distribution

我們的輸入和輸出都是one-hot的向量,所以這里要用到softmax。我們的聲音信號上每個點的數值是一個16-bit的int,范圍在[-32768, 32767],如果直接把這個進行one-hot的話,我們softmax的layer將會有65536個類別,這太難了。所以這里用了一個叫做μ-law的方法,把[-32768, 32767] (16-bit int)的信號轉變到了[0, 255] (8-bit int)。這個過程如下所示,先將信號數值轉化到[-1, 1],然后用一個叫做μ-law的方法再轉換一下,范圍仍在[-1, 1],最后再轉化到[0, 255]。之所以要用μ-law是因為μ-law可以減小量化誤差。

[-32768, 32767] (16-bit int) -> [-1, 1] -> [-1, 1] (μ-law) -> [0, 255] (8-bit int)

μ-law就是下面這個公式,這里不做過多介紹。

2.3 Causal Convolution和Dilated Convolution

Causal Convolution(因果卷積)就是下圖這個東西。它是專門針對時間序列設計的,所以它輸出的時候,不會考慮未來的信息,而且隱藏層越多,考慮過去的時間越久遠。比如下圖是一個kernel size為2的Causal Convolution,最終的output會考慮前5個時間點的信息。

而Dilatied Convolution則是下圖所示的這樣,它的目的是在卷積中加入空洞來增加感受野。這樣一來就不用像標準的CNN那樣去pooling了。

而把這兩者結合起來就是Dilated Causal Convolution了。這樣一來模型就可以看到更長遠的信息了,這在點非常密集的語音里是非常必要的。

2.4 Gated Activation Unit

這里還有一個需要提一下的就是這個Gated Activation Unit,那其實就是經過了兩個不同的激活函數,如下圖所示。

如果我們要給模型加一些條件的話,就可以加載這個Gated Activation Unit的部分。如果一些全局的特征,比如說話人的一些條件,就像Global Condition那樣加,如果是要加Spectrogram這樣的隨時間變化的條件,就可以像Local condition這樣加。

2.5 小結

WaveNet可以直接使用waveform level的特征,利用到了Dilated Causal Convolution去增大感受野,同時也可以接受各種的條件輸入,最終出來的結果也是比較不錯的。但是,它有一個問題就是速度太慢了,這也可以想象,畢竟autogressive這種方法計算下一個時間點的輸出時,是需要利用到之前輸出的結果的,因此無法并行計算。所以之后提出的一些網絡,基本都是為了解決速度的問題。

3 FFTNet

FFTNet和WaveNet一樣都是autogressive model,它簡化了WaveNet中的一些繁瑣計算,同時提出了一種可以用到所有的autogressive model上的訓練和合成技巧。

FFTNet的模型架構如下圖所示,它會把輸入xxx分為xLx_LxL?xRx_RxR?兩個部分,然后分別經過一個卷積之后,加起來,再過一層卷積,使得總長度減半,這樣運行兩層,得到最終結果。這樣得到的特征,也是考慮了一定范圍的語音特征的,比如下圖中輸出的綠色部分就是考慮了xLx_LxL?生成的。

FFTNet提出了四個技巧:

  • 在開頭做zero-padding可以讓訓練結果更好
  • 最后取結果是,不是直接去最大概率的那個值,而是根據概率分布去做sample
  • 在訓練時,給輸入加上一些噪聲
  • 加入去噪聲的后處理

FFTNet最終可以達到和WaveNet差不多的效果,但速度卻快上很多。

4 WaveRNN

WaveRNN是Google提出來的,說簡單點就是用RNN去代替之前的CNN。

4.1 Dual Softmax Layer

WaveRNN沒有用之前把16bit轉成8bit的方法,而是把16bit轉成了兩個8bit,然后做兩次softmax的操作。

4.2 Model Coarse

產生ctc_tct?的部分如下圖所示,中間這塊我們可以把它看成一個GRU,它吃ct?1c_{t-1}ct?1?ft?1f_{t-1}ft?1?,以及上一個time step的hiddent state,輸出ctc_tct?

4.3 Model Fine

產生ftf_tft?的部分如下圖所示,中間這塊我們可以把它看成一個GRU,它吃ct?1c_{t-1}ct?1?ft?1f_{t-1}ft?1?,以及上一個time step的hiddent state,除此之外,還有剛才產生的c+tc+tc+t,輸出ftf_tft?

4.4 小結

WaveRNN還有一些加速的技巧,最終可以達到在手機cpu上real time的效果,非常強~

5 WaveGlow

WaveGlow放棄了autogressive的方法,基于flow-based model去做的,這個模型非常難train,有興趣的同學可以看一下視頻或者相關資料學習,這里不做介紹了。

總結

以上是生活随笔為你收集整理的Chapter6_Vocoder的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。