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) - [**リリースページ**](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-16: ver 2.4.1 (**batファイルによるインストール方法の変更**)
- 2024-03-15: ver 2.4.0 (大規模リファクタリングや種々の改良、ライブラリ化) - 2024-03-15: ver 2.4.0 (大規模リファクタリングや種々の改良、ライブラリ化)
- 2024-02-26: ver 2.3 (辞書機能とエディター機能) - 2024-02-26: ver 2.3 (辞書機能とエディター機能)

2
app.py
View File

@@ -6,11 +6,11 @@ import torch
from config import get_path_config from config import get_path_config
from gradio_tabs.dataset import create_dataset_app 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.inference import create_inference_app
from gradio_tabs.merge import create_merge_app from gradio_tabs.merge import create_merge_app
from gradio_tabs.style_vectors import create_style_vectors_app from gradio_tabs.style_vectors import create_style_vectors_app
from gradio_tabs.train import create_train_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.constants import GRADIO_THEME, VERSION
from style_bert_vits2.nlp.japanese import pyopenjtalk_worker from style_bert_vits2.nlp.japanese import pyopenjtalk_worker
from style_bert_vits2.nlp.japanese.user_dict import update_dict from style_bert_vits2.nlp.japanese.user_dict import update_dict

View File

@@ -53,7 +53,7 @@
"wav_dir = \"Data/jvnv-M1/wavs\"\n", "wav_dir = \"Data/jvnv-M1/wavs\"\n",
"\n", "\n",
"embs = []\n", "embs = []\n",
"names= []\n", "names = []\n",
"for file in os.listdir(wav_dir):\n", "for file in os.listdir(wav_dir):\n",
" if file.endswith(\".npy\"):\n", " if file.endswith(\".npy\"):\n",
" xvec = np.load(os.path.join(wav_dir, file))\n", " xvec = np.load(os.path.join(wav_dir, file))\n",

View File

@@ -55,6 +55,7 @@
"# Google driveを使う方はこちらを実行してください。\n", "# Google driveを使う方はこちらを実行してください。\n",
"\n", "\n",
"from google.colab import drive\n", "from google.colab import drive\n",
"\n",
"drive.mount(\"/content/drive\")" "drive.mount(\"/content/drive\")"
] ]
}, },
@@ -274,7 +275,7 @@
" use_jp_extra=use_jp_extra,\n", " use_jp_extra=use_jp_extra,\n",
" val_per_lang=0,\n", " val_per_lang=0,\n",
" log_interval=200,\n", " log_interval=200,\n",
" yomi_error=yomi_error\n", " yomi_error=yomi_error,\n",
")" ")"
] ]
}, },

View File

@@ -1,5 +1,22 @@
# Changelog # 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) ## v2.4.1 (2024-03-16)
**batファイルでのインストール・アップデート方法の変更**(それ以外の変更はありません) **batファイルでのインストール・アップデート方法の変更**(それ以外の変更はありません)

View File

@@ -86,7 +86,7 @@ Style-Bert-VITS2の学習用データセットを作成するためのツール
## 必要なもの ## 必要なもの
学習したい音声が入ったwavファイルいくつか。 学習したい音声が入った音声ファイルいくつか形式はwav以外でも通常の音声ファイル形式なら可能
合計時間がある程度はあったほうがいいかも、10分とかでも大丈夫だったとの報告あり。単一ファイルでも良いし複数ファイルでもよい。 合計時間がある程度はあったほうがいいかも、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 huggingface_hub import snapshot_download
from config import get_path_config from config import get_path_config
from style_bert_vits2.logging import logger
assets_root = get_path_config().assets_root assets_root = get_path_config().assets_root
@@ -11,17 +12,18 @@ assets_root = get_path_config().assets_root
how_to_md = """ 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_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`ファイルが必要です。特にリポジトリの構成は確認しないので、ダウンロード後に必要ならば再配置等を行ってください - **必ずモデルの利用には(掲載があれば)利用規約を確認してください。** ダウンロード後にREADMEファイルが下記に表示されます
- リポジトリの内容はチェックしませんので、ダウンロードする前にURLにアクセスしてリポジトリの内容を確認してください。怪しいURLは入力しないでください。 - 音声合成で使うには、`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 = "username/myrepo"
repo_id = url.split("https://huggingface.co/")[1].split("/tree/main")[0] repo_id = url.split("https://huggingface.co/")[1].split("/tree/main")[0]
if len(repo_id.split("/")) != 2: if len(repo_id.split("/")) != 2:
logger.error(f"Invalid URL: {url}")
return "Error: URLが不正です。" return "Error: URLが不正です。"
# repo_folder = "jvnv-F1-jp" # repo_folder = "jvnv-F1-jp"
repo_folder = url.split("/tree/main/")[-1] if "/tree/main/" in url else "" 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 == "": if repo_folder == "":
model_name = repo_id.replace("/", "-") model_name = repo_id.replace("/", "-")
local_dir = assets_root / model_name local_dir = assets_root / model_name
logger.info(f"Downloading {repo_id} to {local_dir}")
result = snapshot_download(repo_id, local_dir=local_dir) result = snapshot_download(repo_id, local_dir=local_dir)
else: else:
model_name = repo_id.replace("/", "-") + "-" + repo_folder.split("/")[-1] model_name = repo_id.replace("/", "-") + "-" + repo_folder.split("/")[-1]
local_dir = assets_root / model_name local_dir = assets_root / model_name
logger.info(f"Downloading {repo_id}/{repo_folder} to {local_dir}")
result = snapshot_download( result = snapshot_download(
repo_id, repo_id,
local_dir=local_dir, local_dir=local_dir,
allow_patterns=[repo_folder + "/*"], allow_patterns=[repo_folder + "/*"],
) )
# Move the downloaded folder to the correct path # Move the downloaded folder to the correct path
for item in (assets_root / model_name / repo_folder).iterdir(): shutil.copytree(
shutil.move(item, assets_root / model_name) assets_root / model_name / repo_folder, local_dir, dirs_exist_ok=True
)
shutil.rmtree(assets_root / model_name / repo_folder.split("/")[0]) 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 # Remove local_dir/.huggingface
hf_dir = local_dir / ".huggingface" hf_dir = local_dir / ".huggingface"
if hf_dir.exists(): if hf_dir.exists():
shutil.rmtree(local_dir / ".huggingface") shutil.rmtree(local_dir / ".huggingface")
return f"ダウンロード完了: {result}" return f"保存完了。フォルダ:\n{result}", readme
def create_download_app() -> gr.Blocks: def create_download_app() -> gr.Blocks:
@@ -68,8 +88,11 @@ def create_download_app() -> gr.Blocks:
label="URL", placeholder="https://huggingface.co/username/myrepo" label="URL", placeholder="https://huggingface.co/username/myrepo"
) )
btn = gr.Button("ダウンロード") btn = gr.Button("ダウンロード")
info = gr.Textbox(label="情報", value="") info = gr.Markdown("ダウンロード結果")
btn.click(download_model, inputs=[url], outputs=[info]) md = gr.Markdown(
label="README.mdファイル", value="ここにREADME.mdがあれば表示されます。"
)
btn.click(download_model, inputs=[url], outputs=[info, md])
return app return app

View File

@@ -77,11 +77,7 @@
"\n", "\n",
"for file in [model_file, config_file, style_file]:\n", "for file in [model_file, config_file, style_file]:\n",
" print(file)\n", " print(file)\n",
" hf_hub_download(\n", " hf_hub_download(\"litagin/style_bert_vits2_jvnv\", file, local_dir=\"model_assets\")"
" \"litagin/style_bert_vits2_jvnv\",\n",
" file,\n",
" local_dir=\"model_assets\"\n",
" )"
] ]
}, },
{ {
@@ -102,7 +98,7 @@
" model_path=assets_root / model_file,\n", " model_path=assets_root / model_file,\n",
" config_path=assets_root / config_file,\n", " config_path=assets_root / config_file,\n",
" style_vec_path=assets_root / style_file,\n", " style_vec_path=assets_root / style_file,\n",
" device=\"cpu\"\n", " device=\"cpu\",\n",
")" ")"
] ]
}, },

View File

@@ -78,7 +78,7 @@ cov = ["test-cov", "cov-report"]
[tool.hatch.envs.style] [tool.hatch.envs.style]
detached = true detached = true
dependencies = ["black", "isort"] dependencies = ["black[jupyter]", "isort"]
[tool.hatch.envs.style.scripts] [tool.hatch.envs.style.scripts]
check = [ check = [
"black --check --diff .", "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: 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 return file.suffix.lower() in supported_extensions