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 年くらいで好きなキャラクターのボイロが誰でも簡単に作れる夢のようなツールも出てくるんじゃないでしょうか。