diff --git a/README.md b/README.md index 4766e8d..c00f197 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ https://github.com/litagin02/Style-Bert-VITS2/assets/139731664/b907c1b8-43aa-46e **注意**: 上記動画のライセンス表記は誤っていました、正しくはCC BY-SA 4.0で商用利用に制限はありません。近日訂正版動画に差し替えます。 +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](http://colab.research.google.com/github/litagin02/Style-Bert-VITS2/blob/master/colab.ipynb) + Online demo: https://huggingface.co/spaces/litagin/Style-Bert-VITS2-JVNV This repository is based on [Bert-VITS2](https://github.com/fishaudio/Bert-VITS2) v2.1, so many thanks to the original author! diff --git a/colab.ipynb b/colab.ipynb new file mode 100644 index 0000000..576cb41 --- /dev/null +++ b/colab.ipynb @@ -0,0 +1,294 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Style-Bert-VITS2 (ver 1.2) のGoogle Colabでの学習\n", + "\n", + "Google driveと連携することで、Google Colab上でStyle-Bert-VITS2の学習を行うことができます。\n", + "\n", + "このnotebookでは、あなたのGoogle Driveにフォルダ`Style-Bert-VITS2`を作り、その内部での作業を行います。他のフォルダには触れません。\n", + "\n", + "## 流れ\n", + "\n", + "### 学習を最初からやりたいとき\n", + "上から順に実行していけばいいです。音声合成に必要なファイルはGoogle Driveの`Style-Bert-VITS2/model_assets/`に保存されます。また、途中経過も`Style-Bert-VITS2/Data/`に保存されるので、学習を中断したり、途中から再開することもできます。\n", + "\n", + "### 学習を途中から再開したいとき\n", + "1と2を行い、3の前処理は飛ばして、4から始めてください。\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Google Driveとの連携とデータの配置\n", + "\n", + "次のセルを実行して、Google driveと連携します。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "xzbmRmVfP29m", + "outputId": "bd492fba-3cba-4002-b6d9-f144f701fce6" + }, + "outputs": [], + "source": [ + "from google.colab import drive\n", + "drive.mount(\"/content/drive\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "次のセルを実行して、Google driveの中にStyle-Bert-VITS2フォルダと、学習データをいれるDataフォルダを作成します。" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "esCNJl704h52" + }, + "outputs": [], + "source": [ + "import os\n", + "\n", + "os.makedirs((\"/content/drive/MyDrive/Style-Bert-VITS2/Data/\"), exist_ok=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "次に、学習に必要なデータを、Google driveに作成されたStyle-Bert-VITS2/Dataフォルダに配置します。\n", + "\n", + "### データセットの準備\n", + "まず音声データ(wavファイルで1ファイルが2-12秒程度の、長すぎず短すぎない発話のものをいくつか)と、書き起こしテキストを用意してください。\n", + "\n", + "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": {}, + "source": [ + "## 2. 環境構築\n", + "\n", + "Style-Bert-VITS2の環境をcolab上に構築します。グラボモードが有効になっていることを確認し、以下のセルを順に実行してください。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "0CH9aI_MOmTA", + "outputId": "34cf1e8f-23b9-4d2b-e040-ea5a3ec44a82" + }, + "outputs": [], + "source": [ + "#@title このセルを実行して環境構築してください。\n", + "#@markdown 最後に赤文字でエラーや警告が出ても何故かうまくいくみたいです。\n", + "\n", + "!git clone https://github.com/litagin02/Style-Bert-VITS2.git\n", + "%cd Style-Bert-VITS2/\n", + "!pip install -r requirements.txt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "CpLs5YoNPe4Z", + "outputId": "0edd3309-08d1-4372-e47a-6a805a74b620" + }, + "outputs": [], + "source": [ + "#@title 必要なモデルのダウンロード\n", + "\n", + "!python initialize.py" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5r85-W20ECcr" + }, + "source": [ + "## 3. 学習の前処理\n", + "\n", + "次に学習の前処理を行います。必要なパラメータをここで指定します。次のセルに設定等を入力して実行してください。" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "id": "CXR7kjuF5GlE" + }, + "outputs": [], + "source": [ + "# 上でつけたフォルダの名前`Data/{model_name}/`\n", + "model_name = \"your_model_name\"\n", + "\n", + "# 学習のバッチサイズ。4ぐらいが最適か。VRAMのはみ出具合に応じて調整してください。\n", + "batch_size = 4\n", + "\n", + "# 学習のエポック数(データセットを合計何周するか)。100ぐらいで十分だと思われます。\n", + "epochs = 100\n", + "\n", + "# 保存頻度。何ステップごとにモデルを保存するか。分からなければデフォルトのままで。\n", + "save_every_steps = 1000\n", + "\n", + "# 音声ファイルの音量を正規化するかどうか。\n", + "normalize = True\n", + "\n", + "# 音声ファイルの開始・終了にある無音区間を削除するかどうか\n", + "trim = True" + ] + }, + { + "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 webui_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", + " bf16_run=False, # colabの無料のやつではサポートされていないようです。\n", + " num_processes=2,\n", + " normalize=normalize,\n", + " trim=trim,\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", + "from webui_train import get_path\n", + "\n", + "dataset_path, _, _, _, config_path = get_path(model_name)\n", + "!python train_ms.py --config {config_path} --model {dataset_path}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "c7g0hrdeP1Tl", + "outputId": "94f9a6f6-027f-4554-ce0c-60ac56251c22" + }, + "outputs": [], + "source": [ + "#@title 学習結果を試すならここから\n", + "!python app.py --share --dir \"/content/drive/MyDrive/Style-Bert-VITS2/model_assets/\"" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/data_utils.py b/data_utils.py index c7834e7..dc5aa44 100644 --- a/data_utils.py +++ b/data_utils.py @@ -320,9 +320,12 @@ class DistributedBucketSampler(torch.utils.data.distributed.DistributedSampler): self.buckets, self.num_samples_per_bucket = self._create_buckets() logger.info(f"Bucket info: {self.num_samples_per_bucket}") - logger.info( - f"Unused samples: {len(self.lengths) - sum(self.num_samples_per_bucket)}" - ) + # logger.info( + # f"Unused samples: {len(self.lengths) - sum(self.num_samples_per_bucket)}" + # ) + # ↑マイナスになることあるし、別にこれは使われないサンプル数ではないようだ…… + # バケットの仕組みはよく分からない + self.total_size = sum(self.num_samples_per_bucket) self.num_samples = self.total_size // self.num_replicas diff --git a/resample.py b/resample.py index 4ece450..e3d9b94 100644 --- a/resample.py +++ b/resample.py @@ -29,7 +29,6 @@ def process(item): wav = normalize_audio(wav, sr) if args.trim: wav, _ = librosa.effects.trim(wav, top_db=30) - logger.debug(f"trim: {wav_name}") soundfile.write(os.path.join(args.out_dir, spkdir, wav_name), wav, sr) diff --git a/train_ms.py b/train_ms.py index 4fe4857..5c49dfc 100644 --- a/train_ms.py +++ b/train_ms.py @@ -172,7 +172,9 @@ def run(): collate_fn = TextAudioSpeakerCollate() train_loader = DataLoader( train_dataset, - num_workers=min(config.train_ms_config.num_workers, os.cpu_count() - 1), + # num_workers=min(config.train_ms_config.num_workers, os.cpu_count() - 1), + # Slow and often freezes, so use only half of the cores. + num_workers=min(config.train_ms_config.num_workers, os.cpu_count() // 2), shuffle=False, pin_memory=True, collate_fn=collate_fn,