【論文紹介】MelGAN & Multi-band MelGAN

自分がよく使うモデルは理解を深めておこうの精神。

MelGAN の論文はこちら

Multi-band MelGAN (以下 MB-MelGAN)の論文はこちら

公開されている実装は例えば以下にあります。
Official

Unofficial

(前の記事でも下の ParallelWaveGAN リポジトリの MultiBand-MelGAN の実装を利用させていただいてます。本当にありがとうざいます...)

目次

0. 論文概観

とりあえず最初に落合洋一フォーマットを書きました。これまだよく使われたりしてるんですかね?

MelGAN
1. どんなもの?  
Non AutoRegressive な構造 + Adversarial Training で高速 & 高品質な Vocoder を作れた。

2. 先行研究と比べてどこがすごい?  
高速 & 高品質。波形生成で初めて知識蒸留や Perceptual Loss なしに Adversarial Training を成功させた。

3. 技術や手法のキモはどこ?  
Network 構造の工夫や Multi Scale の Discriminator などの Adversarial Training が上手く行く工夫を色々検証し、適用している。

4. どうやって有効だと検証した?
MOS スコア, 推論速度で既存の手法と比較。 MOS は [3] WaveGlow よりすこし悪いが速度は WaveGlow の 10 倍を達成 (WaveGlow も十分早い) 。

5. 議論はある?
MelGANは音声特徴量は波形データと時系列が揃っている必要がある (Unconditional への適用は Future work) 。
あと WaveNet, WaveGlow ほどの精度ではない。

6. 次に読むべき論文は?
[3] Waveglow: A flow-based generative network for speech synthesis
[4] Parallel WaveGAN: A fast waveform generation model based on generative adversarial networks with multi-resolution spectrogram
[2] Multi-band MelGAN: Faster Waveform Generation for High-Quality Text-to-Speech
MultiBand-MelGAN
1. どんなもの?
MelGAN の改良版でさらに高速 & 高品質な波形生成モデル。

2. 先行研究と比べてどこがすごい?
めちゃくちゃ高速 & 高品質 & 軽量。

3. 技術や手法のキモはどこ?
ReceptiveField を広げた Layer の追加。
Parallel WaveGAN などで利用されている STFT Loss を導入。
Filterbank を利用して Multi-band 化し Generator が生成する波形の時間方向の Upsampling を少なくしたり, 各 subband 上での STFT Loss を導入。
収束の高速化のため STFT Loss のみでの事前学習を実施。

4. どうやって有効だと検証した?
MOS スコア、推論速度で既存の手法と比較し、MOS は MelGAN 以上で速度は MelGAN の 6~7 倍を達成。

5. 議論はある?
FutureWork として挙げられているのはさらなる高精度化 (人の生の音声データとの合成音声のギャップを埋める)。

6. 次に読むべき論文は?
[5] VocGAN: A High-Fidelity Real-time Vocoder with a Hierarchically-nested Adversarial Network

それでは以下で詳細を述べていきます。

1. MelGAN

1.0. サマリ

MelGAN は音声特徴量 (MelSpectrogramなど) から音声波形を生成するモデルです。音声特徴量 → 波形生成を行うモデルは Vocoder と呼ばれ、MelGAN は Vocoder の一種です。

DNN を利用した Vocoder として有名なものとしては WaveNet がありますが、WaveNet は非常に高品質な一方で自己回帰で推論する構造のため波形生成に非常に時間がかかる問題があります。
自己回帰を利用しない並列計算可能かつ高品質な Vocoder の研究は数多くなされていますが (例えば [3] WaveGlow)、この MelGAN も自己回帰ではない並列計算が可能な構造で高速かつ高品質を目指したモデルです。

通常音声特徴量 → 波形は一意にもとまらない設定が多いのでただの回帰モデルだと綺麗な音声の生成が難しいとされていますが、 MelGAN は GAN を利用して音声特徴量の条件付きの分布からサンプリングする生成モデルとして学習することで実データに近い予測を可能にしています。
( [3] Waveglow は同じ生成モデルではありますが Flow ベースのモデルで GAN とは異なる手法を利用しています。)
一般に GAN の学習自体も難しいとされますが、MelGAN では Network 構造の工夫や MultiScale な Discriminator など様々なテクニック利用することで高精度なモデルの作成に成功しました。

この論文で述べられている Main Contributions は以下です。

  • NonAutoregressive な conv 構造の下で GAN の学習を用いた音声波形生成を実施。知識蒸留や Perceptual Loss ([6] ParallelWaveNetなどで用いられる、別の事前学習済みモデルの特徴量空間でのloss) なしで GAN を使用した高品質な音声波形生成モデルの作成に初めて成功。
  • MelGAN は MusicTranslation, TextToSpeech, Unconditional Music Synthesis への適用においても僅かな音声の劣化で抑えられるクオリティであるため、これまで利用されてきた Autoregressive モデルをより高速な MelGAN で置き換えることができる。
  • 速度に関しては他の高品質なNonAutoregressiveモデルである Waveglow の1/10の時間を達成。

1.1. モデル構造

GAN の学習を行うので Generator と Discriminator の 2 つからなります。

全体像 ↓

f:id:tosaka-m:20200830194947p:plain
図1. MelGAN 全体像

※MelGAN 節の画像は全て [1] MelGAN の論文から引用しています。

Generator

Generator は音声特徴量から波形データを生成するモデルです。
Network 構造は時間方向に伸ばす Upsampling と conv 層を重ねた Residual Stack を繰り返す作りになっています。
構造上のポイントは以下です。

  • Upsampling には Transposed Conv を利用し、kernel size = stride*2 に設定。
    • kernel size が stride で割り切れないと構造上の理由からの格子状の artifacts が発生しやすいらしい (このサイト 参照)。
  • Residual Stack には Dilated Conv を利用 (下部 図2.)。
    • Receptive Field を広げてより大域的な特徴を考慮できるようにしている。
       
      f:id:tosaka-m:20200830195034p:plain:h350
      図2. Residual Stack 拡大図

その他モデルの精度に関連する Tips として以下が述べられています。

  • instance normalization は pitch の情報を落としてしまうので入れると悪くなる。
  • spectral normalization も入れると悪くなる。
  • weight normalization を使用。
  • 生の Audio との L1 Loss を目的関数に加えると悪くなる。

(論文中にこれらを入れたり入れなかったりするケースの MOS の比較があるので気になる方は見てみてください。)

Discriminator

Discriminator は実データか生成データか識別するモデルです。
MelGAN の Discriminator では 1 つの波形データに 1 つの予測確率値ではなく、[7] pix2pix の論文 で利用されているような局所的に実データか生成データか識別する構造をとっています。
(MelGAN 論文中では Window-based Discriminator と呼んでいます。)

もう一つ別の特徴的な点としては、入力データのスケール(サンプリングレート)を変えた 3 つの Discriminator を用意している点があります (これは [8] Pix2PixHD を参考にしているそうです)。
一つ目はそのままの波形データ、二つ目がサイズを 1/2 にした波形データ, 三つ目がサイズを 1/4 にした波形データの入力を受け付けるようにしており、それぞれ波形データのサイズを 1/2 にする際には kernelsize=4, stride=2 の AvgPooling を適用します。

f:id:tosaka-m:20200830224638p:plain:h200
図3. MultiScale Discriminator 拡大図

入力のスケールを変えることによりそれぞれの Discriminator で各々異なる周波数帯の特徴を学習できるようにしているようです。例えば 1/4 は高周波成分が除かれるので、低周波の大域的な特徴をより強調してみることができます。

1.2. 学習方法

目的関数

大きく 2 つの Loss からなります。
A. GAN の Loss
B. Feature Matching Loss

A. GAN の Loss

GAN の目的関数は hinge loss を利用しています。

f:id:tosaka-m:20200830195113p:plain:h100

上記は MelGAN 論文中の(1), (2)式を貼り付けてますが、上の式の \text{min}(0, 1-D_k(x))\text{min}(0, 1+D_k(x)) の部分は max だと思います (この論文[10] の 2.3. 節に GAN のいくつかの種類がまとまっているので参考にどうぞ)。
基本的に各 Discriminator D_k は実データの値を大きく(上の式の前半の項)、生成データのD_k の値を小さくする(下の式の後半の項)ように学習します。逆に Generator は生成したデータの D_k の値を大きくするように学習します。
hinge loss では \text{max}(0, 1-D_k(x)) とすることで D_k(x) が 1 以上になったら更新しないようになっており、ある実データ x が簡単に見分けられる場合でも D_k(x) が際限なく大きくなることはないような形ではあります。
ちなみに、実装上は 1-D_k(x) に ReLU をかますだけで簡単に実現されます。

B. Feature Matching Loss

補助的な Loss として Discriminator の特徴量空間での L1 Loss も合わせて学習します。
式↓
f:id:tosaka-m:20200830195150p:plain:h75

↓図の Feature map と書いてある出力が D_k^{(i)} に対応します。だいたい活性化関数のあとの出力が利用されます。
f:id:tosaka-m:20200830195206p:plain:h300

1.3. ベンチマーク

以下では MelSpectrogram から元の波形データを再合成したケースの結果だけ載せますが、論文では他にも TTS 用の Vocoder として使用した場合や VQVAE と組み合わせた場合についての検証もしています。

以下は LJSpeech データセットでの各モデルの性能比較です。
f:id:tosaka-m:20200830195225p:plain:h200

MOS (Mean Opinion Score) は人間の主観評価です (5 が良くて 1 が悪い)。論文ごとに使用されている人間が違うので他の論文に乗っている値と比較する際は注意しましょう。

以下は推論速度の比較です。(GPU は GTX1080 Ti が使用されている)
f:id:tosaka-m:20200830195229p:plain:h150

この表の例えば MelGAN の CPU で 51.9kHz というのは、1 秒間に 51.9k サンプル点を生成出来るという意味で、例えば、24000Hz の音声データを生成する場合は 1 秒で (51900 / 24000) 秒分の音声データが生成できることになります。

結果を見ると精度は WaveNet や Waveglow には及ばないようですが速度は Waveglow の 10x 以上でています。
他のタスクでの結果などについては論文の方を見てみてください。

MelGAN に関しては以上になります。次は MB-MelGAN についてみていきます。

2. MB-MelGAN

2.0. サマリ

MB-MelGAN は MelGAN の改良版です。MelGAN と比較して計算量は 1/6 でより高品質 (MoS スコアで)。さらに軽量。とカタログスペックはかなりいい感じです。

MelGAN との違う点は大雑把には以下になります。

  • Receptive Field をより広げた層を追加。
  • FeatureMatchingLoss を multi-resolution STFT Loss (spectrac convergence loss, log stft magnitude loss) に変更。
  • Generator を Multi-band の予測に変更し、Pseudo-QMF bank で fullband (1 band) に戻す構造にしている。各 subband (= Multi-band 化した時の各成分) に対しても STFT loss を利用。
  • 最初に STFT loss のみで学習させて学習の高速化を図っている。

以下でもう少し細かい違いを述べていきます。

2.1. モデル概要

全体像はこんな感じです。MelGAN から Analysis Filter Bank, Sythesis Filter Bank が追加されてます。

f:id:tosaka-m:20200830195303p:plain:h400
図4. MB-MelGAN 全体像

(*特に注釈がなければMB-MelGAN節の画像は[2]MB-MelGANの論文から引用しています。)

MelGAN と違う箇所

Generator は大まかに以下が違います。

  • Residual Stack において Receptive Field の広い(dilation の大きい) Convolution を 1 つ増やした。

    • MelGAN は dilation = 1, 3, 9 の 3つ
    • MB-MelGAN は dilation = 1, 3, 9, 27 の 4つ
  • 1 band の予測から 4 band の予測に変更. それに伴って Upsample のスケールも変更。

    • MelGAN は Upsample 8x → 8x → 2x → 2x
    • MBMelGAN は Upsample 2x → 5x→ 5x
    • これらは、音声波形データと音声特徴量の長さの比率(MelSpectrogram なら hop size の設定)によって変えるべきパラメータなのであくまで参考値。

Discriminator はほぼ同じで違いは layer 数を 4 → 3 に変更したくらいです。
あと MB-Melgan の generator が予測する multi-band 化されたものは synthesis filter bank (後述) によって 1 band に戻してから Discriminator の入力に与えます。

Multi-band について補足

ここまで multi-band を連呼しているのに私は正確な定義を知らない (よいリファレンスあれば教えていただけると幸いです) のでお伝えするのはイメージになりますが、multi-band 化するというのは波形データを異なる周波数帯の波形データに分解圧縮することです。
イメージ図↓

f:id:tosaka-m:20200830225929p:plain
図5. Analysis, Synthesis Filter bank イメージ図
(*これは私が書きました)
上記 m-band signal は m 個の波形データからなり、各 m 個の波形データは元の波形データの異なる周波数成分のイメージです。

全体像の図にあった Analysis Filter Bank はこの図の Analysis + ↓m, Synthesis Filter Bank はこの図の ↑m + Synthesis が対応しています。

詳しく説明すると尋常じゃなく長くなりそうなのでざっくり特徴をかいつまんで説明すると、
上の図の Analysis (と↓m), Synthesis (と↑m) では以下ような処理がされます。

  • analysis では m 種類の filter をかけて1 m 個の signal を生成 (MB-MelGAN では m=4)。 その後各 signal の時間方向の長さを 1/m にする。

    • Fileter の種類によるが基本的には m 個の各 signal は異なる周波数帯の成分を抽出したもの。 
    • 例えば analysis, synthesis filter bank に cosine modulated filter bank という種類を利用すると各 signal はそれぞれ 0 \sim \frac{\pi}{m}, \frac{\pi}{m}\sim\frac{2\pi}{m}, ...,\frac{(m-1)\pi}{m}\sim\pi の周波数帯の成分をだいたい抽出したものになる。
  • synthesis では長さが 1/m になった m 個の signal を元の長さに戻した後 filter をかけて足し合わせることで 1 band に戻す。

    • Pseudo-QMF bank というものを利用すると analysis -> synthesis の処理を経た波形データはほぼ完全に元の波形データに復元される。あくまでほぼ完全なのでちょっと誤差は出る。

Multi-band 化に用いる (Analysis, Synthesis) Filter Bank には [9] DurIAN で使用されている Pseudo-QMF bank が利用されています。

以上が multi-band 化のかなりざっくりした処理です。
直接波形を生成する系のモデルで今後 multi-band 化を利用するのは沢山見かけるようになりそうな気がする...
例えば、ヤマハさんも WaveNet の自己回帰のサンプリング回数を減らすために Pseudo-QMF bank を適用した特許をとってました。参考リンクはこちら

2.2. 学習方法

目的関数

以下の 2 種類からなります。
A. GAN の目的関数
B. FullBand, SubBand STFT Loss

MelGAN で使用された Feature Matching Loss はこちらでは使用されていません。

A. GAN の目的関数

MelGAN は Hinge loss でしたが、こちらでは Least Square 型のものを使用します。
式↓
f:id:tosaka-m:20200830195428p:plain:h70
f:id:tosaka-m:20200830195432p:plain:h50

B. FullBand, Subband STFT Loss

MB-MelGAN では MelGAN で用いていた Feature Matching Loss を使用せず、代わりに 波形データを STFT して移した先での Loss を使用します。
具体的には [4] Parallel WaveGAN などでも利用されている以下の 2 種類の Loss を考えます。(上が spectral convergence loss, 下が log STFT magnitude loss)

f:id:tosaka-m:20200830195457p:plain:h80

ここで STFT のパラメータ (例えば hop size とか window size とか) は 1 つに固定ではなく何種類か使用してそれらの平均を取ることでロバストな感じにします。
例えば M 種類の STFT の平均を取ることで Loss を以下のようにしています。
f:id:tosaka-m:20200830195510p:plain:h50

あとは、MB-MelGAN ではこれらの Loss を FullBand, Subband 両方で計算します。
(FullBand では教師値と予測の m-band を合成して 1 band にしたものとペアで loss を計算。Subband では教師値をm-band化した各bandと予測値の各bandのペアで loss を計算)

Full Band の Loss と Sub Band の Loss を合わせて、最終的な目的関数は以下になります。
f:id:tosaka-m:20200830195524p:plain:h40

Full Band と Sub Band それぞれで使用 される STFT のパラメータは以下になります。
f:id:tosaka-m:20200830195541p:plain:h200

学習上の工夫

最初は STFT Loss の方だけである程度学習させて、途中から GAN の Loss を追加するということをしています。
STFT Loss のみでもある程度のクオリティまではいけるので、GAN を使わず早めにある程度のところまで精度を持って行っておくことで収束を早める効果があります。

2.3. ベンチマーク

精度比較

こちらは MelGAN に各工夫を追加した場合の比較です。
特に ReceptiveField の大きい Layer の追加 (F3) が効いている様子です。
f:id:tosaka-m:20200830195559p:plain:h125
(F2 は feature matching loss → STFT loss の変更)

こちらは Multi-band 化した場合の精度です。F1~F3 の工夫は乗っています。
f:id:tosaka-m:20200830195618p:plain:h90

M2 は F3 と同じくらいですが、次で見る速度では圧倒的に M2 が良いです。

速度比較

こちらは各モデルの速度比較です 2。RTF は real-time factor で 1sec の音声の生成にかかる時間です。
f:id:tosaka-m:20200830195635p:plain:h125

M2 は実行時間が 1/6 ~ 1/7 になっています。めっちゃ早く、しかも軽量化されてる。

MB-MelGAN に関しては以上です。

4. おわりに

この辺の手法が気になった方はぜひ元論文も読んでみてください。ここで書いている内容とニュアンスが違う部分もあるかもしれません。
あと、間違っている箇所などがあればコメントいただけると幸いです。

モデルを使ってみた印象ですが、MB-MelGAN はあまりに早く推論には GPU を必要としないレベルで、精度もかなり十分なものでした (私の環境でモデルのfinetuneを試した際は十分学習していない or 使用データが悪いせいで希にノイズが乗ってしまうこともありましたが...)。
特に CPU でも一瞬結果が帰ってくるので音声のチェックがストレスなくできて作業がすごく捗ります。

前は WaveGlow を個人的には使っていましたが、学習が難しいor時間がかかる?感じがあってあまり高品質な Vocoder にならなかった (なんかキーキー言うノイズが乗ることがよくある) ので MB-MelGAN の方がいいかなと思っています。
ただ、MB-MelGAN も Adversarial Training の学習の難しさはあるのでより良いモデルを作るには色々試す時間と根気がいるかもしれません。

次回は Glow-TTS について書くのを予定しています。
先に Glow-TTS をまとめる予定でしたがプログラム、使用データなどにちょっとミスがあって色々やり直し中なので...
あと、前回の記事のモデルは Pitch をいじれるようにした変更なども入れているのでその辺りも踏まえて...

5. 参考

[1] Kumar, Kundan, et al. "Melgan: Generative adversarial networks for conditional waveform synthesis." Advances in Neural Information Processing Systems. 2019.
[2] Yang, Geng, et al. "Multi-band MelGAN: Faster Waveform Generation for High-Quality Text-to-Speech." arXiv preprint arXiv:2005.05106 (2020).
[3] Prenger, Ryan, Rafael Valle, and Bryan Catanzaro. "Waveglow: A flow-based generative network for speech synthesis." ICASSP 2019-2019 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP). IEEE, 2019.
[4] Yamamoto, Ryuichi, Eunwoo Song, and Jae-Min Kim. "Parallel WaveGAN: A fast waveform generation model based on generative adversarial networks with multi-resolution spectrogram." ICASSP 2020-2020 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP). IEEE, 2020.
[5] Yang, Jinhyeok, et al. "VocGAN: A High-Fidelity Real-time Vocoder with a Hierarchically-nested Adversarial Network." arXiv preprint arXiv:2007.15256 (2020).
[6] Oord, Aaron, et al. "Parallel wavenet: Fast high-fidelity speech synthesis." International conference on machine learning. PMLR, 2018.
[7] Isola, Phillip, et al. "Image-to-image translation with conditional adversarial networks." Proceedings of the IEEE conference on computer vision and pattern recognition. 2017.
[8] Wang, Ting-Chun, et al. "High-resolution image synthesis and semantic manipulation with conditional gans." Proceedings of the IEEE conference on computer vision and pattern recognition. 2018.
[9] Yu, Chengzhu, et al. "Durian: Duration informed attention network for multimodal synthesis." arXiv preprint arXiv:1909.01700 (2019).
[10] Jolicoeur-Martineau, Alexia, and Ioannis Mitliagkas. "Connections between Support Vector Machines, Wasserstein distance and gradient-penalty GANs." arXiv preprint arXiv:1910.06922 (2019).


  1. filter をかけるとは適当な window 関数で convolution するということ。

  2. Intel Xeon CPU E5-2630v3 使用時の結果。

自作の音声合成シャミ子に小説を読み上げさせてみた

7月何も書いてなかったので無理やりネタをひねり出してみました。

モデルは前回記事で試してみた GlowTTS + MBMelGAN をちょこっと改造したものを使ってます。
小説はフリーで利用できる青空文庫のうち宮沢賢治作の「春と修羅」の序と「注文の多い料理店」の二つを読ませてみました。(「春と修羅」は詩集ですが )

漢字混じりの文章をひらがなにするのに yahoo ルビふり api を利用しています。読みが変な箇所をごく一部手直ししましたが、あまりちゃんと確認してないので読みが間違っている箇所とかあるかもしれませんがご了承ください。

原文はそれぞれこちらです。

生成音声

こんな感じでした。CPU でも音声時間の 1/10 程度の時間で生成することが出来ます。

ちなみに「春と修羅」はまちカドまぞくでも一節が引用されており、作者の伊藤いづも先生曰くまちカドまぞくのキャラクターの背景とも重なる部分があるようなのでファンはぜひ一読してみましょう。
こちら参照 ↓

media.comicspace.jp

注文の多い料理店」は個人的に好きなのでチョイスしました。

モデルに関して補足ですが、GlowTTS はちょこっと改造して Pitch を input に入れられるようにしています。
入力に Pitch を与えない場合は文字単位で Pitch を推定し、それを利用する構造を加えています。

せっかく Pitch を変えられるようにしたので Pitch を変えてみた結果もみてみます。
以下は「春と修羅」の序の Pitch を変更した結果です。

  • 全体を 2 音上げた場合

  • 全体を 2 音下げた場合

全体の印象が多少変わります。
(Pitch は生成時の条件として利用するだけで、厳密にその通りに変わる訳ではないです。)

おわりに

今回は小説の読み上げ音声を作ってみました。
何て言っているかわからないところが結構あるのとガサガサした音声になってしまっているのでもうちょっと精度をあげたいですね。
Pitch をいれるモデルの構造とか学習方法/条件の詳細とかは...あの...そのうちモチベが上がればまとめます...

あと、もしシャミ子の音声合成モデルを使ってみたいという方がいましたら Twitter で DM いただければ 音声合成を試せる google colab の notebook をお渡しすることは出来ますのでこちらまでご連絡くださいませ。

諸事情あり配布を停止しています。

Glow-TTS を試してみた

Glow-TTS とはこちらの論文 のことです。
下記の github リポジトリでコードも公開されています。

github.com

今回はこの github コードをお借りして JSUT のデータセットで試してみました。

作成モデル推論結果サンプル
  • サンプルデータ 1

  • サンプルデータ2

  • サンプルデータ3 (濁音などデータが少ない場合は若干滑舌が悪くなります)

  • サンプルデータ4 とその予測 MelSpec の画像

f:id:tosaka-m:20200628212851p:plain
図1. サンプルデータ4 のMelSpec 比較

学習条件など補足
  • epoch 数=1000, batch_size=64 (GTX1080ti でちょうど 24h くらいかかった)
  • melspec 関連パラメータ: sample_rate=24000, n_fft=2048, hop_length=300, win_length=1200, n_mels=80, (torchaudio.transforms.MelSpectrogram 使用)
  • 入力テキストは JSUT データセットについてる .lab ファイルからローマ字の文字列を取得
  • glow-tts の github リポジトリで公開されているモデルから fine tuning
  • Vocoder は MB-MelGAN (mel の設定は同じ)
  • その他はだいたい公開されているコードの設定そのまま
計算速度

以下はサンプルデータ1 の生成にかかった時間です。
サンプルデータ1の音声時間=11秒、括弧内は Vocoder の計算時間

CPU GPU
0.568 s ± 3.46 ms (0.414 s ± 6.46 ms) 0.0777 s ± 513 µs (0.0127 s ± 26.6 µs)

前回の記事の他のモデルの結果と比べてみるとわかりますが、Glow-TTS めっちゃ早いです。 (あと前回の表の単位一部間違えてました。ほんとごめんなさい。)

おまけ

シャミ子の音声データで学習させたモデルのサンプル
(いい感じのやつを選んでます。他のテキストだったり適当に生成するともっと悪くなります。)

おわりに

今回やってみた感じだとデータの少ない子音をはっきりと話せないのとイントネーションが変になってしまう点に多少の課題がありそうです。ただ、論文だとこの何倍ものiterationを学習させているので、はっきり話せない点に関してはまだ学習時間が足りてないだけな気もしています。

しかし、この計算速度でこの音声の綺麗さはなかなかだなと思ったのと、flow を上手く使っている手法が好きで推せる論文なので皆さんもチェックしてみてください。

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

こちらの論文になります。 以下の論文中にあったベンチマークをみるとわかりますが、めちゃくちゃ速いて精度が良い

f:id:tosaka-m:20200612172754p:plain
図 1. AlignTTS論文中の比較結果

  • GT は生データ
  • MOS は高い方が良い

手法の詳細は書くのが面倒なので省略。気が向けば今後記事にするかもしれません。

AlignTTS だと Waveglow の方がボトルネックになっている感じですね。
ボトルネックの Waveglow を含む上記の図の数値でも 25 倍くらいは違うので AlignTTS 部分はかなり速いのが分かるかと思います。
(以前使った Nvidia の Tacotron2 は Waveglow に比べてそんな遅くなかった気がするけど...)

AlignTTS を使ってみた現時点での感想ですが

  • 学習がしんどい...(時間がかかる, 全く学習が進まないことも多い)
  • 予測する MelSpec の精度があまり良くない...

って感じです。(下の方にサンプルを載せてます。)

MB-MelGAN とは

割と最近出た論文でこちらになります。

MelGAN というのがもともとあってそちらもめちゃくちゃ速かったのですがさらに速くなってます。

以下で論文中のベンチマーク結果をみてみます。

f:id:tosaka-m:20200612172801p:plain
図 2. MB-MelGAN 論文中の比較結果

図2. の RTF は real-time factor の略で 1秒 の音声の生成にかかる時間を表します。
これによると MB-MelGAN は MelGAN の 7 倍くらいは速そう。

f:id:tosaka-m:20200612172757p:plain
図 3. MelGAN 論文中の比較結果

図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 の比較も参考までに載せておきます。

f:id:tosaka-m:20200612172805p:plain
図 4. 教師データと予測結果の MelSpectrogram 比較

上が教師データ、下が予測結果の 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 がそのうち実装されそうな感じ?なのでそっちがでたら私もそっちを使うと思います。

Nvidia Mellotron 解説

目次

Nvidia Mellotron とは

Nvidia の開発した音声のピッチ, リズム, スタイル変換や歌声の生成ができる Deep Learning モデルです。

ざっと論文の概要を掴むため最初に落合陽一フォーマットでまとめてみます。

1. どんなもの?
音声とテキストのペアのデータのみから感情のある音声の生成、歌声の生成、スタイル変換を可能にした。

2. 先行研究と比べてどこがすごい?
感情ラベルや歌声生成のための楽譜データ (alignment, pitch) を全く使用しない点。

3. 技術や手法のキモはどこ?
style token, speaker embedding, pitch contour(=f0) を入力にいれることで感情, 話者特性, Pitch調節を可能にし、
推論時に tacotron2 の attention の alignment を外から与えることで rhythm の調節を可能にしている。

4. どうやって有効だと検証した?
E2EProsody と比較して F0 Frame Error が低い。

5. 議論はある?
著者の future work で挙げられているのは rhythm, pitch が音声のクオリティに与える影響の調査と
Pitch に関してはボーカルレンジを広げる or multispeaker での学習が与える影響の理解。

6. 次に読むべき論文は?
E2EProsody (https://arxiv.org/pdf/1803.09047.pdf)

ここまで。

ここからはもう少し詳細を追っていきます。

Mellotron で出来ること

音声とテキストデータ (+ MultiSpeaker にするなら SpeakerId) のみで主に以下ができます。

  1. 音声の Style, Pitch, Rhythm 変換
  2. 歌声生成

デモはこのページで公開されています。

私は特に歌声生成が歌声の学習データ無しで出来るという点に興味を持って使ってみました。(前回記事参照)
一般的な歌声生成モデルの作成には歌の音声データと共に musicXMLMIDI 形式の楽譜データも必要とされますが、Mellotron は楽譜データを一切使用せず音声データとテキストのペアのみ用意すればモデルを作れます。
学習に楽譜データが必要だとすると、例えば特定のアニメキャラを歌わせようと思った時「そのキャラクターの歌が大量に必要で、なおかつ各歌に対応する musicXML 形式の楽譜データも用意する必要がある」という条件になり、これはかなりキツイです。。。

Mellotron の手法詳細

大体は Tacotron2 と同じなので違う部分をピックアップして紹介していきます。Tactron2 の解説はしません (こちらの方の記事などを参考いただければと)。

モデルの構造

Tacotron2 + GST をベースに入力に speaker embedding と pitch contour (=F0) をモデルに追加することで Style, Pitch, Rythom 変換を可能にしています。

モデルの構造の図はこんな感じ。赤色で囲った部分が Tacotron2 から追加された箇所です。

f:id:tosaka-m:20200429122214p:plain
図 1. Mellotron の NN 構造
Tacotron2 はテキストから音声波形データの特徴量である melspectrogram を推論するモデルですが、Mellotron はテキスト + pitch contour, SpeakerId, GlobalStyleToken(=GST, スタイル情報, 感情ラベルのようなもの) を使用して melspectrogram を推論します。

モデルの学習方法などはだいたい Tacotron2 と同じなのですが、 Tacotron2 では   p(melspec|Text, \theta)   (\theta はモデルのパラメータ) を最大化する学習を考えるのに対し、 Mellotron では melspectrogram を構成する要素をより細かく
    M = [ Text, SpeakerId, PitchContour, Rhythm, GlobalStyleTokens ]
に分けて   p(melspec|M, \theta)   を最大化する学習を考えます。(単にモデルに追加する情報を増やすだけ。)

このように Mellotron は Text, SpeakerId, PitchContour, Rhythm, GlobalStyleTokens を受け取り melspectrogram を予測出来るモデルなので、
話者やスタイルの変換は SpeakerId, GlobalStyleToken を別のものに置き換え、
声の高さやリズムの変換は Rythm, PitchContour を別のものに変えることで実現できます。

また、モデルの構造上 SpeakerId は学習データセットにないといけないですが、Text, PitchContour, Rhythm は学習データセット外のデータでも OK で、
さらに、GlobalStyleTokens は学習データから自動で作られます (なので感情ラベルを必要とせず感情を変化させた音声が生成できる)。

モデルの学習方法

学習時に使用するデータは テキスト音声波形データ (+ SpeakerId) のペアのみで、基本的には Tacotron2 と同じ方法でモデルの学習を行います。

違う点としては、モデルに PitchContour, SpeakerId, GlobalStyleToken の 3 つの情報をさらに加えて学習することです。(単一話者モデルの場合は SpeakerId はいりません。)

この 3 つは以下のように処理します。

PitchContour

入力に加える Pitch の情報は学習する音声波形データから Yin アルゴリズムで推定し、melspectrogram と時間方向の長さを揃えたものを使用します。
モデルは推定された 1次元の melspectrogram と同じサイズの Pitch データを 1 層の Conv + ReLU で Decoder 内の Prenet 後 (= LSTM の入力) のベクトルに channel 次元で concat する形で組み込みます。
Conv の構造は何パターンか試しているようですが、github上では inputdim=1, ouputdim=1, kernelsize=1 でした。

SpeakerId

SpeakerId ごとに embedding vector を作りテキストの encode vector に concat する形でモデルに組み込みます。
Multi-speaker モデルの場合は必須であり SpeakerId 自体をあらかじめ用意しておく必要があります。

Global Style Token

Global Style Token はこの論文の手法です。本筋ではないので GTS はざっくりと説明します。
GTS の構造は下の図2. の通りです(GSTの論文から引用)。

f:id:tosaka-m:20200429122304p:plain
図2. GST 概要

GST はいくつかの style token (図2. の A~D, スタイルの情報を表す vector) を持っており、 モデル(の学習時)は各音声データがどの style token に対応するかを求めて、 Mellotron にその対応する style token を与えて decode することでスタイルを考慮した予測が出来ます。
学習時の対応するスタイルの求め方は以下の流れです。

  1. 入力の melspectrogram から図2.中の Reference encoder により固定長の vector を作成 (以下 reference embedding)
  2. reference embedding と各 token の類似度を算出 (図2.の 0.2, ..., 0.1 の値の部分, 和が 1 になるように正規化)
  3. その類似度による token の重み付け和が入力の melspectrogram のスタイルを表す embedding vector (図2.の style embedding) になる

token 自体も最初はランダムな値から学習させるので、ラベル無しでデータセットの特徴からスタイルの種類を自動で作ってくれます

モデルによる推論方法

Mellotron の推論時には以下の図3. のように 5 つの入力をとります。

f:id:tosaka-m:20200429122332p:plain
図3. Mellotron 推論の流れ

ここで図中の Alignment とは Tacotron2 の Attention map のことで、大まかにはどの時刻にどの単語を話しているかの情報を持っています。
例えば Alignment は以下の図4. のような 2 次元の matrix になり、この matrix の時刻 t における各単語の値の大きさを見るにことよりその時刻で話している単語をおおまかに判断できます。

f:id:tosaka-m:20200429122409p:plain
図4. Alignment の例
(ある時刻 t の 「こ」 ~ 「わ」 の値を足すと 1 になるように正規化されている)

通常 Tacotron2, Mellotron は melspectrogram の推論をしながらこの Alignment も同時に推論するのですが、Mellotron でリズムをいじりたい場合はにこの Alignment をあらかじめ作っておき、モデルの推論途中 Attention の値を参照する時にあらかじめ作っておいた Alignment の値を使用することで特定の時刻に特定の単語を話させることが出来ます。

入力データを用意する方法

続いては推論時の各入力データをどうやって用意すれば良いか論文に乗っている方法を紹介します。
データを用意する方法は 「音声データを用意する」と「楽譜データを用意する」の 2 パターンに分かれます。
GlobalStyleToken と SpeakerId は学習データや使用するデータをそのまま使うだけなので省略します。
ちなみに、前回の記事の歌声を生成した時は「楽譜データを用意する」方法でやりました。音声データを用意するパターンもいずれ試したいとは思ってます。

音声データを用意する場合

音声データを用意する場合は主にスタイル変換を想定しています。既存の歌を他の声で歌わせる場合も該当します。
では、音声データからモデルの推論時に必要な Text, PitchContour, Alignment をあらかじめ用意した音声データから作る方法をそれぞれ述べます。

1. Text
論文では音声データから Text を得る方法としては Jasper などの ASR (Automatic Speech Recognition) モデルを紹介してます。

2. PitchContour
Yin や Melodia と呼ばれる手法で推定します。(参考: Yin は Mellotron のリポジトリ中にあります。 Melodia はこちらとか。使ったことはないですが。)

3. Alignment
gentle などのツール、または、 Mellotron の Teacher Frocing の推論で算出される alignment を使用します。
Teacher Forcing とは、時刻 t+1 の melspectrogram の推定の際入力に時刻 1~t の教師データの melspectrogram を使用する方法です。
学習時は基本 Teacher Forcing を使用しており、推論時は普通は教師データの melspectrogram なんかないので Teachear Forcing は使用せず時刻 1~t の melspectrogram に自身の予測を用いる自己回帰で行います。

ここでは音声データを用意している想定なのでそれを教師データとみなして学習時のように Teacher Forcing で推論すると、 元の音声データと時系列のあった Alignment が得られます。
Teacher Forcing で Alignment が綺麗に推論されない場合は低lrで少しのiter学習を回すと良いそうです。

楽譜データを用意する場合

楽譜から Text, PitchContour, Alignment を用意する方法を述べます。
楽譜データは musicxmlMIDI などのメジャーな形式なら Pitch などの情報を取り出すのに music21 という python で使えるツールがあり、nvidia/mellotron の github リポジトリでも使用されています。なので、楽譜データは music21 で読める形式のものを用意するのが良いでしょう。

1. Text
楽譜からそのまま取ればいいですが前処理が必要になります。英語の場合はアルファベットを発音記号に変換します。
例. hello → HH AH0 L OW1

私が日本語でやった時は発話記号がよくわからなかったので、(今もよくわかってないですが)ローマ字に変換しました。
例. こ → k o

2. PitchContour
こちらも楽譜からそのまま取ります。各音符に対応する周波数の値を時間を揃えてそのまま並べるだけです。

3. Alginment
こちらも楽譜からそのまま取ればいいと言いたいですが、例えば日本語で1つの音符に「こ」が対応している場合「こ -> k, o」と分けるので k が何秒, o が何秒と割り当てる必要があります。英語も発音記号に分けるので同じ問題があります。

Mellotron のコードでどう処理されているかというと、 楽譜上で(単語はおそらくだいたい母音ごとに区切られているので) "HH AH0" と "L OW1" の塊がそれぞれ 0.25, 0.25 secと定義されているとすると、
  HH=0.05 sec,   AH0=0.25-0.05,   L=0.05,   OW1=0.25-0.05
と各発音記号に時間の長さを割り当てます。
子音の発話記号ごとに固定長が定義されているようで、HH, L はそれぞれ 0.05 secでした。母音の長さは子音の長さを引いた残りの値で定義されます。

私が日本語でやった時はローマ字にしたので 「こ」 → 「k, o」が 0.25sec なら
  k=0.075,   o=0.25-0.075
といった感じに単語の時間の長さの割り当てて実行しました。
0.075 の部分は子音に関して全部同じ値の固定長の割り当てをしており、母音には残りを割り当てるようにしています。

このあたり詳しくないので詳しい方がいらっしゃったら参考文献をお教えいただけると幸いです。
楽譜読める人とか音楽やっている人の方がこのあたり詳しいかもしれませんね。

以上がデータを用意する方法です。
最後に Mellotron の推論で各種変換と 歌声生成の流れを軽く述べます。

話者,スタイル,ピッチ変換方法

音声データを用意
 ↓
Text, PitchContour, Alginment, SpeakerId, GlobalStyleToken を作成・用意
 ↓
声の高さ変換 → PitchContour を変更
リズム変換 → Alignment を変更
話者変換 → SpeakerId 変更
スタイル変換 → GlobalStyleToken を変更
 ↓
Mellotron で推論

歌声生成方法

音声 or 楽譜データ を用意
 ↓
Text, PitchContour, Alginment, SpeakerId, GlobalStyleToken を作成・用意
楽譜の場合は Style Token, Speaker Id は学習データから適当に選択
 ↓
Mellotron で推論

おわりに

ニュアンスが論文と異なっている箇所があるかもしれませんので、より深く興味があるかたはぜひ元論文も読んでみてください。 あと、間違っている箇所などありましたらコメントいただけますと幸いです。

Nvidia Mellotron で歌うシャミ子

おかしい...アニメ終了から半年以上たったのにまちカドまぞくのキャラソンがでない...つらい...

マリーアントワネット「キャラソンが出ないなら自分で作ればいいじゃない」

なるほど!確かに!!


という訳で Nvidia の mellotron というモデル を眺めていたところ、歌を歌わせられるらしいということを知ったので試してみることにしました。

github.com

 

現状やってみたところこんな感じのものができました。

 


まだノイズが全体に乗っているのと、苦手な子音も結構あるようです。

今後精度をあげられないか色々試していきたいとは思ってますがちょっと難いかもしれません...
とりあえずは mellotron 自体についてそのうちまとめようかなと思っています。

DeepLearning でアニメキャラのボイロを作った話 【モデル作成編 その2】

はじめに

モデル作成編 その1のつづきです。
やってみて効果があった手法とか、なかった手法とか、今後やりたいことをまとめます。
半年以上前にやったこととかもあるので覚えている範囲をふわっとした感じで書いていきます。

効果があった手法トップ3

トップ3ですが順不同です。

  1. Es-Tacotron2
  2. Denoising
  3. 入力に F0 を入れる

精度検証が目的ではなかったのでちゃんと精度を測るとかはしてないですがご了承ください。

その理由の一つとしてデータが少ないせいで Validation データの Loss が正しく測れずあまりあてにならないという印象があり、どちらかというと生成した音声を聞いて確認することや推論時に音声の崩壊する確率とかのほうを重要視していました。

印象でしかないですが音声を聞いた時の良さと崩壊率の低さがだいたいあっていたのと、 実用性を考えた時に生成される音声が崩壊しないというのはイントネーションが違うことや文字を飛ばしてしまうことよりも重要だと思ったのでこちらの方を重要視していました。
ちなみに、この現象は学習に使用するデータを増やすと減ったのでデータが少ない場合特有かもしれません。

あと、Validation Set の Loss は比較的すぐ Overfitting して上がって行ってしまうのですが、聴きごごちとかは下がり続ける印象が有ります。
こういった現象は他でも結構ある気がしていて、画像の分類問題を CrossEntropyLoss で学習している時にValidation Set の CrossEntropyLoss では Overfitting し始めているけれど、Accuracy など別の指標ではまだ下がっているみたいな。

話が少し逸れましたが以下でトップ3にコメントしていきます。

1. Es-Tacotron2

この論文の手法です。 これは引用がほぼされてないのでもしかしたら微妙な手法かとは思いますがデータが少ないころに試してみたらすごいよかったです。
その後データを増やしてからもずっと使ったままにしていたので、データを増やした後に効果があるかはわかりません。(そのため実は効かない説もありますが)。

大雑把にこの手法を説明しますと、 Es-Tacotron2 では最初に簡素なモデル (= Estimated Network) を学習させ作っておき、その簡素なモデルを使うことで学習データの複雑な箇所を重点的に学習させることをします。

データが少ない時はこれを導入することで過学習が抑制されたのと作ったモデルのイントネーションが安定する印象がありました。(まだまだ不十分ですが)。
これらの効果でおぉっと思ったので以後ずっと使い続けてます。
データが増えた時にも効果があるのかは気になっているので次何かする機会があれば試したいところです。

2. Denoising

前回の記事で書きましが、精度が悪い時にはかなり効果が有ります。これのおかげで行けそうという自信がつきました。

3. 入力に F0 を入れる

こちらも前回の記事で書きました。
今回使用したデータは F0 (= 音の高さ) のばらつきが大きかったのでこの情報を入れてあげることは大事だったと思いますが、JSUT などのデータセットの F0 の分散が相対的に小さい時にも効くのかは気になっています。

試したけどあまり変化がなかった手法

前述の効果があった手法とは反対に微妙だった方法もコメントしておきます。

1. Pseudo Labeling

学習したモデルを使って擬似的なデータを新たに作り出す手法です。 具体的には以下のようなことをします。

  1. 既存データで Tacotron2 + Denoising のモデルを作る。
  2. 作ったモデルで学習に使用していない任意の文章から音声を生成する。
  3. 生成した音声を擬似的な学習データとして元の学習データに追加して、再度 Tacotron2 + Denoising のモデルを作る。

これを行うと 3. では Tacotron2 の学習のみで 1. の Denoising 後に近い精度が出たのと、音声の崩壊の確率が下がって安定するようにはなりました。
ですが、(当たり前かもしれませんが) 擬似的に作ったデータ以上の精度は出なかったです。

2. SpecAugment

この論文 の Mel Spectrogram のランダムな領域をマスクする Data augmentation 手法です。画像分野の Random Erasing に近いと思います。
Tacotron2 の学習時には教師データの 時刻 t までの Mel Spectrogram を入力に与えて、教師データの時刻 t+1 の Mel Spectrogram を予測して学習するのですが、その入力に与える教師データの Mel Spectrogram のランダムな領域をマスクさせます。

画像分野の Random Erasing は Data Augmentation としてかなり効果あるのでその類似でよくならないかなと。正直効果のほどは不明です。下手に入れると逆に学習しなくなるので多分ない気がします。まぁこんなことするよりデータ増やしたほうが良いです。

今後試すならこの辺

今回色々やってみた結果を受けて今後の精度をあげるために試めしてみたいなと考えている手法たちです。多分やらないですが。

  • JSUT, JVS などの外部データを活用
    • JVS というデータセットの存在は知ったのはごく最近なので、こんな良さげなデータセットあるなら是非使ってみたいと思いました。
  • Tactron2 関連の改良
    • この方の記事 で知りましたが Mellotron とかいうのが出ているらしいのでチェックしたいです。
    • あとは Tacotron2 の構造を Transformer 系に変えてみるとか。
  • Denoising 関連の改良
    • もうちょっとサーベイして GAN を使う方法含めて検証したいです。GAN を使う方法の方が聞いた時の自然さはよくなるのではと思っています。
  • Vocoder 関連の改良
    • Waveglow 以外を試したいです。今は何がデファクトスタンダードなんですかね?速度があって高性能なのってなんでしょう。こちらもサーベイからやらないとダメです。

まぁこの辺より一番やった方がいいのはデータの見直しですかね...

おわりに

以上でこのシリーズはおしまいです。結構長くやっていたのでまとめるのも結構長くなってしまいました。
時間と計算資源が無限にあればもっとやりたいことも有りますが、色々限られているのでしょうがないですね。学生に戻りたい...

モデル作りと平行して React + Next.js で Web UI 作りに挑戦したり、Rasberry Pi にいれて Alexa 的な使い方をしてみたりとこのモデルを応用して遊んだりもしました。こちらも気が向けば何かしらの記事にまとめるかもしれません。
Rasberry Pi で遊んでいるシーンは傍から見るととかなり気持ち悪い...

作った感想ですが、データ作りはしんどい でも 音声分野は案外楽しい といった感じです。
データ作りに関しては誰かやってみてほしいですね、めちゃくちゃ作業しても全然たまらない辛さを体験してほしいです。
音声分野は全く知らない状態からスタートしましたが、最近は Deep Learning の方の知識でなんとかなったり、github で公開されているモデルを使うだけでそこそこのものができるのでいいですね。しかし、より品質を求めるにつれドメインの知識が必要になり詳しい人の教えを請わないとそろそろきつくなってきた気がしています。

音声界隈は画像や自然言語と比べるとマイナー感があってやっている人も相対的に少ない気がしていますが、今後音声界隈がもっと盛り上がって様々な新しい製品が世に出てきてステキな未来が実現されたらいいなと思っています。 去年から今年にかけて Yamaha の AI 美空ひばりや NEUTORINO が出てきたり最近の音声合成の発展は目覚ましいものがあるので、あと 1, 2 年くらいで好きなキャラクターのボイロが誰でも簡単に作れる夢のようなツールも出てくるんじゃないでしょうか。