diff --git a/data_utils.py b/data_utils.py index 4121e35..96eab38 100644 --- a/data_utils.py +++ b/data_utils.py @@ -71,16 +71,16 @@ class TextAudioSpeakerLoader(torch.utils.data.Dataset): self.audiopaths_sid_text, file=sys.stdout ): audiopath = f"{_id}" - if self.min_text_len <= len(phones) and len(phones) <= self.max_text_len: - phones = phones.split(" ") - tone = [int(i) for i in tone.split(" ")] - word2ph = [int(i) for i in word2ph.split(" ")] - audiopaths_sid_text_new.append( - [audiopath, spk, language, text, phones, tone, word2ph] - ) - lengths.append(os.path.getsize(audiopath) // (2 * self.hop_length)) - else: - skipped += 1 + # if self.min_text_len <= len(phones) and len(phones) <= self.max_text_len: + phones = phones.split(" ") + tone = [int(i) for i in tone.split(" ")] + word2ph = [int(i) for i in word2ph.split(" ")] + audiopaths_sid_text_new.append( + [audiopath, spk, language, text, phones, tone, word2ph] + ) + lengths.append(os.path.getsize(audiopath) // (2 * self.hop_length)) + # else: + # skipped += 1 logger.info( "skipped: " + str(skipped) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 3a2818f..26c194c 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,15 +2,35 @@ ## v2.5.0 (2024-05-26) -WIP +このバージョンから[利用規約](/docs/TERMS_OF_USE.md)が追加されました。ご利用の際は必ずお読みください。 -### 改善 +### 新機能等 -- 音声データをスタイルごとにフォルダ分けしておくことで、そのフォルダごとのスタイルを学習時に自動的に作成するように -- 上の改善を既存モデルでも使えるようなスタイル作成の機能追加。具体的には、フォルダ分けされた音声ファイルのディレクトリを任意に指定し、そのフォルダ分けを使って既存のモデルのスタイルの作成が可能に -- Hugging Face 🤗 に公開されているSBV2のモデルを、URLを指定すると自動でダウンロードして音声合成に使えるようにする機能の追加 +- デフォルトモデルに [あみたろの声素材工房](https://amitaro.net/) のあみたろ様が公開しているコーパスを利用して学習した**小春音アミ**モデルを追加(あみたろ様には事前に連絡して許諾を得ています) + - アプデの場合は新たに`App.bat`や`Editor.bat`を起動した際に自動でダウンロードされます +- 英語の音声合成の速度向上([gordon0414](https://github.com/gordon0414)さんによる[PR](https://github.com/litagin02/Style-Bert-VITS2/pull/124)です、ありがとうございます!) +- Hugging Face 🤗 に投稿されているモデルをダウンロードして音声合成に利用できるタブをWebUIに追加 +- エディターの各種機能改善(多くが[kamexy](https://github.com/kamexy)様による[エディターリポジトリ](https://github.com/litagin02/Style-Bert-VITS2-Editor)へのプルリク群です、ありがとうございます!) + - 選択した行の下に新規の行を作成できるように + - 日本語変換のエンターで音声合成が走るバグの修正 + - ペースト時に改行を含まない場合は通常のペーストの振る舞いになるように修正 +- 学習時に音声データをスタイルごとにフォルダ分けしておくことで、そのフォルダごとのスタイルを学習時に自動的に作成するように + - `inputs`からスライスして使う場合は`inputs`直下に作りたいスタイルだけサブフォルダを作りそこに音声ファイルを配置 + - `Data/モデル名/raw`から使う場合も`raw`直下に同様に配置 + - サブフォルダの個数が0または1の場合は、今まで通りのNeutralスタイルのみが作成されます + + +### その他の改善 + +- 上のスタイル自動作成機能を既存モデルでも使えるような機能追加。具体的には、スタイル作成タブにて、フォルダ分けされた音声ファイルのディレクトリを任意に指定し、そのフォルダ分けを使って既存のモデルのスタイルの作成が可能に +- 音声書き起こしに[kotoba-whisper](https://huggingface.co/kotoba-tech/kotoba-whisper-v1.1)を追加 +- 音声書き起こし時にHugging FaceのWhisperモデルを使う際に、書き起こしを順次保存するように改善 - (**ライブラリとしてのみ**)依存関係の軽量化、音声合成時に読み上げテキストの読みを表す音素列を指定する機能を追加 + 様々な改善 ([tsukumijimaさん](https://github.com/tsukumijima)による[プルリク](https://github.com/litagin02/Style-Bert-VITS2/pull/118)です、ありがとうございます!) +### 内部変更 + +- これまでpath管理に`configs/paths.yml`を使っていたが、`configs/default_paths.yml`にリネームし、`configs/paths.yml`はgitの管理対象外に変更 + ### バグ修正 - Gradioのアップデートにより、モデル選択時等に`TypeError: Type is not JSON serializable: WindowsPath`のようなエラーが出る問題を修正 diff --git a/gradio_tabs/dataset.py b/gradio_tabs/dataset.py index f6ad278..5971f62 100644 --- a/gradio_tabs/dataset.py +++ b/gradio_tabs/dataset.py @@ -47,6 +47,7 @@ def do_transcribe( use_hf_whisper, batch_size, num_beams, + hf_repo_id, ): if model_name == "": return "Error: モデル名を入力してください。" @@ -71,9 +72,12 @@ def do_transcribe( if use_hf_whisper: cmd.append("--use_hf_whisper") cmd.extend(["--batch_size", str(batch_size)]) - success, message = run_script_with_log(cmd) + if hf_repo_id != "openai/whisper": + cmd.extend(["--hf_repo_id", hf_repo_id]) + success, message = run_script_with_log(cmd, ignore_warning=True) if not success: return f"Error: {message}. エラーメッセージが空の場合、何も問題がない可能性があるので、書き起こしファイルをチェックして問題なければ無視してください。" + return "音声の文字起こしが完了しました。" how_to_md = """ @@ -170,6 +174,12 @@ def create_dataset_app() -> gr.Blocks: use_hf_whisper = gr.Checkbox( label="HuggingFaceのWhisperを使う(速度が速いがVRAMを多く使う)", ) + hf_repo_id = gr.Dropdown( + ["openai/whisper", "kotoba-tech/kotoba-whisper-v1.1"], + label="HuggingFaceのWhisperモデル", + value="openai/whisper", + visible=False, + ) compute_type = gr.Dropdown( [ "int8", @@ -234,17 +244,19 @@ def create_dataset_app() -> gr.Blocks: use_hf_whisper, batch_size, num_beams, + hf_repo_id, ], outputs=[result2], ) use_hf_whisper.change( lambda x: ( + gr.update(visible=x), gr.update(visible=x), gr.update(visible=not x), gr.update(visible=not x), ), inputs=[use_hf_whisper], - outputs=[batch_size, compute_type, device], + outputs=[hf_repo_id, batch_size, compute_type, device], ) return app diff --git a/gradio_tabs/style_vectors.py b/gradio_tabs/style_vectors.py index ad57626..4aa7bc2 100644 --- a/gradio_tabs/style_vectors.py +++ b/gradio_tabs/style_vectors.py @@ -278,7 +278,11 @@ def save_style_vectors_from_files( def save_style_vectors_by_dirs(model_name: str, audio_dir_str: str): - import sys + if model_name == "": + return "モデル名を入力してください。" + if audio_dir_str == "": + return "音声ファイルが入っているディレクトリを入力してください。" + from concurrent.futures import ThreadPoolExecutor from multiprocessing import cpu_count @@ -349,7 +353,7 @@ method0 = """ **注意** -- Ver 2.5.0以降では、raw/フォルダにサブディレクトリに分けて音声ファイルを入れるだけで、スタイルベクトルが自動で作成されるので、この手順は不要です。 +- Ver 2.5.0以降では、`inputs/`フォルダや`raw/`フォルダにサブディレクトリに分けて音声ファイルを入れるだけで、スタイルベクトルが自動で作成されるので、この手順は不要です。 - それ未満のバージョンで学習したモデルに新しくスタイルベクトルをつけたい場合や、学習に使ったのとは別の音声でスタイルベクトルを作成したい場合に使います。 - 学習との整合性のため、もし**現在学習中や、今後学習する予定がある場合は**、音声ファイルは、`Data/{モデル名}/wavs`フォルダではなく**新しい別のディレクトリに保存してください**。 diff --git a/gradio_tabs/train.py b/gradio_tabs/train.py index f83d30b..4107845 100644 --- a/gradio_tabs/train.py +++ b/gradio_tabs/train.py @@ -405,6 +405,15 @@ def run_tensorboard(model_name: str): yield gr.Button("Tensorboardを開く") +change_log_md = """ +**Ver 2.5以降の変更点** + +- `raw/`フォルダの中で音声をサブディレクトリに分けて配置することで、自動的にスタイルが作成されるようになりました。詳細は下の「使い方/データの前準備」を参照してください。 +- これまでは1ファイルあたり14秒程度を超えた音声ファイルは学習には用いられていませんでしたが、Ver 2.5以降ではその制限がなくなりました。ただし: + - 音声ファイルが長い場合の学習効率は悪いかもしれず、挙動も確認していません + - この変更で要求VRAMが増えるので、学習に失敗したりVRAM不足になる場合は、バッチサイズを小さくするか、学習ボタンの横の「カスタムバッチサンプラーを使う」を試してみてください(この場合は以前と同じ挙動となります)。 +""" + how_to_md = """ ## 使い方 @@ -416,9 +425,6 @@ how_to_md = """ - 途中から学習を再開する場合は、モデル名を入力してから「学習を開始する」を押せばよいです。 -注意: 標準スタイル以外のスタイルを音声合成で使うには、スタイルベクトルファイル`style_vectors.npy`を作る必要があります。これは、`Style.bat`を実行してそこで作成してください。 -動作は軽いはずなので、学習中でも実行でき、何度でも繰り返して試せます。 - ## JP-Extra版について 元とするモデル構造として [Bert-VITS2 Japanese-Extra](https://github.com/fishaudio/Bert-VITS2/releases/tag/JP-Exta) を使うことができます。 @@ -426,40 +432,60 @@ how_to_md = """ """ prepare_md = """ -まず音声データ(wavファイルで1ファイルが2-12秒程度の、長すぎず短すぎない発話のものをいくつか)と、書き起こしテキストを用意してください。 +まず音声データと、書き起こしテキストを用意してください。 それを次のように配置します。 ``` -├── Data +├── Data/ │ ├── {モデルの名前} │ │ ├── esd.list -│ │ ├── raw -│ │ │ ├── ****.wav -│ │ │ ├── ****.wav -│ │ │ ├── ... +│ │ ├── raw/ +│ │ │ ├── foo.wav +│ │ │ ├── bar.mp3 +│ │ │ ├── style1/ +│ │ │ │ ├── baz.wav +│ │ │ │ ├── qux.wav +│ │ │ ├── style2/ +│ │ │ │ ├── corge.wav +│ │ │ │ ├── grault.wav +... ``` -wavファイル名やモデルの名前は空白を含まない半角で、wavファイルの拡張子は小文字`.wav`である必要があります。 -`raw` フォルダにはすべてのwavファイルを入れ、`esd.list` ファイルには、以下のフォーマットで各wavファイルの情報を記述してください。 +### 配置の仕方 +- 上のように配置すると、`style1/`と`style2/`フォルダの内部(直下以外も含む)に入っている音声ファイルたちから、自動的にデフォルトスタイルに加えて`style1`と`style2`というスタイルが作成されます +- 特にスタイルを作る必要がない場合や、スタイル分類機能等でスタイルを作る場合は、`raw/`フォルダ直下に全てを配置してください。このように`raw/`のサブディレクトリの個数が0または1の場合は、スタイルはデフォルトスタイルのみが作成されます。 +- 音声ファイルのフォーマットはwav形式以外にもmp3等の多くの音声ファイルに対応しています + +### 書き起こしファイル`esd.list` + +`Data/{モデルの名前}/esd.list` ファイルには、以下のフォーマットで各音声ファイルの情報を記述してください。 + + ``` -****.wav|{話者名}|{言語ID、ZHかJPかEN}|{書き起こしテキスト} +path/to/audio.wav(wavファイル以外でもこう書く)|{話者名}|{言語ID、ZHかJPかEN}|{書き起こしテキスト} ``` +- ここで、最初の`path/to/audio.wav`は、`raw/`からの相対パスです。つまり、`raw/foo.wav`の場合は`foo.wav`、`raw/style1/bar.wav`の場合は`style1/bar.wav`となります。 +- 拡張子がwavでない場合でも、`esd.list`には`wav`と書いてください、つまり、`raw/bar.mp3`の場合でも`bar.wav`と書いてください。 + + 例: ``` -wav_number1.wav|hanako|JP|こんにちは、聞こえて、いますか? -wav_next.wav|taro|JP|はい、聞こえています……。 +foo.wav|hanako|JP|こんにちは、元気ですか? +bar.wav|taro|JP|はい、聞こえています……。何か用ですか? +style1/baz.wav|hanako|JP|今日はいい天気ですね。 +style1/qux.wav|taro|JP|はい、そうですね。 +... english_teacher.wav|Mary|EN|How are you? I'm fine, thank you, and you? ... ``` -日本語話者の単一話者データセットでも構いません。 - -- 音声ファイルはrawフォルダの直下でなくてもサブフォルダに入れても構いません。その場合は、`esd.list`の最初には`raw`からの相対パスを記述してください。 +もちろん日本語話者の単一話者データセットでも構いません。 """ def create_train_app(): with gr.Blocks().queue() as app: + gr.Markdown(change_log_md) with gr.Accordion("使い方", open=False): gr.Markdown(how_to_md) with gr.Accordion(label="データの前準備", open=False): diff --git a/requirements.txt b/requirements.txt index 3ddff0b..1c702be 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,11 +11,13 @@ loguru num2words protobuf==4.25 psutil +punctuators pyannote.audio>=3.1.0 pyloudnorm pyopenjtalk-dict pypinyin pyworld-prebuilt +stable_ts tensorboard transformers umap-learn diff --git a/transcribe.py b/transcribe.py index 6bbea6b..2752126 100644 --- a/transcribe.py +++ b/transcribe.py @@ -76,6 +76,7 @@ def transcribe_files_with_hf_whisper( batch_size=batch_size, torch_dtype=torch.float16, device="cuda", + trust_remote_code=True, # generate_kwargs=generate_kwargs, ) if initial_prompt is not None: