[論文メモ] SNAC: Speaker-normalized affine coupling layer in flow-based architecture for zero-shot multi-speaker text-to-speech

arxiv.org

zero-shot multi-speaker TTSのための話者を明示的に正規化するSNAC layerの提案

既存のzero-shot multi-speaker TTS (ZMS-TTS)では話者専用のエンコーダを用意してstyle transferの要領で変換することが多い。
またそのときにはFastSpeech系のfeed-forwardモデルが採用されやすい。

最近話題のVITSのようなflow-basedな手法ではreverse flowが必要なのであまり検討されていない。
そこで話者情報を正規化するaffine coupling layerを提案。

手法

affine coupling layerは入力を2つに分けて片方を普通の入力、片方をアフィン変換のパラメータの計算に用いる。
入力を x \in \mathbb{R}^D d < Dとして


 y_{1:d} = x_{1:d}
 y_{d+1:D} = x_{d+1:D} \cdot \exp(s_{\theta}(x_{1:d}) + b_{\theta} (x_{1:d}))


これで得られた y_{1:d} [y_{d+1:D}]をconcatして出力とする。
逆変換は以下でできる。


 x_{1:d} = y_{1:d}
 x_{d+1:D} = \frac{y_{d+1:D} - b_{\theta}(y_{1:d})}{\exp(s_{\theta}(y_{1:d}))}


アフィン変換のパラメータがわかっているので単純に正規化するだけ。

このaffine coupling layerについて話者情報 gを条件とし、話者情報について明示的に正規化したい。ここで話者情報 gは固定長の埋め込みベクトルとする。

戦略としては入力される話者に依存した特徴から gの情報を抜き取るように正規化し、逆変換時に指定した話者の分布になるように。
そこで speaker-normalized affine coupling (SNAC) layerを提案。

正規化時、シンプルに gを使って入力を正規化を行う。


 SN(x; g) = \frac{x - m_{\theta}(g)}{\exp(v_{\theta}(g))}
 y_{1:d} = x_{1:d}
 y_{d+1:D} = x_{d+1:D} \cdot \exp(s_{\theta}(SN(x_{1:d}; g)) + b_{\theta} (SN(x_{1:d}; g)))


 x_{1:d} SN(x_{1:d}; g)に置き換えただけ。

逆変換も同じ感じで


 SDN(x; g) = x \cdot \exp(v_{\theta}(g)) + m_{\theta}(g)
 x_{1:d} = y_{1:d}
 x_{d+1:D} = SDN \Bigl( \frac{y_{d+1:D} - b_{\theta}(SN(y_{1:d});g)}{\exp(s_{\theta}(SN(y_{1:d}; g)))}; g \Bigr)


log-determinantの計算も普通にできる。

SNAC layerのイメージが図1

実験・結果

ベースのモデルはVITSでデータセットはVCTK。
VCTKの109話者のうち、11人をin-domainの、LibriTTSから20人をout-of-domainのテスト話者として利用。

話者埋め込みにはスペクトログラムを入力としたconv2dとGRUを積んだネットワークを利用。出力は256次元の埋め込み。
これをreference encoder(REF)とする。

以下3つのベースラインを用意


Baseline+REF+ALL :REFを利用したVITS
Baseline+REF+FLOW :Flowとduration predictorにのみ話者埋め込み(REF)を利用。generatorは埋め込みを利用しない
Baseline+PRETRAINED+FLOW :Baseline+REF+FLOWにおいてREFを事前に学習し固定して利用

上記3つのベースラインのflow layerをSNACに置き換えてそれぞれ比較。
評価指標はMOSと話者類似度MOS(SMOS)と話者埋め込みのコサイン類似度(SECS)
話者埋め込みの計測は SpeechBrain toolkitを利用。


結果が表1。MOS、SMOSは高いがSECSが既存手法(YourTTS)より小さい。
YourTTSは話者埋め込みが近くなるような学習をしているかららしい。
正直、既存のVITSと大きな差がなく見える。
話者埋め込みは学習済みではなく、同時に学習したほうが良さそう。特徴量のドメインシフトの問題か?

所感

手法自体はシンプルでそこそこ納得感もある。実験結果的に悪くはなさそうだが、劇的な改善もなさそうに見える。
generatorが話者非依存にできそうなのは良いかも。
実際試した感じあまり効果は感じなかった。 v_{\theta}が曲者でこいつのせいですぐにnanになることが多かった。
非公式の実装では v_{\theta}を利用しておらず、気持ちはわかる。