From 1b656b37fa389ee43d194b4ce013d354360ebc46 Mon Sep 17 00:00:00 2001 From: litagin02 Date: Sun, 26 May 2024 17:17:32 +0900 Subject: [PATCH] Feat: koharune-ami --- app.py | 6 +++++- data_utils.py | 1 + gradio_tabs/inference.py | 28 ++++++++++++++++++++++++---- initialize.py | 23 ++++++++++++++++++++--- preprocess_text.py | 2 +- server_editor.py | 6 +++++- style_bert_vits2/constants.py | 2 +- train_ms_jp_extra.py | 2 +- 8 files changed, 58 insertions(+), 12 deletions(-) diff --git a/app.py b/app.py index 453479c..86d4ad3 100644 --- a/app.py +++ b/app.py @@ -11,6 +11,7 @@ from gradio_tabs.inference import create_inference_app from gradio_tabs.merge import create_merge_app from gradio_tabs.style_vectors import create_style_vectors_app from gradio_tabs.train import create_train_app +from initialize import download_default_models from style_bert_vits2.constants import GRADIO_THEME, VERSION from style_bert_vits2.nlp.japanese import pyopenjtalk_worker from style_bert_vits2.nlp.japanese.user_dict import update_dict @@ -30,12 +31,16 @@ parser.add_argument("--host", type=str, default="127.0.0.1") parser.add_argument("--port", type=int, default=None) parser.add_argument("--no_autolaunch", action="store_true") parser.add_argument("--share", action="store_true") +parser.add_argument("--skip_default_models", action="store_true") args = parser.parse_args() device = args.device if device == "cuda" and not torch.cuda.is_available(): device = "cpu" +if not args.skip_default_models: + download_default_models() + path_config = get_path_config() model_holder = TTSModelHolder(Path(path_config.assets_root), device) @@ -55,7 +60,6 @@ with gr.Blocks(theme=GRADIO_THEME) as app: with gr.Tab("モデルダウンロード"): create_download_app() - app.launch( server_name=args.host, server_port=args.port, diff --git a/data_utils.py b/data_utils.py index 4121e35..7e40f7f 100644 --- a/data_utils.py +++ b/data_utils.py @@ -5,6 +5,7 @@ import sys import numpy as np import torch import torch.utils.data +from torch.utils.data import Dataset from tqdm import tqdm from config import get_config diff --git a/gradio_tabs/inference.py b/gradio_tabs/inference.py index 1049db4..cce1a68 100644 --- a/gradio_tabs/inference.py +++ b/gradio_tabs/inference.py @@ -96,9 +96,28 @@ examples = [ ] initial_md = """ -- Ver 2.3で追加されたエディターのほうが実際に読み上げさせるには使いやすいかもしれません。`Editor.bat`か`python server_editor.py --inbrowser`で起動できます。 +- Ver 2.5で追加されたデフォルトの[「`koharune-ami`(小春音アミ)」モデル](https://huggingface.co/litagin/sbv2_koharune_ami)は、[あみたろの声素材工房](https://amitaro.net/)で公開されているコーパス音源を利用して学習したモデルです。下記の**利用規約を必ず読んで**からご利用ください。特に**クレジット表記必須**で**エログロ等センシティブな発言に使用できません**。 -- 初期からある[jvnvのモデル](https://huggingface.co/litagin/style_bert_vits2_jvnv)は、[JVNVコーパス(言語音声と非言語音声を持つ日本語感情音声コーパス)](https://sites.google.com/site/shinnosuketakamichi/research-topics/jvnv_corpus)で学習されたモデルです。ライセンスは[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/deed.ja)です。 +- Ver 2.3で追加された**エディター版**のほうが実際に読み上げさせるには使いやすいかもしれません。`Editor.bat`か`python server_editor.py --inbrowser`で起動できます。 +""" + +terms_of_use_md = """ +## 利用規約 + +### JVNVコーパス (jvnv-F1-jp, jvnv-F2-jp, jvnv-M1-jp, jvnv-M2-jp) + +- [JVNVコーパス](https://huggingface.co/litagin/style_bert_vits2_jvnv) のライセンスは[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/deed.ja)ですので、これを継承します。 + +### 小春音アミ (koharune-ami) + +- [小春音アミ(あみたろの声素材工房)の規約](https://amitaro.net/voice/voice_rule/)を全て継承します、特に、 + - エロ・グロ、政治・宗教・ヘイト・人をだます目的などには使えません、つまりセンシティブな作品や発言には使用できません + - 使用する際は(配信やXの動画等でも)必ず分かりやすい場所にクレジット表記を記載してください(クレジット表記例: `SBV2モデル:小春音アミ、あみたろの声素材工房(https://amitaro.net/)`) + - 規約を守れば商用非商用問わず利用できます +- 追加で、以下の事項を守ってください + - モデルマージに関しては、[あみたろの声素材工房のよくある質問への回答](https://amitaro.net/voice/faq/#index_id17)を遵守してください: + - 本モデルを別モデルとマージできるのは、その別モデル作成の際に学習に使われた声の権利者が許諾している場合に限る + - あみたろの声の特徴が残っている場合(マージの割合が25%以上の場合)は、その利用は[小春音アミ(あみたろの声素材工房)の規約](https://amitaro.net/voice/voice_rule/)の範囲内に限定され、そのモデルに関してもこの規約が適応される """ how_to_md = """ @@ -266,6 +285,7 @@ def create_inference_app(model_holder: TTSModelHolder) -> gr.Blocks: with gr.Blocks(theme=GRADIO_THEME) as app: gr.Markdown(initial_md) + gr.Markdown(terms_of_use_md) with gr.Accordion(label="使い方", open=False): gr.Markdown(how_to_md) with gr.Row(): @@ -394,10 +414,10 @@ def create_inference_app(model_holder: TTSModelHolder) -> gr.Blocks: ) style_weight = gr.Slider( minimum=0, - maximum=50, + maximum=20, value=DEFAULT_STYLE_WEIGHT, step=0.1, - label="スタイルの強さ", + label="スタイルの強さ(声が崩壊したら小さくしてください)", ) ref_audio_path = gr.Audio( label="参照音声", type="filepath", visible=False diff --git a/initialize.py b/initialize.py index 2bb0680..62ce690 100644 --- a/initialize.py +++ b/initialize.py @@ -50,7 +50,7 @@ def download_jp_extra_pretrained_models(): ) -def download_jvnv_models(): +def download_default_models(): files = [ "jvnv-F1-jp/config.json", "jvnv-F1-jp/jvnv-F1-jp_e160_s14000.safetensors", @@ -74,11 +74,28 @@ def download_jvnv_models(): local_dir="model_assets", local_dir_use_symlinks=False, ) + additional_files = { + "litagin/sbv2_koharune_ami": [ + "koharune-ami/config.json", + "koharune-ami/style_vectors.npy", + "koharune-ami/koharune-ami.safetensors", + ] + } + for repo_id, files in additional_files.items(): + for file in files: + if not Path(f"model_assets/{file}").exists(): + logger.info(f"Downloading {file}") + hf_hub_download( + repo_id, + file, + local_dir="model_assets", + local_dir_use_symlinks=False, + ) def main(): parser = argparse.ArgumentParser() - parser.add_argument("--skip_jvnv", action="store_true") + parser.add_argument("--skip_default_models", action="store_true") parser.add_argument("--only_infer", action="store_true") parser.add_argument( "--dataset_root", @@ -97,7 +114,7 @@ def main(): download_bert_models() if not args.skip_jvnv: - download_jvnv_models() + download_default_models() if not args.only_infer: download_slm_model() download_pretrained_models() diff --git a/preprocess_text.py b/preprocess_text.py index 879223d..4dd7e33 100644 --- a/preprocess_text.py +++ b/preprocess_text.py @@ -2,7 +2,7 @@ import argparse import json from collections import defaultdict from pathlib import Path -from random import shuffle, sample +from random import sample, shuffle from typing import Optional from tqdm import tqdm diff --git a/server_editor.py b/server_editor.py index e0028c1..2a5dabc 100644 --- a/server_editor.py +++ b/server_editor.py @@ -30,6 +30,7 @@ from pydantic import BaseModel from scipy.io import wavfile from config import get_path_config +from initialize import download_default_models from style_bert_vits2.constants import ( DEFAULT_ASSIST_TEXT_WEIGHT, DEFAULT_NOISE, @@ -182,19 +183,22 @@ parser.add_argument("--port", type=int, default=8000) parser.add_argument("--inbrowser", action="store_true") parser.add_argument("--line_length", type=int, default=None) parser.add_argument("--line_count", type=int, default=None) - +parser.add_argument("--skip_default_models", action="store_true") args = parser.parse_args() device = args.device if device == "cuda" and not torch.cuda.is_available(): device = "cpu" model_dir = Path(args.model_dir) port = int(args.port) +if not args.skip_default_models: + download_default_models() model_holder = TTSModelHolder(model_dir, device) if len(model_holder.model_names) == 0: logger.error(f"Models not found in {model_dir}.") sys.exit(1) + app = FastAPI() diff --git a/style_bert_vits2/constants.py b/style_bert_vits2/constants.py index b1987d8..eba3f1d 100644 --- a/style_bert_vits2/constants.py +++ b/style_bert_vits2/constants.py @@ -32,7 +32,7 @@ DEFAULT_USER_DICT_DIR = BASE_DIR / "dict_data" # デフォルトの推論パラメータ DEFAULT_STYLE = "Neutral" -DEFAULT_STYLE_WEIGHT = 5.0 +DEFAULT_STYLE_WEIGHT = 1.0 DEFAULT_SDP_RATIO = 0.2 DEFAULT_NOISE = 0.6 DEFAULT_NOISEW = 0.8 diff --git a/train_ms_jp_extra.py b/train_ms_jp_extra.py index 84c0465..dd19f79 100644 --- a/train_ms_jp_extra.py +++ b/train_ms_jp_extra.py @@ -18,9 +18,9 @@ from tqdm import tqdm import default_style from config import get_config from data_utils import ( + DistributedBucketSampler, TextAudioSpeakerCollate, TextAudioSpeakerLoader, - DistributedBucketSampler, ) from losses import WavLMLoss, discriminator_loss, feature_loss, generator_loss, kl_loss from mel_processing import mel_spectrogram_torch, spec_to_mel_torch