2021年6月に発表された最新の音声合成手法「VITS」でアニメ風合成音声を作ってみた【つくよみちゃんコーパス】

f:id:shirowanisan:20201228142209p:plain

今回やったこと

最新の音声合成手法「VITS」を用いて日本語音声合成を試してみました。

VITSとは

VITSは2021年6月に発表された音声合成の手法です。論文はこちら。

[2106.06103] Conditional Variational Autoencoder with Adversarial Learning for End-to-End Text-to-Speech

この手法がなかなかすごくて特徴をざっくりまとめると以下です。

  • 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