はじめに
こんにちは、swim-loverです。Pythonをとりかかりとして、Pytorch Tensorflowで機械学習を勉強していいます。「使いながら覚える」をコンセプトに勉強しています。
今回、Generative ModelのDCGAN(1),DCGAN(2)に続いて、音声処理への応用例であるWaveNetについて取り上げたいと思います。
WaveNetについて
WaveNet はDeep Learningを利用した音声合成、音声認識技術になります。
下記の公式Blogは2016年9月のものです。
音声合成の一つとして、TTS(Text to Speech)、つまり文章を音声として読み上げる分野は、concatinative TTSによるものから、prametric TTSによるものに移っている背景があったようです。
concatinative TTSは、膨大な数の声、音声を保存しておき、それらをつなぎ合わせて、繋がった音声にするもので、prametric TTSは、実際の音声の代わりに、音声の特徴量を保存しておき、特徴量から音声を出力するものです。Vocoder”ボコーダー”と呼ばれています。
WaveNet サンプル音声
上記のリンクにconcatinative、prametric、WaveNetの出力結果が掲載されています。
US English
- parametric
- concatinative
- Wavenet
WaneNetの音声を聞いてみると、とても自然な声であることがすぐにわかります。
WaveNet オーディオ生成
WaveNetを音楽生成においても使ってみたようです。
入力はクラッシクのピアノの楽曲で学習したとのことです。
いくつかのサンプルを貼り付けておきます。
いい音楽かどうかは、別の問題として、これらの出力がピアノ楽曲を出力していることは驚いてしまします。(結果がよさそうなところだけ切り取ったという訳ではないと信じます。)
WaveNet をGoogle Asistantへ
下記の公式Blogは2017年10月のものです。
2016年9月のBlogの時点では、高い処理能力が必要で、スマホなどのコンシューマデバイスで動作させるのは、難しかったようです。しかし、処理スピードのクオリティの改善によって、Google Asistantとして使われるようになったようです。
英語の日本語のサンプルがあるので貼り付けて置きます。
English(current best – non wavenet)
English (wavenet)
Japanese(current best – non wavenet)
Japanese(wavenet)
WaveNet ざっくり理解
以下はWaveNetの論文になります。ざっくり理解を進めてみたいと思います。
https://arxiv.org/pdf/1609.03499.pdf初期のWaveNetは、0.02秒の音声を生成するのに1秒、つまり、1秒の音声を生成するのに50秒もかかっていました。これでは、全く使いものになりません。
最新のバージョンでは、1秒で、20秒分の音声を生成する、つまり1秒の音声を生成するのに0.05秒でできるようになっています。1000倍高速になっています。
WaveNet 生成モデルの導入
オーディオサンプルx={x1,…,Xt}の発生確率は、以下のように、条件付き確率の積に分解することができる。xtは,x1~xt-1までのサンプルを条件として、xt-1は,x1~xt-2までのサンプルを条件として、つまり、ひとつ前までのサンプルを条件とした確率の積で表現されることになりますが、何だがよくわかりません。
PixelCNNと同様に、畳み込み層のスタックによって、条件確率分布は、モデル化されるとのこと。
PixelCNNは、Wavenetの元になったDNN。プーリング層がない。出力は入力と同じ次元をもつ。(入力が16kHsampleであれば、出力も16kHz sample)
WaveNet Casual Convolutions
Casual ConvolutionsがWaveNetの主な部分となっているようです。
時刻tにおいて、サンプルx1,…,xtによって出力された条件付き確率p (xt+1 | x1,…,xt)は、先の時刻t+1,t+2,…に依存しない。下図はこのことを示しています。時間は左から右方向(→)へ進んでいるいると思いますが、オレンジ色のOutputからは、矢印がでていません。
また、Casual ConvolutionsがRecurrent(回帰的)な接続がありません。図でも上から下への矢印はありません。時系列データで用いるRNN(Recurrent Neural Network)よりも高速に処理できるとのこと。しかし、Casual Convolutions は多くのレイヤや大きいフィルタを必要とするとのことです。
Wavenet Dilated Casual Convolutions
Dilated Casual Convolutions は、Casual Convolutionsからdilation (skip)する処理が追加されてます。以下の例では、最初のhidden layerは、全て入力を取り込んでますが、次のhidden layer では、1skip、次のhidden layerでは、3skipしています。pooling 処理に似ていますが、出力数は入力数と同じです。
Dilated casual convolutionは、わずか数層で大きな受容野 (receptive field)をもつネットワークが可能となるようです。
まとめ
今回から、Generative Modelの音声処理への応用例であるWavenetについて取り上げました。
次回以降もWavenetについて取り上げたいと思います。
組み込み系ソフトエンジニアをしています。これまでフロントエンド技術は避けてきましたが、食わず嫌いをやめて、勉強を始めました。
趣味は、水泳、ロードバイク、ランニング、登山です。
組み込み系技術ネタ、勉強したフロントエンド技術、たまに趣味の運動について発信していきます。
どうぞよろしくお願いします。
コメント