From d22a11ebb2fb71bde61155305fe7842aa0201a9c Mon Sep 17 00:00:00 2001 From: tsukumi Date: Fri, 8 Mar 2024 22:09:47 +0000 Subject: [PATCH] Fix: a bug that prevented speech synthesis in app.py --- app.py | 1 + server_editor.py | 8 +++++--- server_fastapi.py | 17 +++++++++++++++++ .../japanese/pyopenjtalk_worker/__init__.py | 7 ++++++- webui/inference.py | 18 +++++++++++++++++- 5 files changed, 46 insertions(+), 5 deletions(-) diff --git a/app.py b/app.py index 5d05d7c..c2237b5 100644 --- a/app.py +++ b/app.py @@ -15,6 +15,7 @@ from webui import ( create_train_app, ) + # Get path settings with Path("configs/paths.yml").open("r", encoding="utf-8") as f: path_config: dict[str, str] = yaml.safe_load(f.read()) diff --git a/server_editor.py b/server_editor.py index 022a95a..75fa472 100644 --- a/server_editor.py +++ b/server_editor.py @@ -149,9 +149,11 @@ def save_last_download(latest_release): # 以降はAPIの設定 # 最初に pyopenjtalk の辞書を更新 +## pyopenjtalk_worker の起動も同時に行われる update_dict() -# 単語分割に使う BERT モデル/トークナイザーを事前にロードしておく +# 事前に BERT モデル/トークナイザーをロードしておく +## ここでロードしなくても必要になった際に自動ロードされるが、時間がかかるため事前にロードしておいた方が体験が良い ## server_editor.py は日本語にしか対応していないため、日本語の BERT モデル/トークナイザーのみロードする bert_models.load_model(Languages.JP) bert_models.load_tokenizer(Languages.JP) @@ -301,7 +303,7 @@ def synthesis(request: SynthesisRequest): ) sr, audio = model.infer( text=text, - language=request.language.value, + language=request.language, sdp_ratio=request.sdpRatio, noise=request.noise, noisew=request.noisew, @@ -361,7 +363,7 @@ def multi_synthesis(request: MultiSynthesisRequest): tone = [t for _, t in phone_tone] sr, audio = model.infer( text=text, - language=req.language.value, + language=req.language, sdp_ratio=req.sdpRatio, noise=req.noise, noisew=req.noisew, diff --git a/server_fastapi.py b/server_fastapi.py index 833af4a..d8da956 100644 --- a/server_fastapi.py +++ b/server_fastapi.py @@ -34,11 +34,28 @@ from style_bert_vits2.constants import ( Languages, ) 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 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): logger.warning(f"Validation error: {msg}") raise HTTPException( diff --git a/style_bert_vits2/nlp/japanese/pyopenjtalk_worker/__init__.py b/style_bert_vits2/nlp/japanese/pyopenjtalk_worker/__init__.py index 670461d..6c87123 100644 --- a/style_bert_vits2/nlp/japanese/pyopenjtalk_worker/__init__.py +++ b/style_bert_vits2/nlp/japanese/pyopenjtalk_worker/__init__.py @@ -105,7 +105,12 @@ def initialize(port: int = WORKER_PORT) -> None: def signal_handler(signum: int, frame: Any): 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 diff --git a/webui/inference.py b/webui/inference.py index 02d6f3a..ef1f97f 100644 --- a/webui/inference.py +++ b/webui/inference.py @@ -19,12 +19,28 @@ from style_bert_vits2.constants import ( ) from style_bert_vits2.logging import logger 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.normalizer import normalize_text 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 = "こんにちは、初めまして。あなたの名前はなんていうの?"