見出し画像

人間並みに自然な音声生成AI「Style-Bert-VITS2JP-Extra」を試してみた。

こんにちは、IZAIエンジニアチームです。今回はテキストから感情豊かな音声を生成できるOSS「Style-Bert-VITS2」の中でも日本語の音声生成に特化した「Style-Bert-VITS2JP-Extra」を使って、より自然な人の声が再現できるか試してみます。


公式チュートリアル動画もありますのでこちらもぜひ。

試してみる


1. データの準備

今回は音声データとして国立研究開発法人情報通信研究機構(NICT)が公開している「話速変換コーパス:SpeedSpeech-JA-2022」を使用させていただきました。
音声サンプルはこちら

2. 環境構築

学習については、公式のノートブックを参考にColabを使用して進ます。
まず以下のコードでStyle-Bert-VITS2が使える環境を構築します。

import os

os.environ["PATH"] += ":/root/.cargo/bin"

!curl -LsSf <https://astral.sh/uv/install.sh> | sh
!git clone <https://github.com/litagin02/Style-Bert-VITS2.git>
%cd Style-Bert-VITS2/
!uv pip install --system -r requirements-colab.txt
!python initialize.py --skip_default_models

追記

(2024.9.4時点)
ライブラリのアップデートによって文字起こしや音声データを分割する際にエラーが出るので以下のバージョンのライブラリをインストールしてください。

!pip install torch==2.4.0
!pip install torchaudio==2.4.0

また、以下のコードで学習に必要なファイルや途中経過を保存するdataset_rootと学習結果を保存するassets_rootというディレクトリを設定します。

# 学習に必要なファイルや途中経過が保存されるディレクトリ
dataset_root = "/content/drive/MyDrive/Style-Bert-VITS2/Data"

# 学習結果(音声合成に必要なファイルたち)が保存されるディレクトリ
assets_root = "/content/drive/MyDrive/Style-Bert-VITS2/model_assets"

import yaml

with open("configs/paths.yml", "w", encoding="utf-8") as f:
    yaml.dump({"dataset_root": dataset_root, "assets_root": assets_root}, f

3. 学習データの準備

音声ファイルとテキストデータを利用して学習を進めるやり方もありますが、今回は、Whisperを使って音声ファイルから文字起こしを自動で生成してみます。

# 元となる音声ファイル(wav形式)を入れるディレクトリ
input_dir = "/content/drive/MyDrive/Style-Bert-VITS2/inputs"
# モデル名(話者名)を入力
model_name = "your_model_name"

# こういうふうに書き起こして欲しいという例文(句読点の入れ方・笑い方や固有名詞等)
initial_prompt = "こんにちは。元気、ですかー?ふふっ、私は……ちゃんと元気だよ!"

!python slice.py -i {input_dir} --model_name {model_name}
!python transcribe.py --model_name {model_name} --initial_prompt {initial_prompt} --use_hf_whisper

セル実行後、esd.listというテキストデータが生成され適切なディレクトリに自動的に配置されます。

4. 学習の前処理

続いて学習に必要な前処理をしていきます。まずモデルの名前や学習エポック数などの各種パラメータをここで設定してきます。
またここでJP-Extraを適用することで、今回の目的である日本語特化版のモデルを使用できるようになります。

# 上でつけたフォルダの名前`Data/{model_name}/`
model_name = "your_model_name"

# JP-Extra (日本語特化版)を使うかどうか。日本語の能力が向上する代わりに英語と中国語は使えなくなります。
use_jp_extra = True

# 学習のバッチサイズ。VRAMのはみ出具合に応じて調整してください。
batch_size = 4

# 学習のエポック数(データセットを合計何周するか)。
# 100で多すぎるほどかもしれませんが、もっと多くやると質が上がるのかもしれません。
epochs = 100

# 保存頻度。何ステップごとにモデルを保存するか。分からなければデフォルトのままで。
save_every_steps = 1000

# 音声ファイルの音量を正規化するかどうか
normalize = False

# 音声ファイルの開始・終了にある無音区間を削除するかどうか
trim = False

# 読みのエラーが出た場合にどうするか。
# "raise"ならテキスト前処理が終わったら中断、"skip"なら読めない行は学習に使わない、"use"なら無理やり使う
yomi_error = "skip"

設定終了後、以下のコードで前処理を実行します。

from gradio_tabs.train import preprocess_all
from style_bert_vits2.nlp.japanese import pyopenjtalk_worker

pyopenjtalk_worker.initialize_worker()

preprocess_all(
    model_name=model_name,
    batch_size=batch_size,
    epochs=epochs,
    save_every_steps=save_every_steps,
    num_processes=2,
    normalize=normalize,
    trim=trim,
    freeze_EN_bert=False,
    freeze_JP_bert=False,
    freeze_ZH_bert=False,
    freeze_style=False,
    freeze_decoder=False,
    use_jp_extra=use_jp_extra,
    val_per_lang=0,
    log_interval=200,
    yomi_error=yomi_error,
)

5. 学習

正しく前処理が完了したら、学習に移っていきます。以下のコードで学習を実行すると上記の前処理で指定したsave_every_stepsに応じた間隔でモデルが生成されStyle-Bert-VITS2フォルダ内のmodel_assetsというフォルダに保存されていきます。こちらをローカルのStyle-Bert-VITS2フォルダにコピーすることで学習結果を使うことができます。

# 上でつけたモデル名を入力。学習を途中からする場合はきちんとモデルが保存されているフォルダ名を入力。
model_name = "your_model_name"

import yaml
from gradio_tabs.train import get_path

paths = get_path(model_name)
dataset_path = str(paths.dataset_path)
config_path = str(paths.config_path)

with open("default_config.yml", "r", encoding="utf-8") as f:
    yml_data = yaml.safe_load(f)
yml_data["model_name"] = model_name
with open("config.yml", "w", encoding="utf-8") as f:
    yaml.dump(yml_data, f, allow_unicode=True)
    
 # 日本語特化版を「使う」場合
!python train_ms_jp_extra.py --config {config_path} --model {dataset_path} --assets_root {assets_root}

使う音声ファイルの大きさにもよりますが、今回は3時間半ほどで学習が終了しました。

6. 音声合成する

いよいよ作成したモデルを使って音声を合成していきます。
以下のコードでStyle-Bert-VITS2WebUI用のURLが出力されるのでそちらに移動します。

# 学習結果を試す・マージ・スタイル分けはこちらから
!python app.py --share

デモUI

こういった画面が起動します

ここで作成したモデルやテキストを入力することでそれぞれの目的にあったカスタマイズができます。こちらが実際に合成した音声になります。

生成結果


「学習させたデータに近いか?」という観点ではかなり精度の高いものなっていますが、そもそものデータが少し機械的に聞こえるのでその特徴を学習してしまい、自然には聞こえなくなってしまっているようですね。

改善:もっと自然な音声へ


データの処理やソースコードに問題はなさそうなので、より自然な口調の音声ファイルを作成し、学習してみました。

こちらがその結果です。

かなり人の発声に近づきました。


ここからさらに質の良いデータを追加学習させていけばビジネスの場面でも活用可能なモデルの作成も期待できそうです。

まとめ


今回はStyle-Bert-VITS2JP-Extraを使って学習データを基にした音声合成を行っていきました。人の自然な会話をモデルに学習させることで本物に近い音声合成を目指すことができます。

最初に使用したデータはナレーションベースで抑揚の少ないものでしたが、「抑揚と感情の幅」が大きいほど「生成音声の安定性」は低くなり、「抑揚と感情の幅」が小さいほど「生成音声の安定性」は高くなります。

よって、学習に使用するデータ選びの段階で目的に合った適切なものを選択することも重要になってきます。

また、今回は説明を省きましたが、音声ファイルを感情別に分けてモデルを作成するスタイル分けやモデル同士を掛け合わせて新たなモデル作るモデルマージも利用可能なので、自然な抑揚を目指す上で有用なツールになるかと考えています。

以上、参考になった方はいいね、コメントをいただけると嬉しいです。応援の程よろしくお願いいたします!

参考文献


[1] Style-Bert-VITS2でずんだもんの声を学習させてみた
[2] Style-Bert-VITS2 (ver 2.6.0) のGoogle Colabでの学習
[3] Google Colab で Style-Bert-VITS2 を試す


この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?