🎙️
JVSコーパスとESPNetを使って複数話者TTSモデル(VITS)を訓練させた
はじめに
背景
- 複数話者のTTSモデルは色々な使い道があります
- 例えば、音声変換モデルの事前学習モデルとして活用されることがあります(参考: VITSを利用したVCの解説記事)
- あるいは、「平均声」的なものを活用することで、著作権の問題を回避できる可能性が高くなるかもしれせん(参考: STORIA法律事務所さんのブログ)
- しかし、日本語の複数話者TTSモデルとしてオープンソースで配布されているものは、実はほとんどありません
- 参考:過去に私が書いたサーベイ記事
- ESPNetにおいても、本記事執筆時点で、複数話者TTSのモデル重みや訓練レシピは配布されておりません(参考: Issue)
補足
- ESPNet: 音声認識モデル、音声合成モデルなどの訓練や推論を簡単に行えるライブラリ
- JVSコーパス: 話者100名、合計30時間程度の音声とテキストのパラレルコーパス。
目的と概要
- JVSコーパスとESPNetを使って複数話者TTSモデルを訓練し、性能を確認します。
結果
訓練設定
- RTX2080super (memory: 8GB)
- epoch数: 1000 -> 1週間程度の訓練時間(高スペックなGPUならもっと早いと思います)
- batch_bins 375000 -> 5GB程度のメモリ消費
- モデルアーキテクチャ・事前学習: JSUTで事前学習されたVITS
音声サンプル
Zennには音声ファイルを埋め込めないっぽいので、GoogleDriveへのリンクをベタ貼します。
以下、driveの見方です。
-
speaker_{i}_text_{j}.wav
: 今回学習した複数話者TTSモデルで、話者{i}にテキスト{j}を読み上げさせたサンプル -
speaker_baseline{i}_text_{j}.wav
: ベースラインとした単一話者TTSモデルで、話者{i}にテキスト{j}を読み上げさせたサンプル
考察
- 品質はそこそこ
- 話者性: しっかりと反映されている
- 自然さ: 微妙。単一話者ベースラインに比べてほんの少しだけ劣る印象。
- 性能のボトルネックはどこか?
- モデルサイズ or データサイズ or エポック数 or モデルアーキテクチャ
実装概要
大まかな実装方針は以下になります(※今のところ訓練コードや重みは公開していません。需要があれば検討します。)
- VCTKコーパス(英語の複数話者コーパス)を使って複数話者TTSモデルを訓練するレシピ、及びJVSを使って単一話者TTSモデルを訓練するレシピはすでにESPNet内に存在するので、それらのレシピを参考に、訓練レシピを作成する。
- 具体的には、
local/data_prep.sh
周りを中心に書き換える
終わりに
- ESPNetのレシピを少し改変し、JVSで学習することで、そこそこの複数話者TTSモデルが作れた
- しかし合成音声の品質についてはもう少し改善の余地がありそう
- 今回は話者IDを入力として与える形にしたが、話者embeddingを入力として与える形も面白そう
- (ただし悪用のリスクも高まるので慎重に)
- 研究室や会社から離れて個人開発を行うと、GPUリソースが意外とボトルネックになる。だれかGPU恵んでください。。。
Discussion