月ノ美兎さんの音声合成ツール(Text To Speech) を作ってみた

#何をした？
Youtube上に公開されている動画の音声から、ディープラーニング技術を用いた音声合成ツールを構築しました。
今回対象にしたのは、バーチャルユーチューバー・にじさんじの委員長こと **月ノ美兎** さん（[Youtubeチャンネル](https://www.youtube.com/channel/UCD-miitqNY3nyukJ4Fnf4_A)）　です。
![unnamed.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645469/3794602a-54da-5142-68d5-369f81fe7034.jpeg)
※選出理由は、単純に私がYoutube上で一番推している方だからです。

#成果
動画から抽出した音声と、音声を文章に起こしたテキストの組み合わせのデータセット約50分ぶんを教師データとして学習した結果
※学習に必要なデータ量は最低でも1時間程度と言われているので、まだまだ足りていません…
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">月ノ美兎さんの音声合成ツールを作ってみた <a href="https://t.co/YVdWW9vREb">https://t.co/YVdWW9vREb</a> via <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a></p>&mdash; K2 (@K2ML2) <a href="https://twitter.com/K2ML2/status/1266216004469682177?ref_src=twsrc%5Etfw">May 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

発話内容が不明瞭な箇所がありますが、一応ご本人の声に近い音声を作成することができているかと思います。

#使用した機械学習モデル（mellotron）について
本ツールは、GPUのメーカーとして有名なNVIDIA社が公開しているオープンソースの機械学習モデル「**mellotron**」を使用して構築しています。（[GitHubリポジトリ](https://github.com/NVIDIA/mellotron)）

mellotronは公式デモにあるように、既存の音声からリズムや声の高さ等をトランスファーすることで、より人間に近い合成音声を作ることが出来ることが売りのモデルです。しかも、AIきりたんの愛称で動画サイトで一躍有名になった「NEUTRINO」のように楽譜を用意することで、**歌わせることが出来ます!!**（[mellotronデモページ](https://nv-adlr.github.io/Mellotron)）
まだ試せていませんが、後々挑戦してみる予定です。

機械学習によるText To Speechでは、「mellotron」の前身である「Tacotron2」が良く使用されていますが、今回のデータセットでは上手く学習させることが出来ませんでした。
理由はおそらく、単純な教師データ量の不足であることと、文章の読み上げ等と違って声の高さや話の速度が一定ではないため、テキストと音声のマッチングを学習するのが困難だったのではないかと考えています。

その点、mellotronは、テキスト＋時系列に対する音高(基本周波数：F0)を入力として、対応する音声を学習するので、今回のデータセットでもある程度学習が上手くいったのだと思われます。
> ![alt](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tam5917/20150305/20150305161328.png):
> [基本周波数についてのまとめ](https://tam5917.hatenablog.com/entry/2015/03/05/214305)　より



#作成過程
###教師データセット準備
**1.Youtube動画をダウンロード、音声データを取得**
サイトを使う・ツールを使う等、様々なやり方があるので、詳細は省きます。
今回使用した音声は、直近の雑談放送数個からそれぞれ少しづつピックアップしたものになります。
雑談放送は、ゲーム配信やコラボ配信などと異なり、ほかの人物の声が混ざることが殆どないため、仕分けする手間がなくなる利点があります。
あと、単純に委員長の雑談配信の内容が面白いので、この後の作業が苦にならないという利点がありました（重要）
https://www.youtube.com/watch?v=kbTzIMaLCsU
https://www.youtube.com/watch?v=F-hQWkP-aHo
https://www.youtube.com/watch?v=lkftcZuOv2A
https://www.youtube.com/watch?v=RgKRK_FGKZ4
https://www.youtube.com/watch?v=sEBw_-jCKvQ
https://www.youtube.com/watch?v=sRhF6OiD31k
https://www.youtube.com/watch?v=w27KPTKG034

**2.音声データから、声だけを抽出（BGMなどを除去）**
BGMなどは学習におけるノイズとなるため、できる限り除去する必要があります。

今回は、機械学習技術を用いたオープンソースの音源分離ツールである「Spleeter」を使用して、声とそれ以外の音に分離したデータを作成しました。（GitHubリポジトリ：https://github.com/deezer/spleeter）

音声に被さっているBGMを完全に除去することは出来ませんが、BGMだけの区間はほぼ無音にできるので、この後の工程に役立ちます。

**3.音声データを区切る**
上手く学習させるには、長すぎず短すぎない再生時間（2秒～8秒くらい）で一つのデータにしたいので、無音区間がある程度（今回は150msec）続いたとき、ファイルを分割するプログラムを作成して分割を行いました。

この時の失敗として、「きっと」等の小さい「っ」に当たる箇所の音声は無音になるため、「きっ」のところで文章が途切れてしまうケースが出てきてしまいました。
もっと長めの無音時間を設定してやり直すことも検討しましたが、長いファイルが出来てしまう確率が増えるのでそれはそれで手動で分割する必要があるので、そのまま続行しました（これが原因で教師データとしての質が低くなる可能性があるので、良い手では無いと思います）

分割してできたファイルのうち、上記の再生時間から外れるデータを取り除いて残ったデータで、次の工程を行っています。

**4.音声データに対応する文章を作成する（一番の苦行）**
文字起こしの速度・精度に自信が無い and 楽がしたいという理由から、まずクラウド音声認識APIを利用して音声に対するテキストを取得しました。
この際使用したのは、IBM Watsonの音声認識APIです。無料のプランで月当たり500分ぶんの音声認識が利用できるので利用しましたが、ここはGoogleでもAmazonでも何処でもいいので、用意したデータに対して精度良く認識が出来るサービスを選ぶのが良いと思います。

Watsonの音声認識が今回どの程度の精度だったかというと、一つの文を完璧に認識出来ていたのは一割未満で、ほとんどが1,2単語程度の誤りがありました。特に、人名や特殊な語彙・略語はほとんどが誤認識となります。Youtubeの自動生成字幕と同程度の精度かな、というイメージです。

つぎに、音声認識で得られたテキストと実際の音声を聞いて比べ、間違っている文章の修正・文章化できないような音声（笑い声、呼吸音等）の除去を手動で行いました。

例.クラスタ⇒フラスタの誤認識なので修正
![cap1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645469/958e0bed-6ba4-61e8-d6b6-2cbd308e1939.png)

この作業で用意できる教師データが1時間につき1～2分程度なので、十分な量のデータを用意したいのですが、中々作成ができません…
私のGW引きこもり生活のかなりの部分をこの作業に費やしてもなお、用意できたのは50分程度です。
ここを楽できる技術があればどんどん音声合成の精度を上げられるので、何かしらの方法を検討していきたいです。

最後に、テキストを発音に近いローマ字（こんにちは⇒konnichiwa）に変換しました。これは、先行事例でもやっている人が多いので効果があると見て採用しました。


###モデルのトレーニング
モデルのトレーニングをするには高価なGPUが必要になりますが、今回はGoogleが提供する **無料でGPUが使える** 計算環境 [Google Colaboratory]( https://colab.research.google.com/?hl=ja) を使用しました。数十万～数百万するような高性能GPUを無料で使えるという、神のごとき太っ腹サービスなので、これから機械学習を始めたい人は利用してみるのをおすすめします。

最大12時間で強制的に切断されるという時間制限があるものの、Google Driveに接続することが出来るので、トレーニングの途中経過を保存したファイルからトレーニングを再開することを繰り返すことで、約3日分のトレーニングを行いました。


###音声合成実行
mellotronはよくある音声合成システムのようにテキストだけでは音声合成を行うことができないので、テキスト＋時系列に対する音高(F0)のデータを用意する必要があります。

F0を取得する方法としては、既存の音声データから取得する方法と、楽譜の形で用意したファイルから取得する方法が用意されています。


成果の欄で上げた結果は、声優統計コーパス(プロ声優による音声)を使用したパターンと、別の音声合成システムで生成した音声（今回は流れでIBM Watson の音声合成を採用）の二種類で検証を行いました。

リズムや声の高さは元となった音声に依存するので、元データを調整することにより任意の音声合成結果を得られるかと思われます。

#今後の展望
- 現状では教師データが十分ではないので、データを増やして再学習したい（準備する時間が取れれば…）
    - ある程度精度があがったら、音声合成結果を使ったMADとかの制作をしてみたい
- 今回用意したデータセットを使いまわせそうな領域にチャレンジ（月ノ美兎さんに特化した音声認識システムとか？）
- 声の次は映像！　他者の動きを転移させた画像を生成する[Everybody Dance now](https://www.youtube.com/watch?v=PCBTZh41Ris)で「謎ノ美兎」を躍らせるチャレンジ！？