AlignTTS+MB-MelGAN で Tacotron2+Waveglow の 50 倍速い TTS (挑戦途中)
全然上手くいかず挑戦の途中ですが(最近全く記事を書いてなかったので)一旦現状をまとめることにしました。
はじめに
これまではずっと Nvidia 様の Tacotron2 (or Mellotron) + Waveglow にお世話になっていましたが、別の TTS モデルに手を出してみました。 今回使ってみたのは AlignTTS と Multi-band MelGAN (以下 MB-MelGAN)です。
Tacotron2 の代わりが AlignTTS で Waveglow の代わりが MB-MelGAN になります。
どっちも論文をみる限りは速いて高性能が売りだったので試してみたくなりました。
AlignTTS
こちらの論文になります。 以下の論文中にあったベンチマークをみるとわかりますが、めちゃくちゃ速いて精度が良い 。
- GT は生データ
- MOS は高い方が良い
手法の詳細は書くのが面倒なので省略。気が向けば今後記事にするかもしれません。
AlignTTS だと Waveglow の方がボトルネックになっている感じですね。
ボトルネックの Waveglow を含む上記の図の数値でも 25 倍くらいは違うので AlignTTS 部分はかなり速いのが分かるかと思います。
(以前使った Nvidia の Tacotron2 は Waveglow に比べてそんな遅くなかった気がするけど...)
AlignTTS を使ってみた現時点での感想ですが
- 学習がしんどい...(時間がかかる, 全く学習が進まないことも多い)
- 予測する MelSpec の精度があまり良くない...
って感じです。(下の方にサンプルを載せてます。)
MB-MelGAN とは
割と最近出た論文でこちらになります。
MelGAN というのがもともとあってそちらもめちゃくちゃ速かったのですがさらに速くなってます。
以下で論文中のベンチマーク結果をみてみます。
図2. の RTF は real-time factor の略で 1秒 の音声の生成にかかる時間を表します。
これによると MB-MelGAN は MelGAN の 7 倍くらいは速そう。
図3. は MelGAN と他のモデルの比較です。 MelGAN は Waveglow と GPU で速度を比較した場合 10 倍くらいは速い様子。
つまり MB-MelGAN は Waveglow の 70 倍くらい速いと...
もちろん環境や実装の仕方で変わってくると思うので細かい条件が知りたい場合は論文の方を読んでみてください。
MB-MelGAN は素晴らしい実装が この github リポジトリ で公開されていましたのでそちらを使用させていただきました。
こっちは素晴らしい実装を使用させてもらったおかげで普通によく学習できてます。
使ってみるとやはりめちゃくちゃ速かった... CPU でも 10 秒 の音声合成なら 1 秒 未満でできます。やばい。
現状作ったモデルのサンプル
JSUT のデータセットで学習させました。
推論結果はこんな感じです。
サンプル1
サンプル2
かなり微妙な感じですね...これ以外にもサンプルを生成してみると子音を落としたりしてしまうことが多かったです。
MB-MelGAN は教師データの MelSpec なら綺麗な音声を復元するので AlignTTS の方が悪いと思われます。
(AlignTTS の予測の MelSpec を使って MB-MelGAN を追加学習させても上手くいかなかった。)
MelSpec の比較も参考までに載せておきます。
上が教師データ、下が予測結果の MelSpec を plot したものです。
予測のほうの Alignment の推論に教師データを使用して教師データと時系列をだいたい揃えるようにしています。
AlignTTS の予測する MelSpec は教師データをぼやかした感じになって細かい部分の予測があまりできてません。
AlignTTS のモデルの構造が自己回帰でなく、かつ MSE Loss だけで学習するので全体にスムージングがかかった予測になってしまうのはしょうがないでしょうか ? (MSEで点推定する場合同じ入力に対して教師値がばらつく場合予測の最適解は中間の値になる)
その場合、分布からサンプリングするようなモデルにしたり、予測がしやすくなる追加の情報をいれてあげないと厳しいかもしれません。
なので対策としては Adversarial Training で生成モデルとして学習するとか, モデルに F0 などの追加の情報を与えるとか色々あるとは思います。
以前シャミ子のやつ作った時の方法と同じように 「AlignTTS の予測する MelSpec -> Target の MelSpec」を行う (Denoising する) NN を Adversarial Training で学習させるのは簡単で多少効果がある気はしています。
速度のベンチマークはもし良い感じのモデルができたら時にちゃんとやろうと思いますが、一応参考までに推論にかかる速度の比較を載せておきます。(これで 50 倍速いというタイトル詐欺にはならないはず...)
基本的に速度と精度はトレードオフなので精度が出ていない現状では速くてもあまり意味がないです。
以下はサンプル1 の生成にかかった時間 (サンプル1 の音声の時間は 11 秒)
モデル名 | CPU速度 | GPU速度 |
---|---|---|
AlignTTS +MB-MelGAN |
0.814 s ± 1.08 ms (0.409 s ± 1.59 ms) |
0.037 s ± 92 µs (0.013 s ± 21 µs) |
Tacotron2 + Waveglow |
41.8 s ± 561 ms (37 s ± 369 ms) |
2.14 s ± 274 ms (1.46 s ± 717 µs) |
- s は 秒を表す
- 括弧内は MB-MelGAN, Waveglow の時間
- 環境は CPU: Ryzen 7 2700X, GPU: GTX1080ti
- Tacotron2 + Waveglow は以前から使用している Nvidia の実装
- 一部単位が間違っていていたので修正しました。ごめんなさい。 (2020/06/28)
速いのはめちゃくちゃ速いんですけどね...
Tacotron2 + Waveglow も精度をかなり落としていいなら 50 倍速くできると思いますし...
あと音声の長さに対する計算オーダーも Tacotron2 と AlignTTS で多分異なるので参考程度にしといてください。
おわりに
もう少し色々いじってみてモデルが上手くいったら、ソースコードは整理してそのうち公開します。
AlignTTS と MB-MelGAN の解説も書くかもしれません。
前回, 前々回で Mellotron 関連で色々やりたいとか言いつつ全くやってなくて放置しているので、これらもやるやる詐欺で放置される可能性は高いです。
MB-MelGAN の実装をされているリポジトリでも issue をみると AlignTTS がそのうち実装されそうな感じ?なのでそっちがでたら私もそっちを使うと思います。