Feat: koharune-ami

This commit is contained in:
litagin02
2024-05-26 17:17:32 +09:00
parent 012f159ab5
commit 1b656b37fa
8 changed files with 58 additions and 12 deletions

6
app.py
View File

@@ -11,6 +11,7 @@ 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 initialize import download_default_models
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
@@ -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("--port", type=int, default=None)
parser.add_argument("--no_autolaunch", action="store_true") parser.add_argument("--no_autolaunch", action="store_true")
parser.add_argument("--share", action="store_true") parser.add_argument("--share", action="store_true")
parser.add_argument("--skip_default_models", action="store_true")
args = parser.parse_args() args = parser.parse_args()
device = args.device device = args.device
if device == "cuda" and not torch.cuda.is_available(): if device == "cuda" and not torch.cuda.is_available():
device = "cpu" device = "cpu"
if not args.skip_default_models:
download_default_models()
path_config = get_path_config() path_config = get_path_config()
model_holder = TTSModelHolder(Path(path_config.assets_root), device) model_holder = TTSModelHolder(Path(path_config.assets_root), device)
@@ -55,7 +60,6 @@ with gr.Blocks(theme=GRADIO_THEME) as app:
with gr.Tab("モデルダウンロード"): with gr.Tab("モデルダウンロード"):
create_download_app() create_download_app()
app.launch( app.launch(
server_name=args.host, server_name=args.host,
server_port=args.port, server_port=args.port,

View File

@@ -5,6 +5,7 @@ import sys
import numpy as np import numpy as np
import torch import torch
import torch.utils.data import torch.utils.data
from torch.utils.data import Dataset
from tqdm import tqdm from tqdm import tqdm
from config import get_config from config import get_config

View File

@@ -96,9 +96,28 @@ examples = [
] ]
initial_md = """ 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 = """ how_to_md = """
@@ -266,6 +285,7 @@ def create_inference_app(model_holder: TTSModelHolder) -> gr.Blocks:
with gr.Blocks(theme=GRADIO_THEME) as app: with gr.Blocks(theme=GRADIO_THEME) as app:
gr.Markdown(initial_md) gr.Markdown(initial_md)
gr.Markdown(terms_of_use_md)
with gr.Accordion(label="使い方", open=False): with gr.Accordion(label="使い方", open=False):
gr.Markdown(how_to_md) gr.Markdown(how_to_md)
with gr.Row(): with gr.Row():
@@ -394,10 +414,10 @@ def create_inference_app(model_holder: TTSModelHolder) -> gr.Blocks:
) )
style_weight = gr.Slider( style_weight = gr.Slider(
minimum=0, minimum=0,
maximum=50, maximum=20,
value=DEFAULT_STYLE_WEIGHT, value=DEFAULT_STYLE_WEIGHT,
step=0.1, step=0.1,
label="スタイルの強さ", label="スタイルの強さ(声が崩壊したら小さくしてください)",
) )
ref_audio_path = gr.Audio( ref_audio_path = gr.Audio(
label="参照音声", type="filepath", visible=False label="参照音声", type="filepath", visible=False

View File

@@ -50,7 +50,7 @@ def download_jp_extra_pretrained_models():
) )
def download_jvnv_models(): def download_default_models():
files = [ files = [
"jvnv-F1-jp/config.json", "jvnv-F1-jp/config.json",
"jvnv-F1-jp/jvnv-F1-jp_e160_s14000.safetensors", "jvnv-F1-jp/jvnv-F1-jp_e160_s14000.safetensors",
@@ -74,11 +74,28 @@ def download_jvnv_models():
local_dir="model_assets", local_dir="model_assets",
local_dir_use_symlinks=False, 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(): def main():
parser = argparse.ArgumentParser() 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("--only_infer", action="store_true")
parser.add_argument( parser.add_argument(
"--dataset_root", "--dataset_root",
@@ -97,7 +114,7 @@ def main():
download_bert_models() download_bert_models()
if not args.skip_jvnv: if not args.skip_jvnv:
download_jvnv_models() download_default_models()
if not args.only_infer: if not args.only_infer:
download_slm_model() download_slm_model()
download_pretrained_models() download_pretrained_models()

View File

@@ -2,7 +2,7 @@ import argparse
import json import json
from collections import defaultdict from collections import defaultdict
from pathlib import Path from pathlib import Path
from random import shuffle, sample from random import sample, shuffle
from typing import Optional from typing import Optional
from tqdm import tqdm from tqdm import tqdm

View File

@@ -30,6 +30,7 @@ from pydantic import BaseModel
from scipy.io import wavfile from scipy.io import wavfile
from config import get_path_config from config import get_path_config
from initialize import download_default_models
from style_bert_vits2.constants import ( from style_bert_vits2.constants import (
DEFAULT_ASSIST_TEXT_WEIGHT, DEFAULT_ASSIST_TEXT_WEIGHT,
DEFAULT_NOISE, DEFAULT_NOISE,
@@ -182,19 +183,22 @@ parser.add_argument("--port", type=int, default=8000)
parser.add_argument("--inbrowser", action="store_true") parser.add_argument("--inbrowser", action="store_true")
parser.add_argument("--line_length", type=int, default=None) parser.add_argument("--line_length", type=int, default=None)
parser.add_argument("--line_count", 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() args = parser.parse_args()
device = args.device device = args.device
if device == "cuda" and not torch.cuda.is_available(): if device == "cuda" and not torch.cuda.is_available():
device = "cpu" device = "cpu"
model_dir = Path(args.model_dir) model_dir = Path(args.model_dir)
port = int(args.port) port = int(args.port)
if not args.skip_default_models:
download_default_models()
model_holder = TTSModelHolder(model_dir, device) model_holder = TTSModelHolder(model_dir, device)
if len(model_holder.model_names) == 0: if len(model_holder.model_names) == 0:
logger.error(f"Models not found in {model_dir}.") logger.error(f"Models not found in {model_dir}.")
sys.exit(1) sys.exit(1)
app = FastAPI() app = FastAPI()

View File

@@ -32,7 +32,7 @@ DEFAULT_USER_DICT_DIR = BASE_DIR / "dict_data"
# デフォルトの推論パラメータ # デフォルトの推論パラメータ
DEFAULT_STYLE = "Neutral" DEFAULT_STYLE = "Neutral"
DEFAULT_STYLE_WEIGHT = 5.0 DEFAULT_STYLE_WEIGHT = 1.0
DEFAULT_SDP_RATIO = 0.2 DEFAULT_SDP_RATIO = 0.2
DEFAULT_NOISE = 0.6 DEFAULT_NOISE = 0.6
DEFAULT_NOISEW = 0.8 DEFAULT_NOISEW = 0.8

View File

@@ -18,9 +18,9 @@ from tqdm import tqdm
import default_style import default_style
from config import get_config from config import get_config
from data_utils import ( from data_utils import (
DistributedBucketSampler,
TextAudioSpeakerCollate, TextAudioSpeakerCollate,
TextAudioSpeakerLoader, TextAudioSpeakerLoader,
DistributedBucketSampler,
) )
from losses import WavLMLoss, discriminator_loss, feature_loss, generator_loss, kl_loss from losses import WavLMLoss, discriminator_loss, feature_loss, generator_loss, kl_loss
from mel_processing import mel_spectrogram_torch, spec_to_mel_torch from mel_processing import mel_spectrogram_torch, spec_to_mel_torch