今回やったこと
最新の音声合成手法「VITS」を用いて日本語音声合成を試してみました。
VITSとは
VITSは2021年6月に発表された音声合成の手法です。論文はこちら。
この手法がなかなかすごくて特徴をざっくりまとめると以下です。
- TTS(テキストから音声への音声合成)ができる
- 複数話者のTTSが1つのモデルで作れる(もちろん1話者のTTSも作れます)
- 従来のTTSは音響モデル(テキストからメルスペクトログラムへの変換)とvocoder(メルスペクトログラムから音声への変換)の二つの機械学習モデルを作る必要があったが、VITSは1つのモデルで「テキストから音声への変換」ができる
- STS(音声から音声への変換。ボイチェン)もできる
- 高品質・高速
簡単に言うと「めちゃつよ」です。
ソースコード
こちらで公開されています。
https://github.com/jaywalnut310/vits
日本語対応
日本語対応のためにsymbolsとcleanersを用意しました。
symbols = [' ', 'I', 'N', 'U', 'a', 'b', 'by', 'ch', 'cl', 'd', 'dy', 'e', 'f', 'g', 'gy', 'h', 'hy', 'i', 'j', 'k', 'ky', 'm', 'my', 'n', 'ny', 'o', 'p', 'pau', 'py', 'r', 'ry', 's', 'sh', 'sil', 't', 'ts', 'ty', 'u', 'v', 'w', 'y', 'z']
def japanese_cleaners(text): phonemes = text.split('-') return phonemes
データセット
データセットは「A: Japanese Single Speaker Speech Dataset」と「B: つくよみちゃんコーパス + つくよみちゃん追加音声」を用いました。今回は2話者TTSを1つのモデルで作ってみようと思います。
1話者TTSとしてAで学習したあとにBで転移学習してもよかったのですが、2話者TTSとして学習した方が手っ取り早く、性能的にも転移学習した場合と同等なのではと思ったので2話者TTSにすることにしました。
データセットの数の細かい内訳は以下のような感じです。
データセット名 | 訓練用の数 | 評価用の数 |
---|---|---|
A: Japanese Single Speaker Speech Dataset | 6749 | 50 |
B: つくよみちゃんコーパス + つくよみちゃん追加音声 | 700 | 16 |
合計 | 7449 | 66 |
学習のためのファイルリストは以下のように作りました。「<ファイルパス> | <話者ID> | <読み上げ文の音素>」です。読み上げ文の音素が「-」区切りなのは「japanese_cleaners」でそう定義したからです。
meian-wavs/meian-3510.wav|1|sil-ts-u-d-a-t-o-s-a-sh-i-m-u-k-a-i-n-o-t-o-k-i-n-i-k-u-r-a-b-e-r-u-t-o-pau-m-a-r-u-d-e-b-e-ts-u-j-i-N-n-o-y-o-o-n-i-r-e-e-g-i-t-a-d-a-sh-i-k-a-cl-t-a-sil
tsukuyomi-wavs/tsukuyomi-0192.wav|0|sil-g-e-N-z-a-i-n-o-o-N-s-e-e-g-o-o-s-e-e-g-i-j-u-ts-u-d-e-w-a-k-a-N-p-e-k-i-n-i-k-o-e-o-s-a-i-g-e-N-s-u-r-u-k-o-t-o-w-a-d-e-k-i-m-a-s-e-N-g-a-pau-k-I-f-u-y-o-m-i-ch-a-N-n-a-r-a-pau-sh-o-o-g-i-k-a-i-n-i-d-a-k-e-w-a-k-a-N-z-e-N-n-a-k-o-e-o-n-o-k-o-s-U-k-o-t-o-g-a-d-e-k-i-m-a-s-U-sil
meian-wavs/meian-0424.wav|1|sil-y-a-g-i-h-i-g-e-o-h-a-y-a-sh-I-t-a-h-o-s-o-o-m-o-t-e-n-o-ch-i-ch-i-n-o-k-a-o-o-i-t-a-z-u-r-a-n-i-s-U-k-e-cl-ch-i-sh-I-t-e-pau-d-o-o-sh-i-y-o-o-k-a-t-o-k-a-N-g-a-e-t-a-pau-y-a-g-a-t-e-k-a-r-e-w-a-k-e-cl-sh-i-N-sh-I-t-e-t-a-ch-i-n-o-b-o-cl-t-a-sil
結果
configはほぼ「ms_base.json」のままで400k stepくらい学習させました。3、4日くらい学習を回していた記憶です。音声合成時の推論時間はだいたいCPUで「2~5秒」、GPUで「0.2~0.8秒」くらいでした。
「A: Japanese Single Speaker Speech Dataset」での合成音声
「この音声は最新の音声合成手法でつくられました」
「今日はとってもいい天気ですね」
「シロワニさんの機械学習ブログをよろしくお願いします」
「B: つくよみちゃんコーパス + つくよみちゃん追加音声」での合成音声
「この音声は最新の音声合成手法でつくられました」
「今日はとってもいい天気ですね」
「シロワニさんの機械学習ブログをよろしくお願いします」
他実験の結果
ここでは結果は割愛しますが、jvs_corpusを使って100話者のTTSモデルも作りました。1話者の音声は約100文ですが、どの話者のTTSもわりと自然に話す感じでした。
また、jvs_corpusの中に日本声優統計学会のデータを足した場合のTTSモデルも作りました。しかし、「土谷麻貴様:喜び」話者での推論音声はガサガサになっていました。もしかするとVITSをマルチスピーカー学習させたときは、Hzの高い話者の品質が微妙なる可能性があるのかもしれません。もしくは元気に話す音声が苦手な可能性も。
まとめ
自分の肌感として、VITSはナレーションのTTSとしては現状最強の手法な気もします。しかし、感情的なアニメ風TTSを作る場合は上手くいかない可能性もありそうです。
このまとめについては、自分はちゃんと実験したわけではないので、感想程度に受け止めていただけると幸いです。
余談
あんまり品質的に改善されたと言いにくそうですが、要望があればこのモデルをシロワニさんのつくよみちゃんトークソフトに組み込むことも可能です。改善というより別スタイルみたいなイメージですが。
クレジット
この記事内の合成音声には、フリー素材キャラクター「つくよみちゃん」が無料公開している音声データが使用されています。
■つくよみちゃん公式サイト
https://tyc.rei-yumesaki.net
■つくよみちゃんコーパス(CV.夢前黎)
https://tyc.rei-yumesaki.net/material/corpus/
© Rei Yumesaki