WaveNet

WaveNet: A Generative Model for Raw Audio
論文リンク https://arxiv.org/abs/1609.03499

PixelCNNの仕組みを使った、音声波形が生成できるモデルです。 学習時は、入力波形に学習したい波形を入力して、条件入力にそのスペクトラムや音素情報など対応させたい入力を入れます。 推論時は、入力波形に(t-1)までに生成した波形を入力し、条件入力に生成したい条件を入れると、次の生成波形サンプルが得られます。

学習時は、適当なサンプル長のデータに対し、(t+1)を学習させることで並列に処理できます。 推論時は、1サンプルごとに生成するので、非常に時間がかかります。だいたい5secの波形に10分とかのオーダーで時間がかかります。

WaveNet dilated causal convolutional layers

ひとつのブロックは、Dilated convにより前段よりもより広い時間受容野を持つように設定します。 こうしたブロックを積み重ねることにより、高周波成分に対応するような短い時間受容野も持つブロックや、 低周波成分に対応するような長い時間受容野をもつブロック等が得られることになります。

WaveNet layers

それぞれのブロックからの、skip connectionを集めてconvを2回かけて、次の1サンプルを生成します。

実装には、いろいろな改良が加えられ、いくつかのバリエーションがあります。 特に、初期の実装では 8bit mu-law quantizeした16kHzの音声でしたが、出力を Mixture of logistic distributions に変えることで、16bit 24kHz等の高音質にすることができます。さらに、出力を生成する分布を、single Gaussian distribution に変えても同様の音質にできるという実装(ClariNet)もあります。ガウス分布にすることで、高速化した Parallel WaveNet での取り扱いがよくなります。

先人による実装

WaveNetの実装テスト

実際にWaveNetを実装してみました。r9y9さんのコードを元に、tensorflow2で書きました。

改造した点

  • 条件入力は、メル尺度のスペクトラムを80次元で与えるのが普通ですが、FFTしたそのままのスペクトラムを、 1x1 Convの入力フィルタで80次元にしたものでも大丈夫そうです。ただし、フィルタの学習に時間がかかるのと、 重みが明後日に行くときがあるので、必要が無ければMel spectrumにしておくのがいいと思います。
  • ReLUでなくとも、Mishとかの他の活性化関数でもうまくいきそうです。ここは適当でよさそう。
  • あとで楽曲を入れたいので、サンプリングレートを44.1kHzに変えてみました。 あんまり受容野の大きさが変わらないように、少し広げています。また、FFTをn=1024から2048に変えて周波数解像度を上げました。

ClariNet (Parallel WaveNet)

ClariNet: Parallel Wave Generation in End-to-End Text-to-Speech
論文リンク https://arxiv.org/abs/1807.07281

WaveNetは、生成時に1サンプルずつ過去の波形を参照しながら生成するので、非常に時間がかかります。 これを並列に生成できるように改良したものが、Parallel WaveNetです。生成したい波形の長さよりも短時間で生成できます。 5secの音声が3sec程度で生成でき、リアルタイム生成が可能です。

Parallel WaveNet overview

先だって、WaveNetを普通に学習させておきます。これをTeacher WaveNetとします。 次に、Parallelにデータを生成できる、Student WaveNetを学習させます。 Student WaveNetは、通常のWaveNetとは異なり、元波形を入力とせず、各サンプル点で独立なランダムノイズを入力させます。 ランダムノイズと条件入力から、波形を生成させます。

Parallel WaveNetの学習は、Student WavenetとTeacher Wavenetの出力の分布の、KL-divergenceを最小化することで進めます。 ランダムノイズをStudent Wavenetに入力し、生成されたサンプルをTeacher Wavenetに入力します。このときの出力分布を一致させるように学習を行います。

この、KL-divergenceの計算の際、元の実装の Mixture of logistic distributionsでは直接計算できません。 その点を改良したのがClariNetです。出力を生成する分布を、ガウス分布にすることでKL-divergenceの計算を簡単にしています。

先人による実装