Help us understand the problem. What is going on with this article?

Tacotron2を用いた日本語TTS(Text-to-Speech)の研究・開発【まとめ】

結果

Screenshot_2019-09-30 TensorBoard.png

三行結論

サンプルが少なくても
家庭用のGPU GTX1660で
そこそこのクオリティの日本語TTSができる

MLの現在

DNN技術が発展してきた昨今、画像認識の分野が一般に普及してごくごく普通に使われるようになってきた
単純に認識し使うだけだった技術はRNNやLSTMを取り入れて
その行き過ぎた技術であるDeepFakeなるとんでもないものまででてきた

画像認識の発展に遅れるように続くのは音声合成
”目の次は耳”とでもいうかのように研究が盛んになってきた

今ではGoogle Cloud TTSのように既に実用化までに取り付けている企業まででてきた

音声合成で記憶に新しいのは”AIひばり”
YAMAHAの技術力の集大成であり、
データを駆使して新たなコンテンツを提供できることを率先して認知させた

同じ音楽関係の音声合成では"AIりんな"もある
日本マイクロソフトの提供でYAMAHA同様、その完成度の高さが聴いてとれる

機械学習によって人間が生み出す情報と機械が生み出せる情報の差がほとんどない、そんな時代になってきた

イントロダクション

ここからは私的な話に移る

機械学習というものを知った大学時代
この技術を応用すれば、
「好きなキャラクターに好きな言葉を話してもらえる」
のではないか、と思うようになった

そこでTTSについて調べてみたところ、
Googleによって発表されたTacotron(以下taco)というものが
有力候補に挙がった
サンプルを聴く限りでも相当聞き分けがつかないようなレベルだった

Tacotron2

taco2+WavGlwは、
TextからMel Spectrogramを生成するモデルと
Mel SpectrogramからWaveを生成するモデルにわかれる

taco2は前者にあたり、
Encoder-Decoderモデルで構成される

NVIDIAのtacoモデルは論文にある通り、5文字ずつを畳みこむことから始まる
その後のBidirectional LSTMまでをEncoderプロセスとする

DecoderプロセスでもLSTMを利用し、出力手前で畳み込み層を設けてこれを修正している
StopTokenはある閾値で出力を止めるフィードバックの役割を果たす

WaveGlow

音声からMel-spcを切り出して、Waveformにするモデル

文章情報をMel-spcにするtacoモデルとは情報量が違い、
時間当たりの入力次元数に対して出力次元数が低いので、
考えなしの適当な設定でも学習を進めれば大体誤差がなくなると思われる

RNN、WNなどを取り入れている

周辺情報

結果にある環境で研究をした
情報を箇条書きする

  • モデルデータ

    • taco: 1モデル約280MB
    • waveglow: 1モデル1.4GB, これはモデル構成のWNに起因すると思われる
    • waveglowのモデル容量はHPによって下げることが可能(?)ただし質も下がる
  • 学習

    • taco2 : 1 step 3秒ほど 
    • taco2: GPU使用メモリは3~4GBほど
    • waveglow : 1 step 1秒足らず
    • waveglow: GPU使用メモリは5~6GBほど
    • GTX1660 6Gがこのモデルを使用する最低スペックであると思われる
    • 2日あればそれなりのモデルが作れる(各1日)
    • GTX1660では同時学習はメモリの関係で不可能
  • 使用

    • taco2, waveglow を起動して合成準備段階で3GBほどのGPUメモリを消費する
    • 合成される音声は同じ文章でも毎度異なり、それぞれイントネーションが違う
    • 頻出の単語もしくは全くの未知の単語に関しては、イントネーションの束縛が強い傾向にある
    • その場合、同じ文章でも同じ音声が合成される場合が確率的に多いことがわかっている キャプチャ.PNG 上の画像は同じ文章から生成した音声をAudacityでみたもの
      だいたい同じように聞こえるが、実際はすべて異なることがよくわかる

考察

結論は先に記したので、考察をする

taco2の学習

音声の音程など、自然なイントネーションの発話に関しては
taco2のモデルに影響される
同レポジトリのissueにもある通り、
embeddingが非常に重要なパラメータとなっている
これがデータセットに合っていないと、狙い通りに学習が収束しない

モデル概要でもある通り、畳み込みの次元数の設定は非常に学習状況に影響を及ぼしやすく、
イシューで指摘している韓国人さんの母国語では、512という初期値は高すぎると意見している

韓国語のコーパスがどういう構造なのかは知らないが、
日本語もそこまで高くないものと判断してこれを重点的にHPを設定した

結果としては、512よりも少ない設定に落ち着いた
これを決めるにあたって、何か法則のようなものがあるのではないかと検証し調べてみたが、
そういったものは見られなかった

英語のcharセットで512であるのも次元数決定に関する考察は論文には書かれてなかった(はず)
なので、おそらく感覚、経験、総当たりによる最適数値だと結論付ける

データセットに使う音声

issueや、become-yukarinで有名なヒホ氏のブログにもある通り
音のない時間というのが、本学習においては悪要素として働くものと考えていた

しかし、それは声質変換だけの話であったようだ
音声合成においては文章から自然な発話を目指すため、そもそも入力と出力の関係が違う
むしろ、targetの音声は適度な無音がないと自然な発話に聞こえない

本研究では、音声の両端の無音区間は一定時間ではなく、
すべてバラバラな状態でこのモデルができた
一定時間に定めると、より機械感が増す可能性もある

結果論ではあるが、無音区間に関してはそこまで考慮しなくてもいいと判断する

ノイズ

ノイズはWaveGlowモデルに依存すると判断する

Mel-spcからWaveを生成するこのモデルは、
発話の再現性、というよりも、音それ自体の再現性を担っている
再現性というのがノイズを指し、
再現性が低ければ、ノイズが多くなる

ステップ毎のモデルで音声合成をすれば分かるが、
80k stepsのモデルと 300k stepsのモデルでは、
生成音声に雲泥の差があり、
それぞれの(体感で)いい音声にするためのノイズキャンセリング強さのパラメータに、
0.01 と 0.0001と100倍ほどの差がある

よって、ノイズをなくしたいのであれば、
WaveGlowの学習を進めればよい

が、

WaveGlowにはLoss explodesというものが報告されており、
本研究でも同じような現象がみられた
Screenshot_2019-10-13 TensorBoard.png
スムージングしてあるのが濃い色で薄いのが実際の数値のグラフ
約170k steps数あたりでlossが暴発しているのがわかる

イシューを見て試行してみても原因がつかめないが、
学習時にエラーが起こるようなことは起きていない
ただ、170k以降のモデルの精度の信頼性が分かるなくなる

使用上は問題なく音声合成ができているが、
いまいち拭えないものがある

追記:'.3.8

現在開発中のQB-TTSのWaveGlow学習training lossグラフ
Screenshot_2020-03-08 TensorBoard.png
50万ステップを超えた現在、暴発がみられない

この素材は静音環境での録音であり、調整もしていない
TOA-TTSの素材のスタジオ録音より遥かに劣るはずの素材で暴発がみられないのは、
何かしらの要因が素材にあると思われる

学習パラメータは周波数範囲のみ変更をした
音声サンプルは約17分でTOA-TTSの3倍ほど

確実に学習はできていることが伺える
どちらがいいとは言えないが、
TOA-TTSの方が学習10万ステップほどで聞けるくらいになることを考えると、そちらの方がいいように思える

もうひとつ、
fp16での学習もしてみたが、こちらは上手くいかなかった
イシューを見る限りでもやっている人が今のところ見られず知見が少ない
出来ない要因がどこにあるかがわからない

確実にいえるのは、
素材によってできるできないが大きく変わるということ
EQでの調整をした素材でもできるのか、そのあたりの情報が欲しいところ

アニメからの切り出しでTTSを作った人がいる
この人はbecome-yukarinの人を参考にしたようで、
複数回に渡ってDNNによって音声をつくりだしているよう…
できないことはないらしい

Tacotron2&WaveGlow間の問題点

tacoとwaveglowの2つのモデルによって音声合成をすることにも問題点があると思われる

tacoのMel-spcのサンプルが以下
mlel.jpeg
上: taco, 下: target
(steps数不明、失敗パターンのグラフ、説明用に使います申し訳ない)

みればわかるが、tacoによる生成はtargetにあるような
おそらく”自然”といえる発話の要因と考えられるノイズ(?)が表現できておらず、
グラデーションのように遷移する

これは成功パターンのMel-spcでも同じようなグラフになり、
tacoが生成するMel-spcは、ほど”綺麗な”グラフになる

これを前提として、waveglowの話に移る

waveglowは音声から直接Mel-spcを取り出し、
これを音声自身の波形になるように学習する

だが、実際に入力されるのはtacoが生成したMel-spcで
私たちが必要としているのはtacoから生成されたMel-spcから音声を生成するモデルであり、
理想は『tacoによるMel-spcから求める音声波形を生成するモデル』を学習することである

この2つのモデルにわけることの最大の問題点は、
そもそもの学習におけるMel-spcのモデル間の入出力のクオリティの差であり、
これが音声合成のノイズに直結する原因に成り得る、
もしくは、
狙い通りの音声にならない原因に成り得る、ということ

よって、
両者のモデルである一定の水準の学習済みモデルを使用しないと
目的の音声を合成できないのではないか、と考察する

実際の使用に関して

私のモデルの場合での話だが、
周辺情報にもある通り、合成される音声は確率的に毎度違う音声が合成される
同じ文章を入力したとしても、同じ音声が生成されることはまずない
同じように聞こえる音声ができたと思っても、若干何かが異なっている

動画で使用している合成された音声は、
より会話として”合う”音声を任意にピックアップしたもので構成されている
納得のできる音声合成は、1文につき20個生成して1個か2個といったところ
頻出の単語をつかうとより早く目的の音声を入手できる傾向にあり、生成は5回程度で済む

例えば、
「私はプログラミングが大好きです」といった文章であれば
音声合成は1秒かからないくらいになる

ピッチ、リズム調整等は全くしていない
その機能もない(mellotronはある模様)
ライブを見ての通り、文章を平仮名に変換して、
それがそのまま入力値になる
調整をして自然になるならそれを目指したい

追記 11/9:データセットを見返した

ことの始まりは作業配信
視聴者を気遣うべく敬語口調で話すのだが、TOA-TTSは敬語を上手く話せない
何故だろう、と思い当たったのがデータセットだった

構成されるデータセットを見返す
80文ないくらいのデータセットのうち、
疑問文が4割くらいで、当然というか、敬語は一切ない

つまり、学習していない敬語を話すから変な感じになる、とただそれだけのことだった
寧ろ、学習せずに推測だけでなんちゃって敬語を話せるならそれでもいい気がする

データセットをざっとみると、
語尾は「~の」「~だし」「~じゃん」「~だよ」「~ない」「~けど」「~ね」が多く、
あとは体言止めの(名詞で終わる)文章などがよく見られる

これを構成する入力であれば、実にそれっぽい音声を生成することができる
ということになる
"人が決めた"正しい語句のイントネーションで発話するとき、
はじめて膨大なデータが必要になる

時間がなければここで満足しないといけないのが、この学習の辛いところでもある
先に効率的なアノテーション手法の開発をする方が賢明かもしれない

データセットに関して 追記 11/14

データセットに使ったサンプル音声は
”ゲーム先頭から長めの文章80(ないくらい)”で、
特に50音(日本語の音?)を気にして作成していない
経験的には長めの文章ならどんなものでもできると思っている

日本語の音声合成をやっている人がいなかったこともあってやってみたが、
サンプルが少なくてもできることが本研究の大きな収穫だった

音声合成の速度は非常に早く、入力から数秒で行えるレスポンスなので
サーバーに繋げて利用するネットワークを組んでも十分機能するものになる

さらなる肉声化を目指しているが、
今はまた迷走中...

yukari120
趣味で動画制作やプログラミングしている人
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした