This commit is contained in:
litagin02
2024-05-26 08:00:32 +09:00
parent a4f28e4f6f
commit 7880659d4a
10 changed files with 881 additions and 844 deletions

View File

@@ -14,6 +14,7 @@ You can install via `pip install style-bert-vits2` (inference only), see [librar
- [**リリースページ**](https://github.com/litagin02/Style-Bert-VITS2/releases/)、[更新履歴](/docs/CHANGELOG.md)
- 2024-05-26: Ver 2.5.0 (フォルダ分けからのスタイル生成、長い音声も学習可能に)
- 2024-03-16: ver 2.4.1 (**batファイルによるインストール方法の変更**)
- 2024-03-15: ver 2.4.0 (大規模リファクタリングや種々の改良、ライブラリ化)
- 2024-02-26: ver 2.3 (辞書機能とエディター機能)

2
app.py
View File

@@ -6,11 +6,11 @@ import torch
from config import get_path_config
from gradio_tabs.dataset import create_dataset_app
from gradio_tabs.download_tab import create_download_app
from gradio_tabs.inference import create_inference_app
from gradio_tabs.merge import create_merge_app
from gradio_tabs.style_vectors import create_style_vectors_app
from gradio_tabs.train import create_train_app
from gradio_tabs.download_tab import create_download_app
from style_bert_vits2.constants import GRADIO_THEME, VERSION
from style_bert_vits2.nlp.japanese import pyopenjtalk_worker
from style_bert_vits2.nlp.japanese.user_dict import update_dict

File diff suppressed because one or more lines are too long

View File

@@ -1,384 +1,385 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Style-Bert-VITS2 (ver 2.5.0) のGoogle Colabでの学習\n",
"\n",
"Google Colab上でStyle-Bert-VITS2の学習を行うことができます。\n",
"\n",
"このnotebookでは、通常使用ではあなたのGoogle Driveにフォルダ`Style-Bert-VITS2`を作り、その内部での作業を行います。他のフォルダには触れません。\n",
"Google Driveを使わない場合は、初期設定のところで適切なパスを指定してください。\n",
"\n",
"## 流れ\n",
"\n",
"### 学習を最初からやりたいとき\n",
"上から順に実行していけばいいです。音声合成に必要なファイルはGoogle Driveの`Style-Bert-VITS2/model_assets/`に保存されます。また、途中経過も`Style-Bert-VITS2/Data/`に保存されるので、学習を中断したり、途中から再開することもできます。\n",
"\n",
"### 学習を途中から再開したいとき\n",
"0と1を行い、3の前処理は飛ばして、4から始めてください。スタイル分け5は、学習が終わったら必要なら行ってください。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 0. 環境構築\n",
"\n",
"Style-Bert-VITS2の環境をcolab上に構築します。グラボモードが有効になっていることを確認し、以下のセルを順に実行してください。\n",
"\n",
"**最近のcolabのアップデートにより、エラーダイアログ「WARNING: The following packages were previously imported in this runtime: [pydevd_plugins]」が出るが、「キャンセル」を選択して続行してください。**"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# このセルを実行して環境構築してください。\n",
"# エラーダイアログ「WARNING: The following packages were previously imported in this runtime: [pydevd_plugins]」が出るが「キャンセル」を選択して続行してください。\n",
"\n",
"!git clone https://github.com/litagin02/Style-Bert-VITS2.git\n",
"%cd Style-Bert-VITS2/\n",
"!pip install -r requirements.txt\n",
"!python initialize.py --skip_jvnv"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Google driveを使う方はこちらを実行してください。\n",
"\n",
"from google.colab import drive\n",
"drive.mount(\"/content/drive\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. 初期設定\n",
"\n",
"学習とその結果を保存するディレクトリ名を指定します。\n",
"Google driveの場合はそのまま実行、カスタマイズしたい方は変更して実行してください。"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# 学習に必要なファイルや途中経過が保存されるディレクトリ\n",
"dataset_root = \"/content/drive/MyDrive/Style-Bert-VITS2/Data\"\n",
"\n",
"# 学習結果(音声合成に必要なファイルたち)が保存されるディレクトリ\n",
"assets_root = \"/content/drive/MyDrive/Style-Bert-VITS2/model_assets\"\n",
"\n",
"import yaml\n",
"\n",
"\n",
"with open(\"configs/paths.yml\", \"w\", encoding=\"utf-8\") as f:\n",
" yaml.dump({\"dataset_root\": dataset_root, \"assets_root\": assets_root}, f)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. 学習に使うデータ準備\n",
"\n",
"すでに音声ファイル1ファイル2-12秒程度とその書き起こしデータがある場合は2.2を、ない場合は2.1を実行してください。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.1 音声ファイルからのデータセットの作成(ある人はスキップ可)\n",
"\n",
"音声ファイル1ファイル2-12秒程度とその書き起こしのデータセットを持っていない方は、日本語の音声ファイルのみから以下の手順でデータセットを作成することができます。Google drive上の`Style-Bert-VITS2/inputs/`フォルダに音声ファイルwavファイル形式、1ファイルでも複数ファイルでも可を置いて、下を実行すると、データセットが作られ、自動的に正しい場所へ配置されます。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 元となる音声ファイルwav形式を入れるディレクトリ\n",
"input_dir = \"/content/drive/MyDrive/Style-Bert-VITS2/inputs\"\n",
"# モデル名(話者名)を入力\n",
"model_name = \"your_model_name\"\n",
"\n",
"# こういうふうに書き起こして欲しいという例文(句読点の入れ方・笑い方や固有名詞等)\n",
"initial_prompt = \"こんにちは。元気、ですかー?ふふっ、私は……ちゃんと元気だよ!\"\n",
"\n",
"!python slice.py -i {input_dir} --model_name {model_name}\n",
"!python transcribe.py --model_name {model_name} --initial_prompt {initial_prompt} --use_hf_whisper"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"成功したらそのまま3へ進んでください"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.2 音声ファイルと書き起こしデータがすでにある場合\n",
"\n",
"指示に従って適切にデータセットを配置してください。\n",
"\n",
"次のセルを実行して、学習データをいれるフォルダ1で設定した`dataset_root`)を作成します。"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"id": "esCNJl704h52"
},
"outputs": [],
"source": [
"import os\n",
"\n",
"os.makedirs(dataset_root, exist_ok=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"次に、学習に必要なデータを、Google driveに作成された`Style-Bert-VITS2/Data`フォルダに配置します。\n",
"\n",
"まず音声データwavファイルで1ファイルが2-12秒程度の、長すぎず短すぎない発話のものをいくつかと、書き起こしテキストを用意してください。wavファイル名やモデルの名前は空白を含まない半角で、wavファイルの拡張子は小文字`.wav`である必要があります。\n",
"\n",
"書き起こしテキストは、次の形式で記述してください。\n",
"```\n",
"****.wav|{話者名}|{言語ID、ZHかJPかEN}|{書き起こしテキスト}\n",
"```\n",
"\n",
"例:\n",
"```\n",
"wav_number1.wav|hanako|JP|こんにちは、聞こえて、いますか?\n",
"wav_next.wav|taro|JP|はい、聞こえています……。\n",
"english_teacher.wav|Mary|EN|How are you? I'm fine, thank you, and you?\n",
"...\n",
"```\n",
"日本語話者の単一話者データセットで構いません。\n",
"\n",
"### データセットの配置\n",
"\n",
"次にモデルの名前を適当に決めてください(空白を含まない半角英数字がよいです)。\n",
"そして、書き起こしファイルを`esd.list`という名前で保存し、またwavファイルも`raw`というフォルダを作成し、あなたのGoogle Driveの中の上で自動的に作られるはずの`Data`フォルダのなかに、次のように配置します。\n",
"```\n",
"├── Data\n",
"│ ├── {モデルの名前}\n",
"│ │ ├── esd.list\n",
"│ │ ├── raw\n",
"│ │ │ ├── ****.wav\n",
"│ │ │ ├── ****.wav\n",
"│ │ │ ├── ...\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "5r85-W20ECcr"
},
"source": [
"## 3. 学習の前処理\n",
"\n",
"次に学習の前処理を行います。必要なパラメータをここで指定します。次のセルに設定等を入力して実行してください。「~~かどうか」は`True`もしくは`False`を指定してください。"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"id": "CXR7kjuF5GlE"
},
"outputs": [],
"source": [
"# 上でつけたフォルダの名前`Data/{model_name}/`\n",
"model_name = \"your_model_name\"\n",
"\n",
"# JP-Extra (日本語特化版)を使うかどうか。日本語の能力が向上する代わりに英語と中国語は使えなくなります。\n",
"use_jp_extra = True\n",
"\n",
"# 学習のバッチサイズ。VRAMのはみ出具合に応じて調整してください。\n",
"batch_size = 4\n",
"\n",
"# 学習のエポック数(データセットを合計何周するか)。\n",
"# 100で多すぎるほどかもしれませんが、もっと多くやると質が上がるのかもしれません。\n",
"epochs = 100\n",
"\n",
"# 保存頻度。何ステップごとにモデルを保存するか。分からなければデフォルトのままで。\n",
"save_every_steps = 1000\n",
"\n",
"# 音声ファイルの音量を正規化するかどうか\n",
"normalize = False\n",
"\n",
"# 音声ファイルの開始・終了にある無音区間を削除するかどうか\n",
"trim = False\n",
"\n",
"# 読みのエラーが出た場合にどうするか。\n",
"# \"raise\"ならテキスト前処理が終わったら中断、\"skip\"なら読めない行は学習に使わない、\"use\"なら無理やり使う\n",
"yomi_error = \"skip\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"上のセルが実行されたら、次のセルを実行して学習の前処理を行います。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "xMVaOIPLabV5",
"outputId": "15fac868-9132-45d9-9f5f-365b6aeb67b0"
},
"outputs": [],
"source": [
"from gradio_tabs.train import preprocess_all\n",
"\n",
"preprocess_all(\n",
" model_name=model_name,\n",
" batch_size=batch_size,\n",
" epochs=epochs,\n",
" save_every_steps=save_every_steps,\n",
" num_processes=2,\n",
" normalize=normalize,\n",
" trim=trim,\n",
" freeze_EN_bert=False,\n",
" freeze_JP_bert=False,\n",
" freeze_ZH_bert=False,\n",
" freeze_style=False,\n",
" freeze_decoder=False, # ここをTrueにするともしかしたら違う結果になるかもしれません。\n",
" use_jp_extra=use_jp_extra,\n",
" val_per_lang=0,\n",
" log_interval=200,\n",
" yomi_error=yomi_error\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4. 学習\n",
"\n",
"前処理が正常に終わったら、学習を行います。次のセルを実行すると学習が始まります。\n",
"\n",
"学習の結果は、上で指定した`save_every_steps`の間隔で、Google Driveの中の`Style-Bert-VITS2/Data/{モデルの名前}/model_assets/`フォルダに保存されます。\n",
"\n",
"このフォルダをダウンロードし、ローカルのStyle-Bert-VITS2の`model_assets`フォルダに上書きすれば、学習結果を使うことができます。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "laieKrbEb6Ij",
"outputId": "72238c88-f294-4ed9-84f6-84c1c17999ca"
},
"outputs": [],
"source": [
"# 上でつけたモデル名を入力。学習を途中からする場合はきちんとモデルが保存されているフォルダ名を入力。\n",
"model_name = \"your_model_name\"\n",
"\n",
"\n",
"import yaml\n",
"from gradio_tabs.train import get_path\n",
"\n",
"dataset_path, _, _, _, config_path = get_path(model_name)\n",
"\n",
"with open(\"default_config.yml\", \"r\", encoding=\"utf-8\") as f:\n",
" yml_data = yaml.safe_load(f)\n",
"yml_data[\"model_name\"] = model_name\n",
"with open(\"config.yml\", \"w\", encoding=\"utf-8\") as f:\n",
" yaml.dump(yml_data, f, allow_unicode=True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 日本語特化版を「使う」場合\n",
"!python train_ms_jp_extra.py --config {config_path} --model {dataset_path} --assets_root {assets_root}"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 日本語特化版を「使わない」場合\n",
"!python train_ms.py --config {config_path} --model {dataset_path} --assets_root {assets_root}"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "c7g0hrdeP1Tl",
"outputId": "94f9a6f6-027f-4554-ce0c-60ac56251c22"
},
"outputs": [],
"source": [
"# 学習結果を試す・マージ・スタイル分けはこちらから\n",
"!python app.py --share"
]
}
],
"metadata": {
"accelerator": "GPU",
"colab": {
"gpuType": "T4",
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.11"
}
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Style-Bert-VITS2 (ver 2.5.0) のGoogle Colabでの学習\n",
"\n",
"Google Colab上でStyle-Bert-VITS2の学習を行うことができます。\n",
"\n",
"このnotebookでは、通常使用ではあなたのGoogle Driveにフォルダ`Style-Bert-VITS2`を作り、その内部での作業を行います。他のフォルダには触れません。\n",
"Google Driveを使わない場合は、初期設定のところで適切なパスを指定してください。\n",
"\n",
"## 流れ\n",
"\n",
"### 学習を最初からやりたいとき\n",
"上から順に実行していけばいいです。音声合成に必要なファイルはGoogle Driveの`Style-Bert-VITS2/model_assets/`に保存されます。また、途中経過も`Style-Bert-VITS2/Data/`に保存されるので、学習を中断したり、途中から再開することもできます。\n",
"\n",
"### 学習を途中から再開したいとき\n",
"0と1を行い、3の前処理は飛ばして、4から始めてください。スタイル分け5は、学習が終わったら必要なら行ってください。\n"
]
},
"nbformat": 4,
"nbformat_minor": 0
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 0. 環境構築\n",
"\n",
"Style-Bert-VITS2の環境をcolab上に構築します。グラボモードが有効になっていることを確認し、以下のセルを順に実行してください。\n",
"\n",
"**最近のcolabのアップデートにより、エラーダイアログ「WARNING: The following packages were previously imported in this runtime: [pydevd_plugins]」が出るが、「キャンセル」を選択して続行してください。**"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# このセルを実行して環境構築してください。\n",
"# エラーダイアログ「WARNING: The following packages were previously imported in this runtime: [pydevd_plugins]」が出るが「キャンセル」を選択して続行してください。\n",
"\n",
"!git clone https://github.com/litagin02/Style-Bert-VITS2.git\n",
"%cd Style-Bert-VITS2/\n",
"!pip install -r requirements.txt\n",
"!python initialize.py --skip_jvnv"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Google driveを使う方はこちらを実行してください。\n",
"\n",
"from google.colab import drive\n",
"\n",
"drive.mount(\"/content/drive\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. 初期設定\n",
"\n",
"学習とその結果を保存するディレクトリ名を指定します。\n",
"Google driveの場合はそのまま実行、カスタマイズしたい方は変更して実行してください。"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# 学習に必要なファイルや途中経過が保存されるディレクトリ\n",
"dataset_root = \"/content/drive/MyDrive/Style-Bert-VITS2/Data\"\n",
"\n",
"# 学習結果(音声合成に必要なファイルたち)が保存されるディレクトリ\n",
"assets_root = \"/content/drive/MyDrive/Style-Bert-VITS2/model_assets\"\n",
"\n",
"import yaml\n",
"\n",
"\n",
"with open(\"configs/paths.yml\", \"w\", encoding=\"utf-8\") as f:\n",
" yaml.dump({\"dataset_root\": dataset_root, \"assets_root\": assets_root}, f)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. 学習に使うデータ準備\n",
"\n",
"すでに音声ファイル1ファイル2-12秒程度とその書き起こしデータがある場合は2.2を、ない場合は2.1を実行してください。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.1 音声ファイルからのデータセットの作成(ある人はスキップ可)\n",
"\n",
"音声ファイル1ファイル2-12秒程度とその書き起こしのデータセットを持っていない方は、日本語の音声ファイルのみから以下の手順でデータセットを作成することができます。Google drive上の`Style-Bert-VITS2/inputs/`フォルダに音声ファイルwavファイル形式、1ファイルでも複数ファイルでも可を置いて、下を実行すると、データセットが作られ、自動的に正しい場所へ配置されます。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 元となる音声ファイルwav形式を入れるディレクトリ\n",
"input_dir = \"/content/drive/MyDrive/Style-Bert-VITS2/inputs\"\n",
"# モデル名(話者名)を入力\n",
"model_name = \"your_model_name\"\n",
"\n",
"# こういうふうに書き起こして欲しいという例文(句読点の入れ方・笑い方や固有名詞等)\n",
"initial_prompt = \"こんにちは。元気、ですかー?ふふっ、私は……ちゃんと元気だよ!\"\n",
"\n",
"!python slice.py -i {input_dir} --model_name {model_name}\n",
"!python transcribe.py --model_name {model_name} --initial_prompt {initial_prompt} --use_hf_whisper"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"成功したらそのまま3へ進んでください"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.2 音声ファイルと書き起こしデータがすでにある場合\n",
"\n",
"指示に従って適切にデータセットを配置してください。\n",
"\n",
"次のセルを実行して、学習データをいれるフォルダ1で設定した`dataset_root`)を作成します。"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"id": "esCNJl704h52"
},
"outputs": [],
"source": [
"import os\n",
"\n",
"os.makedirs(dataset_root, exist_ok=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"次に、学習に必要なデータを、Google driveに作成された`Style-Bert-VITS2/Data`フォルダに配置します。\n",
"\n",
"まず音声データwavファイルで1ファイルが2-12秒程度の、長すぎず短すぎない発話のものをいくつかと、書き起こしテキストを用意してください。wavファイル名やモデルの名前は空白を含まない半角で、wavファイルの拡張子は小文字`.wav`である必要があります。\n",
"\n",
"書き起こしテキストは、次の形式で記述してください。\n",
"```\n",
"****.wav|{話者名}|{言語ID、ZHかJPかEN}|{書き起こしテキスト}\n",
"```\n",
"\n",
"例:\n",
"```\n",
"wav_number1.wav|hanako|JP|こんにちは、聞こえて、いますか?\n",
"wav_next.wav|taro|JP|はい、聞こえています……。\n",
"english_teacher.wav|Mary|EN|How are you? I'm fine, thank you, and you?\n",
"...\n",
"```\n",
"日本語話者の単一話者データセットで構いません。\n",
"\n",
"### データセットの配置\n",
"\n",
"次にモデルの名前を適当に決めてください(空白を含まない半角英数字がよいです)。\n",
"そして、書き起こしファイルを`esd.list`という名前で保存し、またwavファイルも`raw`というフォルダを作成し、あなたのGoogle Driveの中の上で自動的に作られるはずの`Data`フォルダのなかに、次のように配置します。\n",
"```\n",
"├── Data\n",
"│ ├── {モデルの名前}\n",
"│ │ ├── esd.list\n",
"│ │ ├── raw\n",
"│ │ │ ├── ****.wav\n",
"│ │ │ ├── ****.wav\n",
"│ │ │ ├── ...\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "5r85-W20ECcr"
},
"source": [
"## 3. 学習の前処理\n",
"\n",
"次に学習の前処理を行います。必要なパラメータをここで指定します。次のセルに設定等を入力して実行してください。「~~かどうか」は`True`もしくは`False`を指定してください。"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"id": "CXR7kjuF5GlE"
},
"outputs": [],
"source": [
"# 上でつけたフォルダの名前`Data/{model_name}/`\n",
"model_name = \"your_model_name\"\n",
"\n",
"# JP-Extra (日本語特化版)を使うかどうか。日本語の能力が向上する代わりに英語と中国語は使えなくなります。\n",
"use_jp_extra = True\n",
"\n",
"# 学習のバッチサイズ。VRAMのはみ出具合に応じて調整してください。\n",
"batch_size = 4\n",
"\n",
"# 学習のエポック数(データセットを合計何周するか)。\n",
"# 100で多すぎるほどかもしれませんが、もっと多くやると質が上がるのかもしれません。\n",
"epochs = 100\n",
"\n",
"# 保存頻度。何ステップごとにモデルを保存するか。分からなければデフォルトのままで。\n",
"save_every_steps = 1000\n",
"\n",
"# 音声ファイルの音量を正規化するかどうか\n",
"normalize = False\n",
"\n",
"# 音声ファイルの開始・終了にある無音区間を削除するかどうか\n",
"trim = False\n",
"\n",
"# 読みのエラーが出た場合にどうするか。\n",
"# \"raise\"ならテキスト前処理が終わったら中断、\"skip\"なら読めない行は学習に使わない、\"use\"なら無理やり使う\n",
"yomi_error = \"skip\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"上のセルが実行されたら、次のセルを実行して学習の前処理を行います。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "xMVaOIPLabV5",
"outputId": "15fac868-9132-45d9-9f5f-365b6aeb67b0"
},
"outputs": [],
"source": [
"from gradio_tabs.train import preprocess_all\n",
"\n",
"preprocess_all(\n",
" model_name=model_name,\n",
" batch_size=batch_size,\n",
" epochs=epochs,\n",
" save_every_steps=save_every_steps,\n",
" num_processes=2,\n",
" normalize=normalize,\n",
" trim=trim,\n",
" freeze_EN_bert=False,\n",
" freeze_JP_bert=False,\n",
" freeze_ZH_bert=False,\n",
" freeze_style=False,\n",
" freeze_decoder=False, # ここをTrueにするともしかしたら違う結果になるかもしれません。\n",
" use_jp_extra=use_jp_extra,\n",
" val_per_lang=0,\n",
" log_interval=200,\n",
" yomi_error=yomi_error,\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 4. 学習\n",
"\n",
"前処理が正常に終わったら、学習を行います。次のセルを実行すると学習が始まります。\n",
"\n",
"学習の結果は、上で指定した`save_every_steps`の間隔で、Google Driveの中の`Style-Bert-VITS2/Data/{モデルの名前}/model_assets/`フォルダに保存されます。\n",
"\n",
"このフォルダをダウンロードし、ローカルのStyle-Bert-VITS2の`model_assets`フォルダに上書きすれば、学習結果を使うことができます。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "laieKrbEb6Ij",
"outputId": "72238c88-f294-4ed9-84f6-84c1c17999ca"
},
"outputs": [],
"source": [
"# 上でつけたモデル名を入力。学習を途中からする場合はきちんとモデルが保存されているフォルダ名を入力。\n",
"model_name = \"your_model_name\"\n",
"\n",
"\n",
"import yaml\n",
"from gradio_tabs.train import get_path\n",
"\n",
"dataset_path, _, _, _, config_path = get_path(model_name)\n",
"\n",
"with open(\"default_config.yml\", \"r\", encoding=\"utf-8\") as f:\n",
" yml_data = yaml.safe_load(f)\n",
"yml_data[\"model_name\"] = model_name\n",
"with open(\"config.yml\", \"w\", encoding=\"utf-8\") as f:\n",
" yaml.dump(yml_data, f, allow_unicode=True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 日本語特化版を「使う」場合\n",
"!python train_ms_jp_extra.py --config {config_path} --model {dataset_path} --assets_root {assets_root}"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 日本語特化版を「使わない」場合\n",
"!python train_ms.py --config {config_path} --model {dataset_path} --assets_root {assets_root}"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "c7g0hrdeP1Tl",
"outputId": "94f9a6f6-027f-4554-ce0c-60ac56251c22"
},
"outputs": [],
"source": [
"# 学習結果を試す・マージ・スタイル分けはこちらから\n",
"!python app.py --share"
]
}
],
"metadata": {
"accelerator": "GPU",
"colab": {
"gpuType": "T4",
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.11"
}
},
"nbformat": 4,
"nbformat_minor": 0
}

View File

@@ -1,5 +1,22 @@
# Changelog
## v2.5.0 (2024-05-26)
WIP
### 改善
- 音声データをスタイルごとにフォルダ分けしておくことで、そのフォルダごとのスタイルを学習時に自動的に作成するように
- 上の改善を既存モデルでも使えるようなスタイル作成の機能追加。具体的には、フォルダ分けされた音声ファイルのディレクトリを任意に指定し、そのフォルダ分けを使って既存のモデルのスタイルの作成が可能に
- Hugging Face 🤗 に公開されているSBV2のモデルを、URLを指定すると自動でダウンロードして音声合成に使えるようにする機能の追加
- **ライブラリとしてのみ**)依存関係の軽量化、音声合成時に読み上げテキストの読みを表す音素列を指定する機能を追加 + 様々な改善 ([tsukumijimaさん](https://github.com/tsukumijima)による[プルリク](https://github.com/litagin02/Style-Bert-VITS2/pull/118)です、ありがとうございます!)
### バグ修正
- Gradioのアップデートにより、モデル選択時等に`TypeError: Type is not JSON serializable: WindowsPath`のようなエラーが出る問題を修正
- TensorboardをWebUIから立ち上げた際にエラーが出る問題の修正 ([#129](https://github.com/litagin02/Style-Bert-VITS2/issues/129))
## v2.4.1 (2024-03-16)
**batファイルでのインストール・アップデート方法の変更**(それ以外の変更はありません)

View File

@@ -86,7 +86,7 @@ Style-Bert-VITS2の学習用データセットを作成するためのツール
## 必要なもの
学習したい音声が入ったwavファイルいくつか。
学習したい音声が入った音声ファイルいくつか形式はwav以外でも通常の音声ファイル形式なら可能
合計時間がある程度はあったほうがいいかも、10分とかでも大丈夫だったとの報告あり。単一ファイルでも良いし複数ファイルでもよい。
## スライス使い方
@@ -102,9 +102,8 @@ Style-Bert-VITS2の学習用データセットを作成するためのツール
## 注意
- 長すぎる秒数12-15秒くらいより長いのwavファイルは学習に用いられないようです。また短すぎてもあまりよくない可能性もあります。
- ~~長すぎる秒数12-15秒くらいより長いのwavファイルは学習に用いられないようです。また短すぎてもあまりよくない可能性もあります。~~ この制限はVer 2.5でなくなりましたが、長すぎる音声があるとVRAM消費量が増えたりするので、適度な長さにスライスすることをおすすめします。
- 書き起こしの結果をどれだけ修正すればいいかはデータセットに依存しそうです。
- 手動で書き起こしをいろいろ修正したり結果を細かく確認したい場合は、[Aivis Dataset](https://github.com/litagin02/Aivis-Dataset)もおすすめします。書き起こし部分もかなり工夫されています。ですがファイル数が多い場合などは、このツールで簡易的に切り出してデータセットを作るだけでも十分という気もしています。
"""

View File

@@ -4,6 +4,7 @@ import gradio as gr
from huggingface_hub import snapshot_download
from config import get_path_config
from style_bert_vits2.logging import logger
assets_root = get_path_config().assets_root
@@ -11,17 +12,18 @@ assets_root = get_path_config().assets_root
how_to_md = """
## 使い方
Hugging Face 🤗 に公開されているモデルをダウンロードして音声合成で使えるようにします。
学習済みモデルの共有サイト Hugging Face 🤗 に公開されているモデルをダウンロードして音声合成で使えるようにします。
例:
- `https://huggingface.co/username/my_sbv2_model`を指定すると、`model_assets/username-my_sbv2_model`に全体がダウンロードされます。
- `https://huggingface.co/username/my_sbv2_models/tree/main/model1`を指定すると、`model_assets/username-my_sbv2_models/model1`に`model1`フォルダのみがダウンロードされますこの場合、model1フォルダ
- `https://huggingface.co/username/my_sbv2_models/tree/main/model1`を指定すると、`model_assets/username-my_sbv2_models-model1`に`model1`フォルダがダウンロードされます。
**注意**
- 音声合成で使うには、`model_assets/{model_name}`の**直下**に`*.safetensors`ファイルと`config.json`ファイルと`style_vectors.npy`ファイルが必要です。特にリポジトリの構成は確認しないので、ダウンロード後に必要ならば再配置等を行ってください
- リポジトリの内容はチェックしませんので、ダウンロードする前にURLにアクセスしてリポジトリの内容を確認してください。怪しいURLは入力しないでください。
- **必ずモデルの利用には(掲載があれば)利用規約を確認してください。** ダウンロード後にREADMEファイルが下記に表示されます
- 音声合成で使うには、`model_assets/{model_name}`の**直下**に`*.safetensors`ファイルと`config.json`ファイルと`style_vectors.npy`ファイルが必要です。特にリポジトリの構成は確認しないので、ダウンロード後に確認し、必要ならば再配置を行ってください。
- 内容はチェックしませんので、**ダウンロードする前にURLにアクセスして中身を必ず確認**してください。怪しいURLは入力しないでください。
"""
@@ -32,6 +34,7 @@ def download_model(url: str):
# repo_id = "username/myrepo"
repo_id = url.split("https://huggingface.co/")[1].split("/tree/main")[0]
if len(repo_id.split("/")) != 2:
logger.error(f"Invalid URL: {url}")
return "Error: URLが不正です。"
# repo_folder = "jvnv-F1-jp"
repo_folder = url.split("/tree/main/")[-1] if "/tree/main/" in url else ""
@@ -41,24 +44,41 @@ def download_model(url: str):
if repo_folder == "":
model_name = repo_id.replace("/", "-")
local_dir = assets_root / model_name
logger.info(f"Downloading {repo_id} to {local_dir}")
result = snapshot_download(repo_id, local_dir=local_dir)
else:
model_name = repo_id.replace("/", "-") + "-" + repo_folder.split("/")[-1]
local_dir = assets_root / model_name
logger.info(f"Downloading {repo_id}/{repo_folder} to {local_dir}")
result = snapshot_download(
repo_id,
local_dir=local_dir,
allow_patterns=[repo_folder + "/*"],
)
# Move the downloaded folder to the correct path
for item in (assets_root / model_name / repo_folder).iterdir():
shutil.move(item, assets_root / model_name)
shutil.copytree(
assets_root / model_name / repo_folder, local_dir, dirs_exist_ok=True
)
shutil.rmtree(assets_root / model_name / repo_folder.split("/")[0])
# try to download README.md
try:
snapshot_download(
repo_id,
local_dir=local_dir,
allow_patterns=["README.md"],
)
# README.mdの中身を表示
with open(local_dir / "README.md", encoding="utf-8") as f:
readme = f.read()
except Exception as e:
logger.warning(f"README.md not found: {e}")
readme = "README.mdが見つかりませんでした。"
# Remove local_dir/.huggingface
hf_dir = local_dir / ".huggingface"
if hf_dir.exists():
shutil.rmtree(local_dir / ".huggingface")
return f"ダウンロード完了: {result}"
return f"保存完了。フォルダ:\n{result}", readme
def create_download_app() -> gr.Blocks:
@@ -68,8 +88,11 @@ def create_download_app() -> gr.Blocks:
label="URL", placeholder="https://huggingface.co/username/myrepo"
)
btn = gr.Button("ダウンロード")
info = gr.Textbox(label="情報", value="")
btn.click(download_model, inputs=[url], outputs=[info])
info = gr.Markdown("ダウンロード結果")
md = gr.Markdown(
label="README.mdファイル", value="ここにREADME.mdがあれば表示されます。"
)
btn.click(download_model, inputs=[url], outputs=[info, md])
return app

View File

@@ -1,138 +1,134 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Style-Bert-VITS2ライブラリの使用例\n",
"\n",
"`pip install style-bert-vits2`を使った、jupyter notebookでの使用例です。Google colab等でも動きます。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# PyTorch環境の構築ない場合\n",
"# 参照: https://pytorch.org/get-started/locally/\n",
"\n",
"!pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "LLrngKcQEAyP"
},
"outputs": [],
"source": [
"# style-bert-vits2のインストール\n",
"\n",
"!pip install style-bert-vits2"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "9xRtfUg5EZkx"
},
"outputs": [],
"source": [
"# BERTモデルをロードローカルに手動でダウンロードする必要はありません\n",
"\n",
"from style_bert_vits2.nlp import bert_models\n",
"from style_bert_vits2.constants import Languages\n",
"\n",
"\n",
"bert_models.load_model(Languages.JP, \"ku-nlp/deberta-v2-large-japanese-char-wwm\")\n",
"bert_models.load_tokenizer(Languages.JP, \"ku-nlp/deberta-v2-large-japanese-char-wwm\")\n",
"# bert_models.load_model(Languages.EN, \"microsoft/deberta-v3-large\")\n",
"# bert_models.load_tokenizer(Languages.EN, \"microsoft/deberta-v3-large\")\n",
"# bert_models.load_model(Languages.ZH, \"hfl/chinese-roberta-wwm-ext-large\")\n",
"# bert_models.load_tokenizer(Languages.ZH, \"hfl/chinese-roberta-wwm-ext-large\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "q2V9d3HyFAr_"
},
"outputs": [],
"source": [
"# Hugging Faceから試しにデフォルトモデルをダウンロードしてみて、それを音声合成に使ってみる\n",
"# model_assetsディレクトリにダウンロードされます\n",
"\n",
"from pathlib import Path\n",
"from huggingface_hub import hf_hub_download\n",
"\n",
"\n",
"model_file = \"jvnv-F1-jp/jvnv-F1-jp_e160_s14000.safetensors\"\n",
"config_file = \"jvnv-F1-jp/config.json\"\n",
"style_file = \"jvnv-F1-jp/style_vectors.npy\"\n",
"\n",
"for file in [model_file, config_file, style_file]:\n",
" print(file)\n",
" hf_hub_download(\n",
" \"litagin/style_bert_vits2_jvnv\",\n",
" file,\n",
" local_dir=\"model_assets\"\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "hJa31MEUFhe4"
},
"outputs": [],
"source": [
"# 上でダウンロードしたモデルファイルを指定して音声合成のテスト\n",
"\n",
"from style_bert_vits2.tts_model import TTSModel\n",
"\n",
"assets_root = Path(\"model_assets\")\n",
"\n",
"model = TTSModel(\n",
" model_path=assets_root / model_file,\n",
" config_path=assets_root / config_file,\n",
" style_vec_path=assets_root / style_file,\n",
" device=\"cpu\"\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "Gal0tqrtGXZx"
},
"outputs": [],
"source": [
"from IPython.display import Audio, display\n",
"\n",
"sr, audio = model.infer(text=\"こんにちは\")\n",
"display(Audio(audio, rate=sr))"
]
}
],
"metadata": {
"colab": {
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
}
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Style-Bert-VITS2ライブラリの使用例\n",
"\n",
"`pip install style-bert-vits2`を使った、jupyter notebookでの使用例です。Google colab等でも動きます。"
]
},
"nbformat": 4,
"nbformat_minor": 0
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# PyTorch環境の構築ない場合\n",
"# 参照: https://pytorch.org/get-started/locally/\n",
"\n",
"!pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "LLrngKcQEAyP"
},
"outputs": [],
"source": [
"# style-bert-vits2のインストール\n",
"\n",
"!pip install style-bert-vits2"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "9xRtfUg5EZkx"
},
"outputs": [],
"source": [
"# BERTモデルをロードローカルに手動でダウンロードする必要はありません\n",
"\n",
"from style_bert_vits2.nlp import bert_models\n",
"from style_bert_vits2.constants import Languages\n",
"\n",
"\n",
"bert_models.load_model(Languages.JP, \"ku-nlp/deberta-v2-large-japanese-char-wwm\")\n",
"bert_models.load_tokenizer(Languages.JP, \"ku-nlp/deberta-v2-large-japanese-char-wwm\")\n",
"# bert_models.load_model(Languages.EN, \"microsoft/deberta-v3-large\")\n",
"# bert_models.load_tokenizer(Languages.EN, \"microsoft/deberta-v3-large\")\n",
"# bert_models.load_model(Languages.ZH, \"hfl/chinese-roberta-wwm-ext-large\")\n",
"# bert_models.load_tokenizer(Languages.ZH, \"hfl/chinese-roberta-wwm-ext-large\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "q2V9d3HyFAr_"
},
"outputs": [],
"source": [
"# Hugging Faceから試しにデフォルトモデルをダウンロードしてみて、それを音声合成に使ってみる\n",
"# model_assetsディレクトリにダウンロードされます\n",
"\n",
"from pathlib import Path\n",
"from huggingface_hub import hf_hub_download\n",
"\n",
"\n",
"model_file = \"jvnv-F1-jp/jvnv-F1-jp_e160_s14000.safetensors\"\n",
"config_file = \"jvnv-F1-jp/config.json\"\n",
"style_file = \"jvnv-F1-jp/style_vectors.npy\"\n",
"\n",
"for file in [model_file, config_file, style_file]:\n",
" print(file)\n",
" hf_hub_download(\"litagin/style_bert_vits2_jvnv\", file, local_dir=\"model_assets\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "hJa31MEUFhe4"
},
"outputs": [],
"source": [
"# 上でダウンロードしたモデルファイルを指定して音声合成のテスト\n",
"\n",
"from style_bert_vits2.tts_model import TTSModel\n",
"\n",
"assets_root = Path(\"model_assets\")\n",
"\n",
"model = TTSModel(\n",
" model_path=assets_root / model_file,\n",
" config_path=assets_root / config_file,\n",
" style_vec_path=assets_root / style_file,\n",
" device=\"cpu\",\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "Gal0tqrtGXZx"
},
"outputs": [],
"source": [
"from IPython.display import Audio, display\n",
"\n",
"sr, audio = model.infer(text=\"こんにちは\")\n",
"display(Audio(audio, rate=sr))"
]
}
],
"metadata": {
"colab": {
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 0
}

View File

@@ -78,7 +78,7 @@ cov = ["test-cov", "cov-report"]
[tool.hatch.envs.style]
detached = true
dependencies = ["black", "isort"]
dependencies = ["black[jupyter]", "isort"]
[tool.hatch.envs.style.scripts]
check = [
"black --check --diff .",

View File

@@ -15,7 +15,7 @@ from style_bert_vits2.utils.stdout_wrapper import SAFE_STDOUT
def is_audio_file(file: Path) -> bool:
supported_extensions = [".wav", ".flac", ".mp3", ".ogg", ".opus"]
supported_extensions = [".wav", ".flac", ".mp3", ".ogg", ".opus", ".m4a"]
return file.suffix.lower() in supported_extensions