Fix: a bug that prevented speech synthesis in app.py

This commit is contained in:
tsukumi
2024-03-08 22:09:47 +00:00
parent 30ea08d6ea
commit d22a11ebb2
5 changed files with 46 additions and 5 deletions

1
app.py
View File

@@ -15,6 +15,7 @@ from webui import (
create_train_app, create_train_app,
) )
# Get path settings # Get path settings
with Path("configs/paths.yml").open("r", encoding="utf-8") as f: with Path("configs/paths.yml").open("r", encoding="utf-8") as f:
path_config: dict[str, str] = yaml.safe_load(f.read()) path_config: dict[str, str] = yaml.safe_load(f.read())

View File

@@ -149,9 +149,11 @@ def save_last_download(latest_release):
# 以降はAPIの設定 # 以降はAPIの設定
# 最初に pyopenjtalk の辞書を更新 # 最初に pyopenjtalk の辞書を更新
## pyopenjtalk_worker の起動も同時に行われる
update_dict() update_dict()
# 単語分割に使う BERT モデル/トークナイザーを事前にロードしておく # 事前に BERT モデル/トークナイザーをロードしておく
## ここでロードしなくても必要になった際に自動ロードされるが、時間がかかるため事前にロードしておいた方が体験が良い
## server_editor.py は日本語にしか対応していないため、日本語の BERT モデル/トークナイザーのみロードする ## server_editor.py は日本語にしか対応していないため、日本語の BERT モデル/トークナイザーのみロードする
bert_models.load_model(Languages.JP) bert_models.load_model(Languages.JP)
bert_models.load_tokenizer(Languages.JP) bert_models.load_tokenizer(Languages.JP)
@@ -301,7 +303,7 @@ def synthesis(request: SynthesisRequest):
) )
sr, audio = model.infer( sr, audio = model.infer(
text=text, text=text,
language=request.language.value, language=request.language,
sdp_ratio=request.sdpRatio, sdp_ratio=request.sdpRatio,
noise=request.noise, noise=request.noise,
noisew=request.noisew, noisew=request.noisew,
@@ -361,7 +363,7 @@ def multi_synthesis(request: MultiSynthesisRequest):
tone = [t for _, t in phone_tone] tone = [t for _, t in phone_tone]
sr, audio = model.infer( sr, audio = model.infer(
text=text, text=text,
language=req.language.value, language=req.language,
sdp_ratio=req.sdpRatio, sdp_ratio=req.sdpRatio,
noise=req.noise, noise=req.noise,
noisew=req.noisew, noisew=req.noisew,

View File

@@ -34,11 +34,28 @@ from style_bert_vits2.constants import (
Languages, Languages,
) )
from style_bert_vits2.logging import logger from style_bert_vits2.logging import logger
from style_bert_vits2.nlp import bert_models
from style_bert_vits2.nlp.japanese import pyopenjtalk_worker as pyopenjtalk
from style_bert_vits2.tts_model import Model, ModelHolder from style_bert_vits2.tts_model import Model, ModelHolder
ln = config.server_config.language ln = config.server_config.language
# pyopenjtalk_worker を起動
## Gradio はマルチスレッドだが、initialize() 内部で利用されている signal はマルチスレッドから設定できない
## さらに起動には若干時間がかかるため、事前に起動しておいた方が体験が良い
pyopenjtalk.initialize()
# 事前に BERT モデル/トークナイザーをロードしておく
## ここでロードしなくても必要になった際に自動ロードされるが、時間がかかるため事前にロードしておいた方が体験が良い
bert_models.load_model(Languages.JP)
bert_models.load_tokenizer(Languages.JP)
bert_models.load_model(Languages.EN)
bert_models.load_tokenizer(Languages.EN)
bert_models.load_model(Languages.ZH)
bert_models.load_tokenizer(Languages.ZH)
def raise_validation_error(msg: str, param: str): def raise_validation_error(msg: str, param: str):
logger.warning(f"Validation error: {msg}") logger.warning(f"Validation error: {msg}")
raise HTTPException( raise HTTPException(

View File

@@ -105,7 +105,12 @@ def initialize(port: int = WORKER_PORT) -> None:
def signal_handler(signum: int, frame: Any): def signal_handler(signum: int, frame: Any):
terminate() terminate()
signal.signal(signal.SIGTERM, signal_handler) try:
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
except ValueError:
# signal only works in main thread
pass
# top-level declaration # top-level declaration

View File

@@ -19,12 +19,28 @@ from style_bert_vits2.constants import (
) )
from style_bert_vits2.logging import logger from style_bert_vits2.logging import logger
from style_bert_vits2.models.infer import InvalidToneError from style_bert_vits2.models.infer import InvalidToneError
from style_bert_vits2.nlp import bert_models
from style_bert_vits2.nlp.japanese import pyopenjtalk_worker as pyopenjtalk
from style_bert_vits2.nlp.japanese.g2p_utils import g2kata_tone, kata_tone2phone_tone from style_bert_vits2.nlp.japanese.g2p_utils import g2kata_tone, kata_tone2phone_tone
from style_bert_vits2.nlp.japanese.normalizer import normalize_text from style_bert_vits2.nlp.japanese.normalizer import normalize_text
from style_bert_vits2.tts_model import ModelHolder from style_bert_vits2.tts_model import ModelHolder
languages = [l.value for l in Languages]
# pyopenjtalk_worker を起動
## Gradio はマルチスレッドだが、initialize() 内部で利用されている signal はマルチスレッドから設定できない
## さらに起動には若干時間がかかるため、事前に起動しておいた方が体験が良い
pyopenjtalk.initialize()
# 事前に BERT モデル/トークナイザーをロードしておく
## ここでロードしなくても必要になった際に自動ロードされるが、時間がかかるため事前にロードしておいた方が体験が良い
bert_models.load_model(Languages.JP)
bert_models.load_tokenizer(Languages.JP)
bert_models.load_model(Languages.EN)
bert_models.load_tokenizer(Languages.EN)
bert_models.load_model(Languages.ZH)
bert_models.load_tokenizer(Languages.ZH)
languages = [l.value for l in Languages]
initial_text = "こんにちは、初めまして。あなたの名前はなんていうの?" initial_text = "こんにちは、初めまして。あなたの名前はなんていうの?"