Flowtronを理解する
はじめに
文章から音声データを生成するタスク Text to Speech (TTS)におけるDeep Learning手法として
Tacotron2 (Shen et al. 2017)が有名である。そのTacotron2を拡張して生成する音声データを
ある程度調整可能にしたFlowtron (Valle et al. 2020)が最近提案されたのでその内容を理解したい。
概要
Tacotron2についての解説は以下のページが分かりやすい。
https://akifukka.hatenablog.com/entry/tacotrn2_1
音声データは本質的には1次元の信号データであるが、 人間の聴覚特性を考慮したメルスペクトルグラム
(mel-spectrogram)という二次元データ(時間x周波数空間) を経由したほうが人間の感覚的には自然な音声データが作成できる。
Tacotron2や今回紹介するFlowtronは文章を入力としてこのメルスペクトルグラムを出力するアルゴリズムである。
(このメルスペクトルグラムから音声データを生成するのにはWaveglow (Prenger et al. 2018)などの他のアルゴリズムが必要)
Tacotron2は文章→メルスペクトルグラムを一意に推論していたが、
FlowtronではFlowによりガウシアンノイズ(prior)と文章(+スピーカー情報)からメルスペクトルグラムを
サンプリングすることで出力音声をある程度制御可能としている。
実装はNVIDIAが公開している。
https://github.com/NVIDIA/flowtron
前処理
Tacotron2と同様に音声データからメルスペクトルグラムを生成する。
メルスペクトルグラムのパラメータもTacotron2と同様。
入力文章は文字単位のsequenceとして取り扱われる。
モデル
Tacotron2にあったpostnetなどの構造はなくなっている。
Tacotron2のようなSeq2Seqなdecoderではなくflow-baseのdecoderとなっている
- 文章とスピーカー情報を独立にembeddingする
- 文章embeddingはCNNとLSTMを組み合わせたencoderを通す
- encodeされた文章とスピーカーembeddingをconcatしてdecoderに渡す
- decoderはflow-base
flowによる生成過程については以下のスライドが詳しく解説してくださっている。
https://www.slideshare.net/DeepLearningJP2016/dlflowbased-deep-generative-models
損失関数
最小化する損失関数は negative log-likelihood (NLL)である。
ACLによって実際に最適化しているのは各flow層のスケールの最大化と
最終出力(prior)の最小化である。
推論処理
ガウシアンサンプリングされたprior、文章、スピーカー情報を入力とする。
priorをいくつかのflow層に通すことでメルスペクトルグラムに変換していく。
(学習時とはスケールとバイアスのかけ方が逆となっている)
学習時にガウス分布のsigmaを固定した場合、推論時のサンプリングでsigmaの値を下げることで
クオリティが上がるらしい。 (GANにおけるtruncation trickみたいなもの?)
特定のスピーカーの音声から求めたpriorを入力として別のsperakerのメルスペクトルグラムを出力 することも可能(voice style transfer)。
感想
TTSにおいて音声データには入力文章だけでは表現できない感情などの様々な情報が含まれている。
Flowtronではこれらの非文章情報(non-textual information)をうまく特徴量空間で吸収して
サンプリングにより再現しようとする。Flow-baseのアルゴリズムによって特定の話者の
特定のnon-textural informationに対応するpriorを求めて、それを別の話者に転移できるのはすごそうに感じた。
今後は実際にFlowtronを使ってどんなことができそうか確かめていきたい。