Fix: a bug that prevented speech synthesis in app.py
This commit is contained in:
1
app.py
1
app.py
@@ -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())
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 = "こんにちは、初めまして。あなたの名前はなんていうの?"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user