Docs
This commit is contained in:
@@ -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
2
app.py
@@ -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
|
||||||
|
|||||||
@@ -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",
|
||||||
")"
|
")"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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ファイルでのインストール・アップデート方法の変更**(それ以外の変更はありません)
|
||||||
|
|||||||
@@ -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)もおすすめします。書き起こし部分もかなり工夫されています。ですがファイル数が多い場合などは、このツールで簡易的に切り出してデータセットを作るだけでも十分という気もしています。
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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",
|
||||||
")"
|
")"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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 .",
|
||||||
|
|||||||
2
slice.py
2
slice.py
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user