Feat: koharune-ami
This commit is contained in:
6
app.py
6
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.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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user