Feat: add kotoba-whisper, etc

This commit is contained in:
litagin02
2024-05-26 22:03:19 +09:00
parent e27bd4dfbc
commit e5c189125f
7 changed files with 101 additions and 36 deletions

View File

@@ -71,7 +71,7 @@ class TextAudioSpeakerLoader(torch.utils.data.Dataset):
self.audiopaths_sid_text, file=sys.stdout self.audiopaths_sid_text, file=sys.stdout
): ):
audiopath = f"{_id}" audiopath = f"{_id}"
if self.min_text_len <= len(phones) and len(phones) <= self.max_text_len: # if self.min_text_len <= len(phones) and len(phones) <= self.max_text_len:
phones = phones.split(" ") phones = phones.split(" ")
tone = [int(i) for i in tone.split(" ")] tone = [int(i) for i in tone.split(" ")]
word2ph = [int(i) for i in word2ph.split(" ")] word2ph = [int(i) for i in word2ph.split(" ")]
@@ -79,8 +79,8 @@ class TextAudioSpeakerLoader(torch.utils.data.Dataset):
[audiopath, spk, language, text, phones, tone, word2ph] [audiopath, spk, language, text, phones, tone, word2ph]
) )
lengths.append(os.path.getsize(audiopath) // (2 * self.hop_length)) lengths.append(os.path.getsize(audiopath) // (2 * self.hop_length))
else: # else:
skipped += 1 # skipped += 1
logger.info( logger.info(
"skipped: " "skipped: "
+ str(skipped) + str(skipped)

View File

@@ -2,15 +2,35 @@
## v2.5.0 (2024-05-26) ## v2.5.0 (2024-05-26)
WIP このバージョンから[利用規約](/docs/TERMS_OF_USE.md)が追加されました。ご利用の際は必ずお読みください。
### 改善 ### 新機能等
- 音声データをスタイルごとにフォルダ分けしておくことで、そのフォルダごとのスタイルを学習時に自動的に作成するように - デフォルトモデルに [あみたろの声素材工房](https://amitaro.net/) のあみたろ様が公開しているコーパスを利用して学習した**小春音アミ**モデルを追加(あみたろ様には事前に連絡して許諾を得ています)
- 上の改善を既存モデルでも使えるようなスタイル作成の機能追加。具体的には、フォルダ分けされた音声ファイルのディレクトリを任意に指定し、そのフォルダ分けを使って既存のモデルのスタイルの作成が可能に - アプデの場合は新たに`App.bat``Editor.bat`を起動した際に自動でダウンロードされます
- Hugging Face 🤗 に公開されているSBV2のモデルを、URLを指定すると自動でダウンロードして音声合成に使えるようにする機能の追加 - 英語の音声合成の速度向上([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)です、ありがとうございます!) - **ライブラリとしてのみ**)依存関係の軽量化、音声合成時に読み上げテキストの読みを表す音素列を指定する機能を追加 + 様々な改善 ([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`のようなエラーが出る問題を修正 - Gradioのアップデートにより、モデル選択時等に`TypeError: Type is not JSON serializable: WindowsPath`のようなエラーが出る問題を修正

View File

@@ -47,6 +47,7 @@ def do_transcribe(
use_hf_whisper, use_hf_whisper,
batch_size, batch_size,
num_beams, num_beams,
hf_repo_id,
): ):
if model_name == "": if model_name == "":
return "Error: モデル名を入力してください。" return "Error: モデル名を入力してください。"
@@ -71,9 +72,12 @@ def do_transcribe(
if use_hf_whisper: if use_hf_whisper:
cmd.append("--use_hf_whisper") cmd.append("--use_hf_whisper")
cmd.extend(["--batch_size", str(batch_size)]) 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: if not success:
return f"Error: {message}. エラーメッセージが空の場合、何も問題がない可能性があるので、書き起こしファイルをチェックして問題なければ無視してください。" return f"Error: {message}. エラーメッセージが空の場合、何も問題がない可能性があるので、書き起こしファイルをチェックして問題なければ無視してください。"
return "音声の文字起こしが完了しました。"
how_to_md = """ how_to_md = """
@@ -170,6 +174,12 @@ def create_dataset_app() -> gr.Blocks:
use_hf_whisper = gr.Checkbox( use_hf_whisper = gr.Checkbox(
label="HuggingFaceのWhisperを使う速度が速いがVRAMを多く使う", 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( compute_type = gr.Dropdown(
[ [
"int8", "int8",
@@ -234,17 +244,19 @@ def create_dataset_app() -> gr.Blocks:
use_hf_whisper, use_hf_whisper,
batch_size, batch_size,
num_beams, num_beams,
hf_repo_id,
], ],
outputs=[result2], outputs=[result2],
) )
use_hf_whisper.change( use_hf_whisper.change(
lambda x: ( lambda x: (
gr.update(visible=x),
gr.update(visible=x), gr.update(visible=x),
gr.update(visible=not x), gr.update(visible=not x),
gr.update(visible=not x), gr.update(visible=not x),
), ),
inputs=[use_hf_whisper], inputs=[use_hf_whisper],
outputs=[batch_size, compute_type, device], outputs=[hf_repo_id, batch_size, compute_type, device],
) )
return app return app

View File

@@ -278,7 +278,11 @@ def save_style_vectors_from_files(
def save_style_vectors_by_dirs(model_name: str, audio_dir_str: str): 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 concurrent.futures import ThreadPoolExecutor
from multiprocessing import cpu_count from multiprocessing import cpu_count
@@ -349,7 +353,7 @@ method0 = """
**注意** **注意**
- Ver 2.5.0以降では、raw/フォルダにサブディレクトリに分けて音声ファイルを入れるだけで、スタイルベクトルが自動で作成されるので、この手順は不要です。 - Ver 2.5.0以降では、`inputs/`フォルダや`raw/`フォルダにサブディレクトリに分けて音声ファイルを入れるだけで、スタイルベクトルが自動で作成されるので、この手順は不要です。
- それ未満のバージョンで学習したモデルに新しくスタイルベクトルをつけたい場合や、学習に使ったのとは別の音声でスタイルベクトルを作成したい場合に使います。 - それ未満のバージョンで学習したモデルに新しくスタイルベクトルをつけたい場合や、学習に使ったのとは別の音声でスタイルベクトルを作成したい場合に使います。
- 学習との整合性のため、もし**現在学習中や、今後学習する予定がある場合は**、音声ファイルは、`Data/{モデル名}/wavs`フォルダではなく**新しい別のディレクトリに保存してください**。 - 学習との整合性のため、もし**現在学習中や、今後学習する予定がある場合は**、音声ファイルは、`Data/{モデル名}/wavs`フォルダではなく**新しい別のディレクトリに保存してください**。

View File

@@ -405,6 +405,15 @@ def run_tensorboard(model_name: str):
yield gr.Button("Tensorboardを開く") yield gr.Button("Tensorboardを開く")
change_log_md = """
**Ver 2.5以降の変更点**
- `raw/`フォルダの中で音声をサブディレクトリに分けて配置することで、自動的にスタイルが作成されるようになりました。詳細は下の「使い方/データの前準備」を参照してください。
- これまでは1ファイルあたり14秒程度を超えた音声ファイルは学習には用いられていませんでしたが、Ver 2.5以降ではその制限がなくなりました。ただし:
- 音声ファイルが長い場合の学習効率は悪いかもしれず、挙動も確認していません
- この変更で要求VRAMが増えるので、学習に失敗したりVRAM不足になる場合は、バッチサイズを小さくするか、学習ボタンの横の「カスタムバッチサンプラーを使う」を試してみてくださいこの場合は以前と同じ挙動となります
"""
how_to_md = """ how_to_md = """
## 使い方 ## 使い方
@@ -416,9 +425,6 @@ how_to_md = """
- 途中から学習を再開する場合は、モデル名を入力してから「学習を開始する」を押せばよいです。 - 途中から学習を再開する場合は、モデル名を入力してから「学習を開始する」を押せばよいです。
注意: 標準スタイル以外のスタイルを音声合成で使うには、スタイルベクトルファイル`style_vectors.npy`を作る必要があります。これは、`Style.bat`を実行してそこで作成してください。
動作は軽いはずなので、学習中でも実行でき、何度でも繰り返して試せます。
## JP-Extra版について ## JP-Extra版について
元とするモデル構造として [Bert-VITS2 Japanese-Extra](https://github.com/fishaudio/Bert-VITS2/releases/tag/JP-Exta) を使うことができます。 元とするモデル構造として [Bert-VITS2 Japanese-Extra](https://github.com/fishaudio/Bert-VITS2/releases/tag/JP-Exta) を使うことができます。
@@ -426,40 +432,60 @@ how_to_md = """
""" """
prepare_md = """ prepare_md = """
まず音声データwavファイルで1ファイルが2-12秒程度の、長すぎず短すぎない発話のものをいくつかと、書き起こしテキストを用意してください。 まず音声データと、書き起こしテキストを用意してください。
それを次のように配置します。 それを次のように配置します。
``` ```
├── Data ├── Data/
│ ├── {モデルの名前} │ ├── {モデルの名前}
│ │ ├── esd.list │ │ ├── esd.list
│ │ ├── raw │ │ ├── raw/
│ │ │ ├── ****.wav │ │ │ ├── foo.wav
│ │ │ ├── ****.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|こんにちは、聞こえて、いますか? foo.wav|hanako|JP|こんにちは、元気ですか?
wav_next.wav|taro|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? english_teacher.wav|Mary|EN|How are you? I'm fine, thank you, and you?
... ...
``` ```
日本語話者の単一話者データセットでも構いません。 もちろん日本語話者の単一話者データセットでも構いません。
- 音声ファイルはrawフォルダの直下でなくてもサブフォルダに入れても構いません。その場合は、`esd.list`の最初には`raw`からの相対パスを記述してください。
""" """
def create_train_app(): def create_train_app():
with gr.Blocks().queue() as app: with gr.Blocks().queue() as app:
gr.Markdown(change_log_md)
with gr.Accordion("使い方", open=False): with gr.Accordion("使い方", open=False):
gr.Markdown(how_to_md) gr.Markdown(how_to_md)
with gr.Accordion(label="データの前準備", open=False): with gr.Accordion(label="データの前準備", open=False):

View File

@@ -11,11 +11,13 @@ loguru
num2words num2words
protobuf==4.25 protobuf==4.25
psutil psutil
punctuators
pyannote.audio>=3.1.0 pyannote.audio>=3.1.0
pyloudnorm pyloudnorm
pyopenjtalk-dict pyopenjtalk-dict
pypinyin pypinyin
pyworld-prebuilt pyworld-prebuilt
stable_ts
tensorboard tensorboard
transformers transformers
umap-learn umap-learn

View File

@@ -76,6 +76,7 @@ def transcribe_files_with_hf_whisper(
batch_size=batch_size, batch_size=batch_size,
torch_dtype=torch.float16, torch_dtype=torch.float16,
device="cuda", device="cuda",
trust_remote_code=True,
# generate_kwargs=generate_kwargs, # generate_kwargs=generate_kwargs,
) )
if initial_prompt is not None: if initial_prompt is not None: