From 1bf4f2940b4bf589b02697d36ce8fb3be2267e6c Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Wed, 6 Sep 2023 11:58:39 +0900 Subject: [PATCH 01/44] =?UTF-8?q?speaker=5Fid=E3=82=92style=5Fid=E3=81=AB(?= =?UTF-8?q?synthesis=5Fengine=5Fbase.py)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../synthesis_engine/synthesis_engine_base.py | 49 +++++++++---------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/voicevox_engine/synthesis_engine/synthesis_engine_base.py b/voicevox_engine/synthesis_engine/synthesis_engine_base.py index aaf4fc4a1..11e0f350e 100644 --- a/voicevox_engine/synthesis_engine/synthesis_engine_base.py +++ b/voicevox_engine/synthesis_engine/synthesis_engine_base.py @@ -92,28 +92,27 @@ def supported_devices(self) -> Optional[str]: raise NotImplementedError def initialize_speaker_synthesis( # noqa: B027 - self, speaker_id: int, skip_reinit: bool + self, style_id: int, skip_reinit: bool ): - """ 指定した話者での音声合成を初期化する。何度も実行可能。 未実装の場合は何もしない Parameters ---------- - speaker_id : int - 話者ID + style_id : int + スタイルID skip_reinit : bool True の場合, 既に初期化済みの話者の再初期化をスキップします """ pass - def is_initialized_speaker_synthesis(self, speaker_id: int) -> bool: + def is_initialized_speaker_synthesis(self, style_id: int) -> bool: """ 指定した話者での音声合成が初期化されているかどうかを返す Parameters ---------- - speaker_id : int - 話者ID + style_id : int + スタイルID Returns ------- bool @@ -123,7 +122,7 @@ def is_initialized_speaker_synthesis(self, speaker_id: int) -> bool: @abstractmethod def replace_phoneme_length( - self, accent_phrases: List[AccentPhrase], speaker_id: int + self, accent_phrases: List[AccentPhrase], style_id: int ) -> List[AccentPhrase]: """ accent_phrasesの母音・子音の長さを設定する @@ -131,8 +130,8 @@ def replace_phoneme_length( ---------- accent_phrases : List[AccentPhrase] アクセント句モデルのリスト - speaker_id : int - 話者ID + style_id : int + スタイルID Returns ------- accent_phrases : List[AccentPhrase] @@ -142,7 +141,7 @@ def replace_phoneme_length( @abstractmethod def replace_mora_pitch( - self, accent_phrases: List[AccentPhrase], speaker_id: int + self, accent_phrases: List[AccentPhrase], style_id: int ) -> List[AccentPhrase]: """ accent_phrasesの音高(ピッチ)を設定する @@ -150,8 +149,8 @@ def replace_mora_pitch( ---------- accent_phrases : List[AccentPhrase] アクセント句モデルのリスト - speaker_id : int - 話者ID + style_id : int + スタイルID Returns ------- accent_phrases : List[AccentPhrase] @@ -162,17 +161,17 @@ def replace_mora_pitch( def replace_mora_data( self, accent_phrases: List[AccentPhrase], - speaker_id: int, + style_id: int, ) -> List[AccentPhrase]: return self.replace_mora_pitch( accent_phrases=self.replace_phoneme_length( accent_phrases=accent_phrases, - speaker_id=speaker_id, + style_id=style_id, ), - speaker_id=speaker_id, + style_id=style_id, ) - def create_accent_phrases(self, text: str, speaker_id: int) -> List[AccentPhrase]: + def create_accent_phrases(self, text: str, style_id: int) -> List[AccentPhrase]: if len(text.strip()) == 0: return [] @@ -207,14 +206,14 @@ def create_accent_phrases(self, text: str, speaker_id: int) -> List[AccentPhrase breath_group.accent_phrases ) ], - speaker_id=speaker_id, + style_id=style_id, ) return accent_phrases def synthesis( self, query: AudioQuery, - speaker_id: int, + style_id: int, enable_interrogative_upspeak: bool = True, ) -> np.ndarray: """ @@ -224,8 +223,8 @@ def synthesis( ---------- query : AudioQuery 音声合成クエリ - speaker_id : int - 話者ID + style_id : int + スタイルID enable_interrogative_upspeak : bool 疑問系のテキストの語尾を自動調整する機能を有効にするか Returns @@ -239,18 +238,18 @@ def synthesis( query.accent_phrases = adjust_interrogative_accent_phrases( query.accent_phrases ) - return self._synthesis_impl(query, speaker_id) + return self._synthesis_impl(query, style_id) @abstractmethod - def _synthesis_impl(self, query: AudioQuery, speaker_id: int) -> np.ndarray: + def _synthesis_impl(self, query: AudioQuery, style_id: int) -> np.ndarray: """ 音声合成クエリから音声合成に必要な情報を構成し、実際に音声合成を行う Parameters ---------- query : AudioQuery 音声合成クエリ - speaker_id : int - 話者ID + style_id : int + スタイルID Returns ------- wave : numpy.ndarray From 3f58da0db0278d31395909f10e3e07925b7f44e8 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Wed, 6 Sep 2023 12:20:43 +0900 Subject: [PATCH 02/44] =?UTF-8?q?style=5Fid=E3=81=AB=E5=A4=89=E6=9B=B4(can?= =?UTF-8?q?cellable=5Fengine.py)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- voicevox_engine/cancellable_engine.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/voicevox_engine/cancellable_engine.py b/voicevox_engine/cancellable_engine.py index 1bedb3ff3..913a8175d 100644 --- a/voicevox_engine/cancellable_engine.py +++ b/voicevox_engine/cancellable_engine.py @@ -115,7 +115,7 @@ def finalize_con( def _synthesis_impl( self, query: AudioQuery, - speaker_id: int, + style_id: int, request: Request, core_version: Optional[str], ) -> str: @@ -127,7 +127,7 @@ def _synthesis_impl( Parameters ---------- query: AudioQuery - speaker_id: int + style_id: int request: fastapi.Request 接続確立時に受け取ったものをそのまま渡せばよい https://fastapi.tiangolo.com/advanced/using-request-directly/ @@ -141,7 +141,7 @@ def _synthesis_impl( proc, sub_proc_con1 = self.procs_and_cons.get() self.watch_con_list.append((request, proc)) try: - sub_proc_con1.send((query, speaker_id, core_version)) + sub_proc_con1.send((query, style_id, core_version)) f_name = sub_proc_con1.recv() except EOFError: raise HTTPException(status_code=422, detail="既にサブプロセスは終了されています") @@ -200,7 +200,7 @@ def start_synthesis_subprocess( latest_core_version = get_latest_core_version(versions=synthesis_engines.keys()) while True: try: - query, speaker_id, core_version = sub_proc_con.recv() + query, style_id, core_version = sub_proc_con.recv() if core_version is None: _engine = synthesis_engines[latest_core_version] elif core_version in synthesis_engines: @@ -209,7 +209,7 @@ def start_synthesis_subprocess( # バージョンが見つからないエラー sub_proc_con.send("") continue - wave = _engine._synthesis_impl(query, speaker_id) + wave = _engine._synthesis_impl(query, style_id) with NamedTemporaryFile(delete=False) as f: soundfile.write( file=f, data=wave, samplerate=query.outputSamplingRate, format="WAV" From aac0ed070aec963ce407a8de1df27acc771c3030 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Wed, 6 Sep 2023 17:43:42 +0900 Subject: [PATCH 03/44] =?UTF-8?q?id=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF?= =?UTF-8?q?=E9=96=A2=E6=95=B0=E3=81=A8=E7=B4=B0=E9=83=A8=E3=81=AE=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 20 +++++++-- .../synthesis_engine/synthesis_engine_base.py | 41 +++++++++++++++---- 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/run.py b/run.py index 8fc2cddea..25831df22 100644 --- a/run.py +++ b/run.py @@ -82,6 +82,22 @@ get_save_dir, ) +import warnings + + +def id_checker(style_id: Optional[int], speaker_id: Optional[int]) -> int: + """ + style_idとspeaker_id両方ともNoneかNoneでないかをチェックし、 + どちらか片方しかNoneが存在しなければstyle_idを返す + """ + if style_id == speaker_id == None or (style_id != None and speaker_id != None): + raise ValueError("speaker_idとstyle_idが両方とも存在しないか、両方とも存在しています") + if speaker_id is not None: + warnings.warn("style_idに変更になりましたのこちらの利用を推奨しています") + style_id = speaker_id + speaker_id = None + return style_id + def b64encode_str(s): return base64.b64encode(s).decode("utf-8") @@ -475,18 +491,14 @@ def multi_synthesis( sampling_rate = queries[0].outputSamplingRate with NamedTemporaryFile(delete=False) as f: - with zipfile.ZipFile(f, mode="a") as zip_file: - for i in range(len(queries)): - if queries[i].outputSamplingRate != sampling_rate: raise HTTPException( status_code=422, detail="サンプリングレートが異なるクエリがあります" ) with TemporaryFile() as wav_file: - wave = engine.synthesis(query=queries[i], speaker_id=speaker) soundfile.write( file=wav_file, diff --git a/voicevox_engine/synthesis_engine/synthesis_engine_base.py b/voicevox_engine/synthesis_engine/synthesis_engine_base.py index 11e0f350e..f3f93e024 100644 --- a/voicevox_engine/synthesis_engine/synthesis_engine_base.py +++ b/voicevox_engine/synthesis_engine/synthesis_engine_base.py @@ -8,6 +8,7 @@ from ..full_context_label import extract_full_context_label from ..model import AccentPhrase, AudioQuery, Mora from ..mora_list import openjtalk_mora2text +from run import id_checker def mora_to_text(mora: str) -> str: @@ -92,7 +93,7 @@ def supported_devices(self) -> Optional[str]: raise NotImplementedError def initialize_speaker_synthesis( # noqa: B027 - self, style_id: int, skip_reinit: bool + self, style_id: Optional[int], speaker_id: Optional[int], skip_reinit: bool ): """ 指定した話者での音声合成を初期化する。何度も実行可能。 @@ -106,7 +107,9 @@ def initialize_speaker_synthesis( # noqa: B027 """ pass - def is_initialized_speaker_synthesis(self, style_id: int) -> bool: + def is_initialized_speaker_synthesis( + self, style_id: Optional[int], speaker_id: Optional[int] = None + ) -> bool: """ 指定した話者での音声合成が初期化されているかどうかを返す Parameters @@ -118,11 +121,15 @@ def is_initialized_speaker_synthesis(self, style_id: int) -> bool: bool 初期化されているかどうか """ + id_checker(style_id=style_id, speaker_id=speaker_id) return True @abstractmethod def replace_phoneme_length( - self, accent_phrases: List[AccentPhrase], style_id: int + self, + accent_phrases: List[AccentPhrase], + style_id: Optional[int], + speaker_id: Optional[int] = None, ) -> List[AccentPhrase]: """ accent_phrasesの母音・子音の長さを設定する @@ -137,11 +144,15 @@ def replace_phoneme_length( accent_phrases : List[AccentPhrase] 母音・子音の長さが設定されたアクセント句モデルのリスト """ + id_checker(style_id=style_id, speaker_id=speaker_id) raise NotImplementedError() @abstractmethod def replace_mora_pitch( - self, accent_phrases: List[AccentPhrase], style_id: int + self, + accent_phrases: List[AccentPhrase], + style_id: Optional[int], + speaker_id: Optional[int] = None, ) -> List[AccentPhrase]: """ accent_phrasesの音高(ピッチ)を設定する @@ -156,13 +167,16 @@ def replace_mora_pitch( accent_phrases : List[AccentPhrase] 音高(ピッチ)が設定されたアクセント句モデルのリスト """ + id_checker(style_id=style_id, speaker_id=speaker_id) raise NotImplementedError() def replace_mora_data( self, accent_phrases: List[AccentPhrase], - style_id: int, + style_id: Optional[int], + speaker_id: Optional[int] = None, ) -> List[AccentPhrase]: + style_id = id_checker(style_id=style_id, speaker_id=speaker_id) return self.replace_mora_pitch( accent_phrases=self.replace_phoneme_length( accent_phrases=accent_phrases, @@ -171,7 +185,10 @@ def replace_mora_data( style_id=style_id, ) - def create_accent_phrases(self, text: str, style_id: int) -> List[AccentPhrase]: + def create_accent_phrases( + self, text: str, style_id: Optional[int], speaker_id: Optional[int] = None + ) -> List[AccentPhrase]: + style_id = id_checker(style_id=style_id, speaker_id=speaker_id) if len(text.strip()) == 0: return [] @@ -213,7 +230,8 @@ def create_accent_phrases(self, text: str, style_id: int) -> List[AccentPhrase]: def synthesis( self, query: AudioQuery, - style_id: int, + style_id: Optional[int], + speaker_id: Optional[int] = None, enable_interrogative_upspeak: bool = True, ) -> np.ndarray: """ @@ -232,6 +250,7 @@ def synthesis( wave : numpy.ndarray 音声合成結果 """ + style_id = id_checker(style_id=style_id, speaker_id=speaker_id) # モーフィング時などに同一参照のqueryで複数回呼ばれる可能性があるので、元の引数のqueryに破壊的変更を行わない query = copy.deepcopy(query) if enable_interrogative_upspeak: @@ -241,7 +260,12 @@ def synthesis( return self._synthesis_impl(query, style_id) @abstractmethod - def _synthesis_impl(self, query: AudioQuery, style_id: int) -> np.ndarray: + def _synthesis_impl( + self, + query: AudioQuery, + style_id: Optional[int], + speaker_id: Optional[int] = None, + ) -> np.ndarray: """ 音声合成クエリから音声合成に必要な情報を構成し、実際に音声合成を行う Parameters @@ -255,4 +279,5 @@ def _synthesis_impl(self, query: AudioQuery, style_id: int) -> np.ndarray: wave : numpy.ndarray 音声合成結果 """ + id_checker(style_id=style_id, speaker_id=speaker_id) raise NotImplementedError() From ad51b7c2ef0de11938f24051a2e763e7a71584f9 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Wed, 6 Sep 2023 21:10:44 +0900 Subject: [PATCH 04/44] =?UTF-8?q?synthesis=5Fengine=5Fbase.py=E3=81=AE?= =?UTF-8?q?=E4=B8=80=E9=83=A8=E3=82=92=E6=9B=B8=E3=81=8D=E6=8F=9B=E3=81=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- voicevox_engine/synthesis_engine/synthesis_engine_base.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/voicevox_engine/synthesis_engine/synthesis_engine_base.py b/voicevox_engine/synthesis_engine/synthesis_engine_base.py index f3f93e024..4ee7bc1ce 100644 --- a/voicevox_engine/synthesis_engine/synthesis_engine_base.py +++ b/voicevox_engine/synthesis_engine/synthesis_engine_base.py @@ -93,7 +93,10 @@ def supported_devices(self) -> Optional[str]: raise NotImplementedError def initialize_speaker_synthesis( # noqa: B027 - self, style_id: Optional[int], speaker_id: Optional[int], skip_reinit: bool + self, + style_id: Optional[int], + skip_reinit: bool, + speaker_id: Optional[int] = None, ): """ 指定した話者での音声合成を初期化する。何度も実行可能。 From 6fdf5b48f44402c78e9bfadd88f7dcd42076770f Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Thu, 7 Sep 2023 11:33:58 +0900 Subject: [PATCH 05/44] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=AAspeaker=5Fid?= =?UTF-8?q?=E5=BC=95=E6=95=B0=E3=81=AE=E5=89=8A=E9=99=A4(synthesis=5Fengin?= =?UTF-8?q?e=5Fbase.py)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- voicevox_engine/synthesis_engine/synthesis_engine_base.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/voicevox_engine/synthesis_engine/synthesis_engine_base.py b/voicevox_engine/synthesis_engine/synthesis_engine_base.py index 4ee7bc1ce..506083ecc 100644 --- a/voicevox_engine/synthesis_engine/synthesis_engine_base.py +++ b/voicevox_engine/synthesis_engine/synthesis_engine_base.py @@ -96,7 +96,6 @@ def initialize_speaker_synthesis( # noqa: B027 self, style_id: Optional[int], skip_reinit: bool, - speaker_id: Optional[int] = None, ): """ 指定した話者での音声合成を初期化する。何度も実行可能。 @@ -267,7 +266,6 @@ def _synthesis_impl( self, query: AudioQuery, style_id: Optional[int], - speaker_id: Optional[int] = None, ) -> np.ndarray: """ 音声合成クエリから音声合成に必要な情報を構成し、実際に音声合成を行う @@ -282,5 +280,4 @@ def _synthesis_impl( wave : numpy.ndarray 音声合成結果 """ - id_checker(style_id=style_id, speaker_id=speaker_id) raise NotImplementedError() From 1916412e6260839f8d15f2f8bdf15d71edf68cb9 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Fri, 8 Sep 2023 23:50:15 +0900 Subject: [PATCH 06/44] =?UTF-8?q?id=5Fchecker=E3=81=AE=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E3=81=A8optional=E3=81=AE=E8=BF=BD=E5=8A=A0(cancellable=5Fengi?= =?UTF-8?q?ne.py)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- voicevox_engine/cancellable_engine.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/voicevox_engine/cancellable_engine.py b/voicevox_engine/cancellable_engine.py index 913a8175d..364c5747c 100644 --- a/voicevox_engine/cancellable_engine.py +++ b/voicevox_engine/cancellable_engine.py @@ -14,6 +14,7 @@ from .model import AudioQuery from .synthesis_engine import make_synthesis_engines from .utility import get_latest_core_version +from run import id_checker class CancellableEngine: @@ -115,9 +116,10 @@ def finalize_con( def _synthesis_impl( self, query: AudioQuery, - style_id: int, + style_id: Optional[int], request: Request, core_version: Optional[str], + speaker_id: Optional[int] = None, ) -> str: """ 音声合成を行う関数 @@ -138,6 +140,7 @@ def _synthesis_impl( f_name: str 生成された音声ファイルの名前 """ + style_id = id_checker(style_id=style_id, speaker_id=speaker_id) proc, sub_proc_con1 = self.procs_and_cons.get() self.watch_con_list.append((request, proc)) try: From dc66cb57a085664e0e1f8b62711c49fbc8197888 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Sat, 9 Sep 2023 22:49:04 +0900 Subject: [PATCH 07/44] =?UTF-8?q?speaker=5Fid=E3=82=92style=5Fid=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4(morphing.py)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- voicevox_engine/morphing.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/voicevox_engine/morphing.py b/voicevox_engine/morphing.py index d857aa11d..afb341914 100644 --- a/voicevox_engine/morphing.py +++ b/voicevox_engine/morphing.py @@ -141,10 +141,8 @@ def synthesis_morphing_parameter( # WORLDに掛けるため合成はモノラルで行う query.outputStereo = False - base_wave = engine.synthesis(query=query, speaker_id=base_speaker).astype("float") - target_wave = engine.synthesis(query=query, speaker_id=target_speaker).astype( - "float" - ) + base_wave = engine.synthesis(query=query, style_id=base_speaker).astype("float") + target_wave = engine.synthesis(query=query, style_id=target_speaker).astype("float") return create_morphing_parameter( base_wave=base_wave, From b914e9c5218d51325a6aff4138de362c2f690de9 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Tue, 19 Sep 2023 22:25:21 +0900 Subject: [PATCH 08/44] =?UTF-8?q?speaker=5Fid=E3=82=92style=5Fid=E3=81=AB(?= =?UTF-8?q?mock.py)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- voicevox_engine/dev/synthesis_engine/mock.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/voicevox_engine/dev/synthesis_engine/mock.py b/voicevox_engine/dev/synthesis_engine/mock.py index 3a1b47ac3..37880e0c2 100644 --- a/voicevox_engine/dev/synthesis_engine/mock.py +++ b/voicevox_engine/dev/synthesis_engine/mock.py @@ -38,7 +38,7 @@ def supported_devices(self) -> Optional[str]: return self._supported_devices def replace_phoneme_length( - self, accent_phrases: List[AccentPhrase], speaker_id: int + self, accent_phrases: List[AccentPhrase], style_id: int ) -> List[AccentPhrase]: """ replace_phoneme_length 入力accent_phrasesを変更せずにそのまま返します [Mock] @@ -47,8 +47,8 @@ def replace_phoneme_length( ---------- accent_phrases : List[AccentPhrase] フレーズ句のリスト - speaker_id : int - 話者 + style_id : int + スタイルID Returns ------- @@ -58,7 +58,7 @@ def replace_phoneme_length( return accent_phrases def replace_mora_pitch( - self, accent_phrases: List[AccentPhrase], speaker_id: int + self, accent_phrases: List[AccentPhrase], style_id: int ) -> List[AccentPhrase]: """ replace_mora_pitch 入力accent_phrasesを変更せずにそのまま返します [Mock] @@ -67,8 +67,8 @@ def replace_mora_pitch( ---------- accent_phrases : List[AccentPhrase] フレーズ句のリスト - speaker_id : int - 話者 + style_id : int + スタイルID Returns ------- @@ -77,7 +77,7 @@ def replace_mora_pitch( """ return accent_phrases - def _synthesis_impl(self, query: AudioQuery, speaker_id: int) -> np.ndarray: + def _synthesis_impl(self, query: AudioQuery, style_id: int) -> np.ndarray: """ synthesis voicevox coreを使わずに、音声合成する [Mock] @@ -85,8 +85,8 @@ def _synthesis_impl(self, query: AudioQuery, speaker_id: int) -> np.ndarray: ---------- query : AudioQuery /audio_query APIで得たjson - speaker_id : int - 話者 + style_id : int + スタイルID Returns ------- From 4cab2090bf7d7831cb580e5875b287823c57ccd1 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Tue, 19 Sep 2023 22:54:22 +0900 Subject: [PATCH 09/44] =?UTF-8?q?speaker=5Fid=E3=82=92style=5Fid=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4(synthesis=5Fengine.py)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../synthesis_engine/synthesis_engine.py | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/voicevox_engine/synthesis_engine/synthesis_engine.py b/voicevox_engine/synthesis_engine/synthesis_engine.py index f617e94a2..1d6ba5d7a 100644 --- a/voicevox_engine/synthesis_engine/synthesis_engine.py +++ b/voicevox_engine/synthesis_engine/synthesis_engine.py @@ -136,7 +136,7 @@ def __init__( core.yukarin_s_forward: 音素列から、音素ごとの長さを求める関数 length: 音素列の長さ phoneme_list: 音素列 - speaker_id: 話者番号 + style_id: スタイル番号 return: 音素ごとの長さ core.yukarin_sa_forward: モーラごとの音素列とアクセント情報から、モーラごとの音高を求める関数 @@ -147,7 +147,7 @@ def __init__( end_accent_list: アクセントの終了位置 start_accent_phrase_list: アクセント句の開始位置 end_accent_phrase_list: アクセント句の終了位置 - speaker_id: 話者番号 + style_id: スタイル番号 return: モーラごとの音高 core.decode_forward: フレームごとの音素と音高から波形を求める関数 @@ -155,7 +155,7 @@ def __init__( phoneme_size: 音素の種類数 f0: フレームごとの音高 phoneme: フレームごとの音素 - speaker_id: 話者番号 + style_id: スタイル番号 return: 音声波形 speakers: coreから取得したspeakersに関するjsonデータの文字列 @@ -182,25 +182,25 @@ def speakers(self) -> str: def supported_devices(self) -> Optional[str]: return self._supported_devices - def initialize_speaker_synthesis(self, speaker_id: int, skip_reinit: bool): + def initialize_speaker_synthesis(self, style_id: int, skip_reinit: bool): try: with self.mutex: # 以下の条件のいずれかを満たす場合, 初期化を実行する # 1. 引数 skip_reinit が False の場合 # 2. 話者が初期化されていない場合 - if (not skip_reinit) or (not self.core.is_model_loaded(speaker_id)): - self.core.load_model(speaker_id) + if (not skip_reinit) or (not self.core.is_model_loaded(style_id)): + self.core.load_model(style_id) except OldCoreError: pass # コアが古い場合はどうしようもないので何もしない - def is_initialized_speaker_synthesis(self, speaker_id: int) -> bool: + def is_initialized_speaker_synthesis(self, style_id: int) -> bool: try: - return self.core.is_model_loaded(speaker_id) + return self.core.is_model_loaded(style_id) except OldCoreError: return True # コアが古い場合はどうしようもないのでTrueを返す def replace_phoneme_length( - self, accent_phrases: List[AccentPhrase], speaker_id: int + self, accent_phrases: List[AccentPhrase], style_id: int ) -> List[AccentPhrase]: """ accent_phrasesの母音・子音の長さを設定する @@ -208,15 +208,15 @@ def replace_phoneme_length( ---------- accent_phrases : List[AccentPhrase] アクセント句モデルのリスト - speaker_id : int - 話者ID + style_id : int + スタイルID Returns ------- accent_phrases : List[AccentPhrase] 母音・子音の長さが設定されたアクセント句モデルのリスト """ # モデルがロードされていない場合はロードする - self.initialize_speaker_synthesis(speaker_id, skip_reinit=True) + self.initialize_speaker_synthesis(style_id, skip_reinit=True) # phoneme # AccentPhraseをすべてMoraおよびOjtPhonemeの形に分解し、処理可能な形にする flatten_moras, phoneme_data_list = pre_process(accent_phrases) @@ -233,7 +233,7 @@ def replace_phoneme_length( phoneme_length = self.core.yukarin_s_forward( length=len(phoneme_list_s), phoneme_list=phoneme_list_s, - speaker_id=numpy.array(speaker_id, dtype=numpy.int64).reshape(-1), + style_id=numpy.array(style_id, dtype=numpy.int64).reshape(-1), ) # yukarin_s_forwarderの結果をaccent_phrasesに反映する @@ -249,7 +249,7 @@ def replace_phoneme_length( return accent_phrases def replace_mora_pitch( - self, accent_phrases: List[AccentPhrase], speaker_id: int + self, accent_phrases: List[AccentPhrase], style_id: int ) -> List[AccentPhrase]: """ accent_phrasesの音高(ピッチ)を設定する @@ -257,15 +257,15 @@ def replace_mora_pitch( ---------- accent_phrases : List[AccentPhrase] アクセント句モデルのリスト - speaker_id : int - 話者ID + style_id : int + スタイルID Returns ------- accent_phrases : List[AccentPhrase] 音高(ピッチ)が設定されたアクセント句モデルのリスト """ # モデルがロードされていない場合はロードする - self.initialize_speaker_synthesis(speaker_id, skip_reinit=True) + self.initialize_speaker_synthesis(style_id, skip_reinit=True) # numpy.concatenateが空リストだとエラーを返すのでチェック if len(accent_phrases) == 0: return [] @@ -375,7 +375,7 @@ def _create_one_hot(accent_phrase: AccentPhrase, position: int): end_accent_list=end_accent_list[numpy.newaxis], start_accent_phrase_list=start_accent_phrase_list[numpy.newaxis], end_accent_phrase_list=end_accent_phrase_list[numpy.newaxis], - speaker_id=numpy.array(speaker_id, dtype=numpy.int64).reshape(-1), + style_id=numpy.array(style_id, dtype=numpy.int64).reshape(-1), )[0] # 無声母音を含むMoraに関しては、音高(ピッチ)を0にする @@ -390,22 +390,22 @@ def _create_one_hot(accent_phrase: AccentPhrase, position: int): return accent_phrases - def _synthesis_impl(self, query: AudioQuery, speaker_id: int): + def _synthesis_impl(self, query: AudioQuery, style_id: int): """ 音声合成クエリから音声合成に必要な情報を構成し、実際に音声合成を行う Parameters ---------- query : AudioQuery 音声合成クエリ - speaker_id : int - 話者ID + style_id : int + スタイルID Returns ------- wave : numpy.ndarray 音声合成結果 """ # モデルがロードされていない場合はロードする - self.initialize_speaker_synthesis(speaker_id, skip_reinit=True) + self.initialize_speaker_synthesis(style_id, skip_reinit=True) # phoneme # AccentPhraseをすべてMoraおよびOjtPhonemeの形に分解し、処理可能な形にする flatten_moras, phoneme_data_list = pre_process(query.accent_phrases) @@ -481,7 +481,7 @@ def _synthesis_impl(self, query: AudioQuery, speaker_id: int): phoneme_size=phoneme.shape[1], f0=f0[:, numpy.newaxis], phoneme=phoneme, - speaker_id=numpy.array(speaker_id, dtype=numpy.int64).reshape(-1), + style_id=numpy.array(style_id, dtype=numpy.int64).reshape(-1), ) # volume: ゲイン適用 From 7432d91c1683a27ff62bc4968524b62f4b07faa3 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Tue, 19 Sep 2023 23:18:20 +0900 Subject: [PATCH 10/44] =?UTF-8?q?speaker=5Fid=E3=82=92style=5Fid=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4(corewrapper.py)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../synthesis_engine/core_wrapper.py | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/voicevox_engine/synthesis_engine/core_wrapper.py b/voicevox_engine/synthesis_engine/core_wrapper.py index fe8f97787..b3852133f 100644 --- a/voicevox_engine/synthesis_engine/core_wrapper.py +++ b/voicevox_engine/synthesis_engine/core_wrapper.py @@ -443,14 +443,14 @@ def yukarin_s_forward( self, length: int, phoneme_list: np.ndarray, - speaker_id: np.ndarray, + style_id: np.ndarray, ) -> np.ndarray: output = np.zeros((length,), dtype=np.float32) self.assert_core_success( self.core.yukarin_s_forward( c_int(length), phoneme_list.ctypes.data_as(POINTER(c_long)), - speaker_id.ctypes.data_as(POINTER(c_long)), + style_id.ctypes.data_as(POINTER(c_long)), output.ctypes.data_as(POINTER(c_float)), ) ) @@ -465,11 +465,11 @@ def yukarin_sa_forward( end_accent_list: np.ndarray, start_accent_phrase_list: np.ndarray, end_accent_phrase_list: np.ndarray, - speaker_id: np.ndarray, + style_id: np.ndarray, ) -> np.ndarray: output = np.empty( ( - len(speaker_id), + len(style_id), length, ), dtype=np.float32, @@ -483,7 +483,7 @@ def yukarin_sa_forward( end_accent_list.ctypes.data_as(POINTER(c_long)), start_accent_phrase_list.ctypes.data_as(POINTER(c_long)), end_accent_phrase_list.ctypes.data_as(POINTER(c_long)), - speaker_id.ctypes.data_as(POINTER(c_long)), + style_id.ctypes.data_as(POINTER(c_long)), output.ctypes.data_as(POINTER(c_float)), ) ) @@ -495,7 +495,7 @@ def decode_forward( phoneme_size: int, f0: np.ndarray, phoneme: np.ndarray, - speaker_id: np.ndarray, + style_id: np.ndarray, ) -> np.ndarray: output = np.empty((length * 256,), dtype=np.float32) self.assert_core_success( @@ -504,7 +504,7 @@ def decode_forward( c_int(phoneme_size), f0.ctypes.data_as(POINTER(c_float)), phoneme.ctypes.data_as(POINTER(c_float)), - speaker_id.ctypes.data_as(POINTER(c_long)), + style_id.ctypes.data_as(POINTER(c_long)), output.ctypes.data_as(POINTER(c_float)), ) ) @@ -521,14 +521,14 @@ def finalize(self) -> None: return raise OldCoreError - def load_model(self, speaker_id: int) -> None: + def load_model(self, style_id: int) -> None: if self.exist_load_model: - self.assert_core_success(self.core.load_model(c_long(speaker_id))) + self.assert_core_success(self.core.load_model(c_long(style_id))) raise OldCoreError - def is_model_loaded(self, speaker_id: int) -> bool: + def is_model_loaded(self, style_id: int) -> bool: if self.exist_is_model_loaded: - return self.core.is_model_loaded(c_long(speaker_id)) + return self.core.is_model_loaded(c_long(style_id)) raise OldCoreError def assert_core_success(self, result: bool) -> None: From 9f6305ab3c66c044594bfcb702bfe0c2307d00d7 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Tue, 19 Sep 2023 23:21:30 +0900 Subject: [PATCH 11/44] =?UTF-8?q?speaker=5Fid=E3=82=92style=5Fid=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4(run.py)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/run.py b/run.py index 25831df22..82ab16eb0 100644 --- a/run.py +++ b/run.py @@ -244,7 +244,7 @@ def audio_query(text: str, speaker: int, core_version: Optional[str] = None): クエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。 """ engine = get_engine(core_version) - accent_phrases = engine.create_accent_phrases(text, speaker_id=speaker) + accent_phrases = engine.create_accent_phrases(text, style_id=speaker) return AudioQuery( accent_phrases=accent_phrases, speedScale=1, @@ -283,7 +283,7 @@ def audio_query_from_preset( raise HTTPException(status_code=422, detail="該当するプリセットIDが見つかりません") accent_phrases = engine.create_accent_phrases( - text, speaker_id=selected_preset.style_id + text, style_id=selected_preset.style_id ) return AudioQuery( accent_phrases=accent_phrases, @@ -335,12 +335,12 @@ def accent_phrases( detail=ParseKanaBadRequest(err).dict(), ) accent_phrases = engine.replace_mora_data( - accent_phrases=accent_phrases, speaker_id=speaker + accent_phrases=accent_phrases, style_id=speaker ) return accent_phrases else: - return engine.create_accent_phrases(text, speaker_id=speaker) + return engine.create_accent_phrases(text, style_id=speaker) @app.post( "/mora_data", @@ -354,7 +354,7 @@ def mora_data( core_version: Optional[str] = None, ): engine = get_engine(core_version) - return engine.replace_mora_data(accent_phrases, speaker_id=speaker) + return engine.replace_mora_data(accent_phrases, style_id=speaker) @app.post( "/mora_length", @@ -369,7 +369,7 @@ def mora_length( ): engine = get_engine(core_version) return engine.replace_phoneme_length( - accent_phrases=accent_phrases, speaker_id=speaker + accent_phrases=accent_phrases, style_id=speaker ) @app.post( @@ -385,7 +385,7 @@ def mora_pitch( ): engine = get_engine(core_version) return engine.replace_mora_pitch( - accent_phrases=accent_phrases, speaker_id=speaker + accent_phrases=accent_phrases, style_id=speaker ) @app.post( @@ -413,7 +413,7 @@ def synthesis( engine = get_engine(core_version) wave = engine.synthesis( query=query, - speaker_id=speaker, + style_id=speaker, enable_interrogative_upspeak=enable_interrogative_upspeak, ) @@ -454,7 +454,7 @@ def cancellable_synthesis( ) f_name = cancellable_engine._synthesis_impl( query=query, - speaker_id=speaker, + style_id=speaker, request=request, core_version=core_version, ) @@ -499,7 +499,7 @@ def multi_synthesis( ) with TemporaryFile() as wav_file: - wave = engine.synthesis(query=queries[i], speaker_id=speaker) + wave = engine.synthesis(query=queries[i], style_id=speaker) soundfile.write( file=wav_file, data=wave, @@ -905,17 +905,17 @@ def initialize_speaker( core_version: Optional[str] = None, ): """ - 指定されたspeaker_idの話者を初期化します。 + 指定されたstyle_idの話者を初期化します。 実行しなくても他のAPIは使用できますが、初回実行時に時間がかかることがあります。 """ engine = get_engine(core_version) - engine.initialize_speaker_synthesis(speaker_id=speaker, skip_reinit=skip_reinit) + engine.initialize_speaker_synthesis(style_id=speaker, skip_reinit=skip_reinit) return Response(status_code=204) @app.get("/is_initialized_speaker", response_model=bool, tags=["その他"]) def is_initialized_speaker(speaker: int, core_version: Optional[str] = None): """ - 指定されたspeaker_idの話者が初期化されているかどうかを返します。 + 指定されたstyle_idの話者が初期化されているかどうかを返します。 """ engine = get_engine(core_version) return engine.is_initialized_speaker_synthesis(speaker) From f7cd30fc9431a92b4de6f777adeafacb12763607 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Tue, 19 Sep 2023 23:24:54 +0900 Subject: [PATCH 12/44] =?UTF-8?q?speaker=5Fid=E3=82=92style=5Fid=E3=81=AB?= =?UTF-8?q?=20(test=5Fmock=5Fsynthesis=5Fengine.py)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_mock_synthesis_engine.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/test_mock_synthesis_engine.py b/test/test_mock_synthesis_engine.py index c06a0504a..ce6c59825 100644 --- a/test/test_mock_synthesis_engine.py +++ b/test/test_mock_synthesis_engine.py @@ -108,7 +108,7 @@ def test_replace_phoneme_length(self): self.assertEqual( self.engine.replace_phoneme_length( accent_phrases=self.accent_phrases_hello_hiho, - speaker_id=0, + style_id=0, ), self.accent_phrases_hello_hiho, ) @@ -117,7 +117,7 @@ def test_replace_mora_pitch(self): self.assertEqual( self.engine.replace_mora_pitch( accent_phrases=self.accent_phrases_hello_hiho, - speaker_id=0, + style_id=0, ), self.accent_phrases_hello_hiho, ) @@ -136,5 +136,5 @@ def test_synthesis(self): outputStereo=False, kana=create_kana(self.accent_phrases_hello_hiho), ), - speaker_id=0, + style_id=0, ) From d6852fabeb7b38202300a3b22e25f9473192ffee Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Sat, 23 Sep 2023 23:41:29 +0900 Subject: [PATCH 13/44] =?UTF-8?q?speaker=5Fid=E3=82=92style=5Fid=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4(test=5Fshynthesis=5Fengine=5Fbase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_synthesis_engine_base.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/test_synthesis_engine_base.py b/test/test_synthesis_engine_base.py index 63f976a0e..5f994bc98 100644 --- a/test/test_synthesis_engine_base.py +++ b/test/test_synthesis_engine_base.py @@ -24,7 +24,7 @@ def yukarin_sa_mock( end_accent_list: numpy.ndarray, start_accent_phrase_list: numpy.ndarray, end_accent_phrase_list: numpy.ndarray, - speaker_id: numpy.ndarray, + style_id: numpy.ndarray, ): result = [] # mockとしての適当な処理、特に意味はない @@ -41,7 +41,7 @@ def yukarin_sa_mock( + end_accent_phrase_list[0][i] ) * 0.0625 - + speaker_id + + style_id ), 2, ) @@ -54,7 +54,7 @@ def decode_mock( phoneme_size: int, f0: numpy.ndarray, phoneme: numpy.ndarray, - speaker_id: Union[numpy.ndarray, int], + style_id: Union[numpy.ndarray, int], ): result = [] # mockとしての適当な処理、特に意味はない @@ -64,7 +64,7 @@ def decode_mock( result.append( float( f0[i][0] * (numpy.where(phoneme[i] == 1)[0] / phoneme_size) - + speaker_id + + style_id ) ) return numpy.array(result) @@ -179,7 +179,7 @@ def metas(self): def supported_devices(self): return "" - def is_model_loaded(self, speaker_id): + def is_model_loaded(self, style_id): return True From 831407349b358c2575ab7e9287afc4894da131bf Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Sat, 23 Sep 2023 23:42:35 +0900 Subject: [PATCH 14/44] =?UTF-8?q?speaker=5Fid=E3=82=92style=5Fid=E3=81=AB(?= =?UTF-8?q?test=5Fsynthesis=5Fengine.py)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_synthesis_engine.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/test/test_synthesis_engine.py b/test/test_synthesis_engine.py index b1a217416..c7d992293 100644 --- a/test/test_synthesis_engine.py +++ b/test/test_synthesis_engine.py @@ -22,11 +22,11 @@ ) -def yukarin_s_mock(length: int, phoneme_list: numpy.ndarray, speaker_id: numpy.ndarray): +def yukarin_s_mock(length: int, phoneme_list: numpy.ndarray, style_id: numpy.ndarray): result = [] # mockとしての適当な処理、特に意味はない for i in range(length): - result.append(float(phoneme_list[i] * 0.5 + speaker_id)) + result.append(float(phoneme_list[i] * 0.5 + style_id)) return numpy.array(result) @@ -38,7 +38,7 @@ def yukarin_sa_mock( end_accent_list: numpy.ndarray, start_accent_phrase_list: numpy.ndarray, end_accent_phrase_list: numpy.ndarray, - speaker_id: numpy.ndarray, + style_id: numpy.ndarray, ): result = [] # mockとしての適当な処理、特に意味はない @@ -54,7 +54,7 @@ def yukarin_sa_mock( + end_accent_phrase_list[0][i] ) * 0.5 - + speaker_id + + style_id ) ) return numpy.array(result)[numpy.newaxis] @@ -65,7 +65,7 @@ def decode_mock( phoneme_size: int, f0: numpy.ndarray, phoneme: numpy.ndarray, - speaker_id: Union[numpy.ndarray, int], + style_id: Union[numpy.ndarray, int], ): result = [] # mockとしての適当な処理、特に意味はない @@ -75,7 +75,7 @@ def decode_mock( result.append( float( f0[i][0] * (numpy.where(phoneme[i] == 1)[0] / phoneme_size) - + speaker_id + + style_id ) ) return numpy.array(result) @@ -92,7 +92,7 @@ def metas(self): def supported_devices(self): return "" - def is_model_loaded(self, speaker_id): + def is_model_loaded(self, style_id): return True @@ -303,7 +303,7 @@ def test_pre_process(self): def test_replace_phoneme_length(self): result = self.synthesis_engine.replace_phoneme_length( - accent_phrases=deepcopy(self.accent_phrases_hello_hiho), speaker_id=1 + accent_phrases=deepcopy(self.accent_phrases_hello_hiho), style_id=1 ) # yukarin_sに渡される値の検証 @@ -340,7 +340,7 @@ def test_replace_phoneme_length(self): dtype=numpy.int64, ), ) - self.assertEqual(yukarin_s_args["speaker_id"], 1) + self.assertEqual(yukarin_s_args["style_id"], 1) # flatten_morasを使わずに愚直にaccent_phrasesにデータを反映させてみる true_result = deepcopy(self.accent_phrases_hello_hiho) @@ -368,13 +368,13 @@ def test_replace_mora_pitch(self): empty_accent_phrases = [] self.assertEqual( self.synthesis_engine.replace_mora_pitch( - accent_phrases=empty_accent_phrases, speaker_id=1 + accent_phrases=empty_accent_phrases, style_id=1 ), [], ) result = self.synthesis_engine.replace_mora_pitch( - accent_phrases=deepcopy(self.accent_phrases_hello_hiho), speaker_id=1 + accent_phrases=deepcopy(self.accent_phrases_hello_hiho), style_id=1 ) # yukarin_saに渡される値の検証 @@ -393,7 +393,7 @@ def test_replace_mora_pitch(self): self.assertEqual(list_length, len(end_accent_list)) self.assertEqual(list_length, len(start_accent_phrase_list)) self.assertEqual(list_length, len(end_accent_phrase_list)) - self.assertEqual(yukarin_sa_args["speaker_id"], 1) + self.assertEqual(yukarin_sa_args["style_id"], 1) numpy.testing.assert_array_equal( vowel_phoneme_list, @@ -512,7 +512,7 @@ def synthesis_test_base(self, audio_query: AudioQuery): for i in range(len(phoneme_length_list)): phoneme_length_list[i] /= audio_query.speedScale - result = self.synthesis_engine.synthesis(query=audio_query, speaker_id=1) + result = self.synthesis_engine.synthesis(query=audio_query, style_id=1) # decodeに渡される値の検証 decode_args = self.decode_mock.call_args[1] @@ -577,7 +577,7 @@ def synthesis_test_base(self, audio_query: AudioQuery): assert_true_count += bool(phoneme[i][j] == decode_phoneme[i][j]) assert_phoneme_count += assert_true_count == num_phoneme self.assertTrue(assert_phoneme_count >= int(len(decode_phoneme) / 5) * 4) - self.assertEqual(decode_args["speaker_id"], 1) + self.assertEqual(decode_args["style_id"], 1) # decode forwarderのmockを使う true_result = decode_mock(list_length, num_phoneme, f0, phoneme, 1) From 7012a1b72c908f9c8c898d2479709cde591f0223 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Wed, 11 Oct 2023 23:58:20 +0900 Subject: [PATCH 15/44] =?UTF-8?q?optional=E3=81=AE=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../synthesis_engine/synthesis_engine_base.py | 33 +++++-------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/voicevox_engine/synthesis_engine/synthesis_engine_base.py b/voicevox_engine/synthesis_engine/synthesis_engine_base.py index 506083ecc..271bd9f2a 100644 --- a/voicevox_engine/synthesis_engine/synthesis_engine_base.py +++ b/voicevox_engine/synthesis_engine/synthesis_engine_base.py @@ -8,7 +8,6 @@ from ..full_context_label import extract_full_context_label from ..model import AccentPhrase, AudioQuery, Mora from ..mora_list import openjtalk_mora2text -from run import id_checker def mora_to_text(mora: str) -> str: @@ -94,7 +93,7 @@ def supported_devices(self) -> Optional[str]: def initialize_speaker_synthesis( # noqa: B027 self, - style_id: Optional[int], + style_id: int, skip_reinit: bool, ): """ @@ -109,9 +108,7 @@ def initialize_speaker_synthesis( # noqa: B027 """ pass - def is_initialized_speaker_synthesis( - self, style_id: Optional[int], speaker_id: Optional[int] = None - ) -> bool: + def is_initialized_speaker_synthesis(self, style_id: int) -> bool: """ 指定した話者での音声合成が初期化されているかどうかを返す Parameters @@ -123,15 +120,11 @@ def is_initialized_speaker_synthesis( bool 初期化されているかどうか """ - id_checker(style_id=style_id, speaker_id=speaker_id) return True @abstractmethod def replace_phoneme_length( - self, - accent_phrases: List[AccentPhrase], - style_id: Optional[int], - speaker_id: Optional[int] = None, + self, accent_phrases: List[AccentPhrase], style_id: int ) -> List[AccentPhrase]: """ accent_phrasesの母音・子音の長さを設定する @@ -146,15 +139,13 @@ def replace_phoneme_length( accent_phrases : List[AccentPhrase] 母音・子音の長さが設定されたアクセント句モデルのリスト """ - id_checker(style_id=style_id, speaker_id=speaker_id) raise NotImplementedError() @abstractmethod def replace_mora_pitch( self, accent_phrases: List[AccentPhrase], - style_id: Optional[int], - speaker_id: Optional[int] = None, + style_id: int, ) -> List[AccentPhrase]: """ accent_phrasesの音高(ピッチ)を設定する @@ -169,16 +160,13 @@ def replace_mora_pitch( accent_phrases : List[AccentPhrase] 音高(ピッチ)が設定されたアクセント句モデルのリスト """ - id_checker(style_id=style_id, speaker_id=speaker_id) raise NotImplementedError() def replace_mora_data( self, accent_phrases: List[AccentPhrase], - style_id: Optional[int], - speaker_id: Optional[int] = None, + style_id: int, ) -> List[AccentPhrase]: - style_id = id_checker(style_id=style_id, speaker_id=speaker_id) return self.replace_mora_pitch( accent_phrases=self.replace_phoneme_length( accent_phrases=accent_phrases, @@ -187,10 +175,7 @@ def replace_mora_data( style_id=style_id, ) - def create_accent_phrases( - self, text: str, style_id: Optional[int], speaker_id: Optional[int] = None - ) -> List[AccentPhrase]: - style_id = id_checker(style_id=style_id, speaker_id=speaker_id) + def create_accent_phrases(self, text: str, style_id: int) -> List[AccentPhrase]: if len(text.strip()) == 0: return [] @@ -232,8 +217,7 @@ def create_accent_phrases( def synthesis( self, query: AudioQuery, - style_id: Optional[int], - speaker_id: Optional[int] = None, + style_id: int, enable_interrogative_upspeak: bool = True, ) -> np.ndarray: """ @@ -252,7 +236,6 @@ def synthesis( wave : numpy.ndarray 音声合成結果 """ - style_id = id_checker(style_id=style_id, speaker_id=speaker_id) # モーフィング時などに同一参照のqueryで複数回呼ばれる可能性があるので、元の引数のqueryに破壊的変更を行わない query = copy.deepcopy(query) if enable_interrogative_upspeak: @@ -265,7 +248,7 @@ def synthesis( def _synthesis_impl( self, query: AudioQuery, - style_id: Optional[int], + style_id: int, ) -> np.ndarray: """ 音声合成クエリから音声合成に必要な情報を構成し、実際に音声合成を行う From 88929bc84ede2d1e8da751e58d8a0240504f45bb Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Thu, 12 Oct 2023 00:13:46 +0900 Subject: [PATCH 16/44] =?UTF-8?q?optional=E3=81=AE=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- voicevox_engine/cancellable_engine.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/voicevox_engine/cancellable_engine.py b/voicevox_engine/cancellable_engine.py index 364c5747c..913a8175d 100644 --- a/voicevox_engine/cancellable_engine.py +++ b/voicevox_engine/cancellable_engine.py @@ -14,7 +14,6 @@ from .model import AudioQuery from .synthesis_engine import make_synthesis_engines from .utility import get_latest_core_version -from run import id_checker class CancellableEngine: @@ -116,10 +115,9 @@ def finalize_con( def _synthesis_impl( self, query: AudioQuery, - style_id: Optional[int], + style_id: int, request: Request, core_version: Optional[str], - speaker_id: Optional[int] = None, ) -> str: """ 音声合成を行う関数 @@ -140,7 +138,6 @@ def _synthesis_impl( f_name: str 生成された音声ファイルの名前 """ - style_id = id_checker(style_id=style_id, speaker_id=speaker_id) proc, sub_proc_con1 = self.procs_and_cons.get() self.watch_con_list.append((request, proc)) try: From 2ddc62c9f47553ce35ba4167f5b87eea18517ee3 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Thu, 12 Oct 2023 00:35:11 +0900 Subject: [PATCH 17/44] =?UTF-8?q?id=5Fchecker=E9=96=A2=E6=95=B0=E3=81=AE?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/run.py b/run.py index 82ab16eb0..cc489235f 100644 --- a/run.py +++ b/run.py @@ -90,10 +90,12 @@ def id_checker(style_id: Optional[int], speaker_id: Optional[int]) -> int: style_idとspeaker_id両方ともNoneかNoneでないかをチェックし、 どちらか片方しかNoneが存在しなければstyle_idを返す """ - if style_id == speaker_id == None or (style_id != None and speaker_id != None): - raise ValueError("speaker_idとstyle_idが両方とも存在しないか、両方とも存在しています") + if (style_id is None and speaker_id is None) or ( + style_id is not None and speaker_id is not None + ): + raise ValueError("speaker_idとstyle_idが両方とも存在しないか、両方とも存在しています。") if speaker_id is not None: - warnings.warn("style_idに変更になりましたのこちらの利用を推奨しています") + warnings.warn("speaker_idは非推奨です。style_idの利用を推奨しています。") style_id = speaker_id speaker_id = None return style_id From 48ebb63f3f4ce70a416c9a2d88c7446ab2b3dd87 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Thu, 12 Oct 2023 01:21:00 +0900 Subject: [PATCH 18/44] =?UTF-8?q?id=5Fchecker=E9=96=A2=E6=95=B0=E3=81=AE?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=81=A8=E3=81=9D=E3=81=AE=E9=96=A2=E6=95=B0?= =?UTF-8?q?=E3=81=AB=E3=82=88=E3=82=8Baudio=5Fquery=E9=96=A2=E6=95=B0?= =?UTF-8?q?=E3=81=AE=E4=B8=80=E9=83=A8=E3=82=92=E8=BF=BD=E5=8A=A0=E3=83=BB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/run.py b/run.py index cc489235f..1061745e5 100644 --- a/run.py +++ b/run.py @@ -93,9 +93,11 @@ def id_checker(style_id: Optional[int], speaker_id: Optional[int]) -> int: if (style_id is None and speaker_id is None) or ( style_id is not None and speaker_id is not None ): - raise ValueError("speaker_idとstyle_idが両方とも存在しないか、両方とも存在しています。") + raise HTTPException( + status_code=404, detail="speakerとstyle_idが両方とも存在しないか、両方とも存在しています。" + ) if speaker_id is not None: - warnings.warn("speaker_idは非推奨です。style_idの利用を推奨しています。") + warnings.warn("speakerは非推奨です。style_idの利用を推奨しています。") style_id = speaker_id speaker_id = None return style_id @@ -241,10 +243,16 @@ def get_engine(core_version: Optional[str]) -> SynthesisEngineBase: tags=["クエリ作成"], summary="音声合成用のクエリを作成する", ) - def audio_query(text: str, speaker: int, core_version: Optional[str] = None): + def audio_query( + text: str, + style_id: Optional[int] = Query(default=None), + speaker: Optional[int] = Query(default=None, deprecated=True), + core_version: Optional[str] = None, + ): """ クエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。 """ + style_id = id_checker(style_id=style_id, speaker_id=speaker) engine = get_engine(core_version) accent_phrases = engine.create_accent_phrases(text, style_id=speaker) return AudioQuery( From b1a3420030134daf7de660c631b087752b605826 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Thu, 12 Oct 2023 01:22:34 +0900 Subject: [PATCH 19/44] =?UTF-8?q?id=5Fchecker=E9=96=A2=E6=95=B0=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run.py b/run.py index 1061745e5..17f740e0e 100644 --- a/run.py +++ b/run.py @@ -94,7 +94,7 @@ def id_checker(style_id: Optional[int], speaker_id: Optional[int]) -> int: style_id is not None and speaker_id is not None ): raise HTTPException( - status_code=404, detail="speakerとstyle_idが両方とも存在しないか、両方とも存在しています。" + status_code=400, detail="speakerとstyle_idが両方とも存在しないか、両方とも存在しています。" ) if speaker_id is not None: warnings.warn("speakerは非推奨です。style_idの利用を推奨しています。") From 09160efc29f327df0464f4c8bbc9a933d828f1b6 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Thu, 12 Oct 2023 01:50:18 +0900 Subject: [PATCH 20/44] =?UTF-8?q?audio=5Fquery=E9=96=A2=E6=95=B0=E3=81=AEs?= =?UTF-8?q?peaker=E3=82=92style=5Fid=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run.py b/run.py index 17f740e0e..05549193b 100644 --- a/run.py +++ b/run.py @@ -254,7 +254,7 @@ def audio_query( """ style_id = id_checker(style_id=style_id, speaker_id=speaker) engine = get_engine(core_version) - accent_phrases = engine.create_accent_phrases(text, style_id=speaker) + accent_phrases = engine.create_accent_phrases(text, style_id=style_id) return AudioQuery( accent_phrases=accent_phrases, speedScale=1, From ce23723bbd0f8c7e5c02137090b35f929906a1fc Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Sat, 14 Oct 2023 23:00:47 +0900 Subject: [PATCH 21/44] =?UTF-8?q?id=5Fchecker=E9=96=A2=E6=95=B0=E3=81=AE?= =?UTF-8?q?=E5=90=8D=E5=89=8D=E3=82=92get=5Fstyle=5Fid=5Ffrom=5Fdeprecated?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/run.py b/run.py index 05549193b..a2c1b6a7d 100644 --- a/run.py +++ b/run.py @@ -85,7 +85,9 @@ import warnings -def id_checker(style_id: Optional[int], speaker_id: Optional[int]) -> int: +def get_style_id_from_deprecated( + style_id: Optional[int], speaker_id: Optional[int] +) -> int: """ style_idとspeaker_id両方ともNoneかNoneでないかをチェックし、 どちらか片方しかNoneが存在しなければstyle_idを返す @@ -252,7 +254,7 @@ def audio_query( """ クエリの初期値を得ます。ここで得られたクエリはそのまま音声合成に利用できます。各値の意味は`Schemas`を参照してください。 """ - style_id = id_checker(style_id=style_id, speaker_id=speaker) + style_id = get_style_id_from_deprecated(style_id=style_id, speaker_id=speaker) engine = get_engine(core_version) accent_phrases = engine.create_accent_phrases(text, style_id=style_id) return AudioQuery( From e8b01dfad28d3e77898a1be1e113970775c65399 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Sat, 14 Oct 2023 23:01:55 +0900 Subject: [PATCH 22/44] =?UTF-8?q?get=5Fstyle=5Fid=5Ffrom=5Fdeprecated?= =?UTF-8?q?=E9=96=A2=E6=95=B0=E3=81=AE=E6=88=BB=E3=82=8A=E5=80=A4=E3=81=AE?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=83=87=E3=83=B3=E3=83=88=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run.py b/run.py index a2c1b6a7d..489d7c8c6 100644 --- a/run.py +++ b/run.py @@ -102,7 +102,7 @@ def get_style_id_from_deprecated( warnings.warn("speakerは非推奨です。style_idの利用を推奨しています。") style_id = speaker_id speaker_id = None - return style_id + return style_id def b64encode_str(s): From 6ecbff7d20cf1f8c24060ae6da8a48573b716de3 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Sun, 15 Oct 2023 00:26:53 +0900 Subject: [PATCH 23/44] =?UTF-8?q?=E3=82=AF=E3=82=A8=E3=83=AA=E7=B7=A8?= =?UTF-8?q?=E9=9B=86=E5=91=A8=E3=82=8A=E3=81=AEAPI=E9=96=A2=E6=95=B0?= =?UTF-8?q?=E3=81=AB=E3=81=8A=E3=81=91=E3=82=8Bspeaker=E3=83=91=E3=83=A9?= =?UTF-8?q?=E3=83=A1=E3=83=BC=E3=82=BF=E3=82=92style=5Fid=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/run.py b/run.py index 489d7c8c6..d4d8d98bf 100644 --- a/run.py +++ b/run.py @@ -324,7 +324,8 @@ def audio_query_from_preset( ) def accent_phrases( text: str, - speaker: int, + style_id: Optional[int] = Query(default=None), + speaker: Optional[int] = Query(default=None, deprecated=True), is_kana: bool = False, core_version: Optional[str] = None, ): @@ -337,6 +338,7 @@ def accent_phrases( * アクセント位置を`'`で指定する。全てのアクセント句にはアクセント位置を1つ指定する必要がある。 * アクセント句末に`?`(全角)を入れることにより疑問文の発音ができる。 """ + style_id = get_style_id_from_deprecated(style_id=style_id, speaker_id=speaker) engine = get_engine(core_version) if is_kana: try: @@ -347,12 +349,12 @@ def accent_phrases( detail=ParseKanaBadRequest(err).dict(), ) accent_phrases = engine.replace_mora_data( - accent_phrases=accent_phrases, style_id=speaker + accent_phrases=accent_phrases, style_id=style_id ) return accent_phrases else: - return engine.create_accent_phrases(text, style_id=speaker) + return engine.create_accent_phrases(text, style_id=style_id) @app.post( "/mora_data", @@ -362,11 +364,13 @@ def accent_phrases( ) def mora_data( accent_phrases: List[AccentPhrase], - speaker: int, + style_id: Optional[int] = Query(default=None), + speaker: Optional[int] = Query(default=None, deprecated=True), core_version: Optional[str] = None, ): + style_id = get_style_id_from_deprecated(style_id=style_id, speaker_id=speaker) engine = get_engine(core_version) - return engine.replace_mora_data(accent_phrases, style_id=speaker) + return engine.replace_mora_data(accent_phrases, style_id=style_id) @app.post( "/mora_length", @@ -376,12 +380,14 @@ def mora_data( ) def mora_length( accent_phrases: List[AccentPhrase], - speaker: int, + style_id: Optional[int] = Query(default=None), + speaker: Optional[int] = Query(default=None, deprecated=True), core_version: Optional[str] = None, ): + style_id = get_style_id_from_deprecated(style_id=style_id, speaker_id=speaker) engine = get_engine(core_version) return engine.replace_phoneme_length( - accent_phrases=accent_phrases, style_id=speaker + accent_phrases=accent_phrases, style_id=style_id ) @app.post( @@ -392,12 +398,14 @@ def mora_length( ) def mora_pitch( accent_phrases: List[AccentPhrase], - speaker: int, + style_id: Optional[int] = Query(default=None), + speaker: Optional[int] = Query(default=None, deprecated=True), core_version: Optional[str] = None, ): + style_id = get_style_id_from_deprecated(style_id=style_id, speaker_id=speaker) engine = get_engine(core_version) return engine.replace_mora_pitch( - accent_phrases=accent_phrases, style_id=speaker + accent_phrases=accent_phrases, style_id=style_id ) @app.post( From 0e737f05685632bc246d5e2c9de80ee42ff4cdd3 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Sun, 15 Oct 2023 00:51:40 +0900 Subject: [PATCH 24/44] =?UTF-8?q?=E9=9F=B3=E5=A3=B0=E5=90=88=E6=88=90?= =?UTF-8?q?=E5=91=A8=E3=82=8A=E3=81=AEAPI=E3=81=AB=E3=81=8A=E3=81=84?= =?UTF-8?q?=E3=81=A6=E3=80=81style=5Fid=E3=81=A8speaker=E3=81=AB=E4=BA=92?= =?UTF-8?q?=E6=8F=9B=E6=80=A7=E3=82=92=E3=82=82=E3=81=9F=E3=81=9B=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/run.py b/run.py index d4d8d98bf..a45703bcb 100644 --- a/run.py +++ b/run.py @@ -423,17 +423,19 @@ def mora_pitch( ) def synthesis( query: AudioQuery, - speaker: int, + style_id: Optional[int] = Query(default=None), + speaker: Optional[int] = Query(default=None, deprecated=True), enable_interrogative_upspeak: bool = Query( # noqa: B008 default=True, description="疑問系のテキストが与えられたら語尾を自動調整する", ), core_version: Optional[str] = None, ): + style_id = get_style_id_from_deprecated(style_id=style_id, speaker_id=speaker) engine = get_engine(core_version) wave = engine.synthesis( query=query, - style_id=speaker, + style_id=style_id, enable_interrogative_upspeak=enable_interrogative_upspeak, ) @@ -463,10 +465,12 @@ def synthesis( ) def cancellable_synthesis( query: AudioQuery, - speaker: int, request: Request, + style_id: Optional[int] = Query(default=None), + speaker: Optional[int] = Query(default=None, deprecated=True), core_version: Optional[str] = None, ): + style_id = get_style_id_from_deprecated(style_id=style_id, speaker_id=speaker) if not args.enable_cancellable_synthesis: raise HTTPException( status_code=404, @@ -474,7 +478,7 @@ def cancellable_synthesis( ) f_name = cancellable_engine._synthesis_impl( query=query, - style_id=speaker, + style_id=style_id, request=request, core_version=core_version, ) @@ -504,9 +508,11 @@ def cancellable_synthesis( ) def multi_synthesis( queries: List[AudioQuery], - speaker: int, + style_id: Optional[int] = Query(default=None), + speaker: Optional[int] = Query(default=None, deprecated=True), core_version: Optional[str] = None, ): + style_id = get_style_id_from_deprecated(style_id=style_id, speaker_id=speaker) engine = get_engine(core_version) sampling_rate = queries[0].outputSamplingRate @@ -519,7 +525,7 @@ def multi_synthesis( ) with TemporaryFile() as wav_file: - wave = engine.synthesis(query=queries[i], style_id=speaker) + wave = engine.synthesis(query=queries[i], style_id=style_id) soundfile.write( file=wav_file, data=wave, From 8686888aa4551fd562051fcaad682430704ce6db Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Sun, 15 Oct 2023 11:35:04 +0900 Subject: [PATCH 25/44] =?UTF-8?q?initialize=5Fspeaker=E9=96=A2=E9=80=A3?= =?UTF-8?q?=E3=81=AEAPI=E3=81=A7style=5Fid=E3=81=A8speaker=E3=81=AB?= =?UTF-8?q?=E4=BA=92=E6=8F=9B=E6=80=A7=E3=82=92=E3=82=82=E3=81=9F=E3=81=9B?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/run.py b/run.py index a45703bcb..f453141d2 100644 --- a/run.py +++ b/run.py @@ -924,7 +924,8 @@ def uninstall_library(library_uuid: str): @app.post("/initialize_speaker", status_code=204, tags=["その他"]) def initialize_speaker( - speaker: int, + style_id: Optional[int] = Query(default=None), + speaker: Optional[int] = Query(default=None, deprecated=True), skip_reinit: bool = Query( # noqa: B008 False, description="既に初期化済みの話者の再初期化をスキップするかどうか" ), @@ -934,17 +935,23 @@ def initialize_speaker( 指定されたstyle_idの話者を初期化します。 実行しなくても他のAPIは使用できますが、初回実行時に時間がかかることがあります。 """ + style_id = get_style_id_from_deprecated(style_id=style_id, speaker_id=speaker) engine = get_engine(core_version) - engine.initialize_speaker_synthesis(style_id=speaker, skip_reinit=skip_reinit) + engine.initialize_speaker_synthesis(style_id=style_id, skip_reinit=skip_reinit) return Response(status_code=204) @app.get("/is_initialized_speaker", response_model=bool, tags=["その他"]) - def is_initialized_speaker(speaker: int, core_version: Optional[str] = None): + def is_initialized_speaker( + style_id: Optional[int] = Query(default=None), + speaker: Optional[int] = Query(default=None, deprecated=True), + core_version: Optional[str] = None, + ): """ 指定されたstyle_idの話者が初期化されているかどうかを返します。 """ + style_id=get_style_id_from_deprecated(style_id=style_id,speaker_id=speaker) engine = get_engine(core_version) - return engine.is_initialized_speaker_synthesis(speaker) + return engine.is_initialized_speaker_synthesis(style_id) @app.get("/user_dict", response_model=Dict[str, UserDictWord], tags=["ユーザー辞書"]) def get_user_dict_words(): From 5cfa87fdc0ae00968e41ae2a5c425e4fec824a65 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Sun, 15 Oct 2023 13:39:51 +0900 Subject: [PATCH 26/44] =?UTF-8?q?speakerNotFoundError=E9=96=A2=E6=95=B0?= =?UTF-8?q?=E3=81=A7=E4=BD=BF=E7=94=A8=E3=81=95=E3=82=8C=E3=82=8Bspeaker?= =?UTF-8?q?=E3=82=92style=5Fid=E3=81=AB=E5=A4=89=E6=9B=B4=E3=81=97?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 6 +++--- voicevox_engine/model.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/run.py b/run.py index f453141d2..133821797 100644 --- a/run.py +++ b/run.py @@ -571,7 +571,7 @@ def morphable_targets( ] except SpeakerNotFoundError as e: raise HTTPException( - status_code=404, detail=f"該当する話者(speaker={e.speaker})が見つかりません" + status_code=404, detail=f"該当する話者(speaker={e.style_id})が見つかりません" ) @app.post( @@ -613,7 +613,7 @@ def _synthesis_morphing( ) except SpeakerNotFoundError as e: raise HTTPException( - status_code=404, detail=f"該当する話者(speaker={e.speaker})が見つかりません" + status_code=404, detail=f"該当する話者(speaker={e.style_id})が見つかりません" ) # 生成したパラメータはキャッシュされる @@ -949,7 +949,7 @@ def is_initialized_speaker( """ 指定されたstyle_idの話者が初期化されているかどうかを返します。 """ - style_id=get_style_id_from_deprecated(style_id=style_id,speaker_id=speaker) + style_id = get_style_id_from_deprecated(style_id=style_id, speaker_id=speaker) engine = get_engine(core_version) return engine.is_initialized_speaker_synthesis(style_id) diff --git a/voicevox_engine/model.py b/voicevox_engine/model.py index 89d9e0011..064be18ed 100644 --- a/voicevox_engine/model.py +++ b/voicevox_engine/model.py @@ -113,9 +113,9 @@ class MorphableTargetInfo(BaseModel): class SpeakerNotFoundError(LookupError): - def __init__(self, speaker: int, *args: object, **kywrds: object) -> None: - self.speaker = speaker - super().__init__(f"speaker {speaker} is not found.", *args, **kywrds) + def __init__(self, style_id: int, *args: object, **kywrds: object) -> None: + self.speaker = style_id + super().__init__(f"speaker {style_id} is not found.", *args, **kywrds) class LibrarySpeaker(BaseModel): From 4d07a68fec4d6959a04599e9289da4b4a8e418eb Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Mon, 16 Oct 2023 15:48:07 +0900 Subject: [PATCH 27/44] =?UTF-8?q?=E3=83=93=E3=83=AB=E3=83=89=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=81=AE=E9=9D=9E=E6=8E=A8=E5=A5=A8=E3=83=91?= =?UTF-8?q?=E3=83=AF=E3=83=A1=E3=83=BC=E3=82=BF=E3=82=92=E6=8E=A8=E5=A5=A8?= =?UTF-8?q?=E3=83=91=E3=83=A9=E3=83=A1=E3=83=BC=E3=82=BF=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build_util/check_release_build.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build_util/check_release_build.py b/build_util/check_release_build.py index 71bf49c08..008f25548 100644 --- a/build_util/check_release_build.py +++ b/build_util/check_release_build.py @@ -34,14 +34,14 @@ def test_release_build(dist_dir: Path, skip_run_process: bool) -> None: # テキスト -> クエリ text = "こんにちは、音声合成の世界へようこそ" req = Request( - base_url + "audio_query?" + urlencode({"speaker": "1", "text": text}), + base_url + "audio_query?" + urlencode({"style_id": "1", "text": text}), method="POST", ) with urlopen(req) as res: query = json.loads(res.read().decode("utf-8")) # クエリ -> 音声 - req = Request(base_url + "synthesis?speaker=1", method="POST") + req = Request(base_url + "synthesis?style_id=1", method="POST") req.add_header("Content-Type", "application/json") req.data = json.dumps(query).encode("utf-8") with urlopen(req) as res: From 3ea9a045b6f42ffb0c68a06645ed724aae5f4beb Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Mon, 16 Oct 2023 15:59:30 +0900 Subject: [PATCH 28/44] =?UTF-8?q?speakerNotFoudError=E9=96=A2=E6=95=B0?= =?UTF-8?q?=E3=81=AE=E7=B4=B0=E3=81=8B=E3=81=84=E8=A8=98=E8=BF=B0=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 4 ++-- voicevox_engine/model.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/run.py b/run.py index 133821797..245e92d7a 100644 --- a/run.py +++ b/run.py @@ -571,7 +571,7 @@ def morphable_targets( ] except SpeakerNotFoundError as e: raise HTTPException( - status_code=404, detail=f"該当する話者(speaker={e.style_id})が見つかりません" + status_code=404, detail=f"該当する話者(style_id={e.style_id})が見つかりません" ) @app.post( @@ -613,7 +613,7 @@ def _synthesis_morphing( ) except SpeakerNotFoundError as e: raise HTTPException( - status_code=404, detail=f"該当する話者(speaker={e.style_id})が見つかりません" + status_code=404, detail=f"該当する話者(style_id={e.style_id})が見つかりません" ) # 生成したパラメータはキャッシュされる diff --git a/voicevox_engine/model.py b/voicevox_engine/model.py index 064be18ed..f96593917 100644 --- a/voicevox_engine/model.py +++ b/voicevox_engine/model.py @@ -115,7 +115,7 @@ class MorphableTargetInfo(BaseModel): class SpeakerNotFoundError(LookupError): def __init__(self, style_id: int, *args: object, **kywrds: object) -> None: self.speaker = style_id - super().__init__(f"speaker {style_id} is not found.", *args, **kywrds) + super().__init__(f"style_id {style_id} is not found.", *args, **kywrds) class LibrarySpeaker(BaseModel): From 3b5acec0bb2cf2021b3d4b33d14b6f1f7cbaf06c Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Mon, 16 Oct 2023 17:10:20 +0900 Subject: [PATCH 29/44] =?UTF-8?q?model.py=E3=81=AE=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E6=BC=8F=E3=82=8C=E3=82=92=E9=81=A9=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- voicevox_engine/model.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/voicevox_engine/model.py b/voicevox_engine/model.py index f96593917..c8e2feb50 100644 --- a/voicevox_engine/model.py +++ b/voicevox_engine/model.py @@ -114,7 +114,7 @@ class MorphableTargetInfo(BaseModel): class SpeakerNotFoundError(LookupError): def __init__(self, style_id: int, *args: object, **kywrds: object) -> None: - self.speaker = style_id + self.style_id = style_id super().__init__(f"style_id {style_id} is not found.", *args, **kywrds) @@ -123,7 +123,7 @@ class LibrarySpeaker(BaseModel): 音声ライブラリに含まれる話者の情報 """ - speaker: Speaker = Field(title="話者情報") + style_id: Speaker = Field(title="話者情報") speaker_info: SpeakerInfo = Field(title="話者の追加情報") From 89f78b9c8c6491477536d8522e3208190f549e7f Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Mon, 16 Oct 2023 17:32:49 +0900 Subject: [PATCH 30/44] =?UTF-8?q?=E9=9D=9E=E6=8E=A8=E5=A5=A8(=E6=97=A2?= =?UTF-8?q?=E5=AD=98=E3=81=AE)=E3=82=A8=E3=83=B3=E3=83=89=E3=83=9D?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=83=88=E3=81=A8=E6=8E=A8=E5=A5=A8=E3=82=A8?= =?UTF-8?q?=E3=83=B3=E3=83=89=E3=83=9D=E3=82=A4=E3=83=B3=E3=83=88=E4=B8=A1?= =?UTF-8?q?=E6=96=B9=E3=82=92=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 50 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/run.py b/run.py index 245e92d7a..fb0e10abd 100644 --- a/run.py +++ b/run.py @@ -922,10 +922,9 @@ def uninstall_library(library_uuid: str): library_manager.uninstall_library(library_uuid) return Response(status_code=204) - @app.post("/initialize_speaker", status_code=204, tags=["その他"]) - def initialize_speaker( - style_id: Optional[int] = Query(default=None), - speaker: Optional[int] = Query(default=None, deprecated=True), + @app.post("/initialize_style_id", status_code=204, tags=["その他"]) + def initialize_style_id( + style_id: int, skip_reinit: bool = Query( # noqa: B008 False, description="既に初期化済みの話者の再初期化をスキップするかどうか" ), @@ -935,24 +934,55 @@ def initialize_speaker( 指定されたstyle_idの話者を初期化します。 実行しなくても他のAPIは使用できますが、初回実行時に時間がかかることがあります。 """ - style_id = get_style_id_from_deprecated(style_id=style_id, speaker_id=speaker) engine = get_engine(core_version) engine.initialize_speaker_synthesis(style_id=style_id, skip_reinit=skip_reinit) return Response(status_code=204) - @app.get("/is_initialized_speaker", response_model=bool, tags=["その他"]) - def is_initialized_speaker( - style_id: Optional[int] = Query(default=None), - speaker: Optional[int] = Query(default=None, deprecated=True), + @app.get("/is_initialized_style_id", response_model=bool, tags=["その他"]) + def is_initialized_style_id( + style_id: int, core_version: Optional[str] = None, ): """ 指定されたstyle_idの話者が初期化されているかどうかを返します。 """ - style_id = get_style_id_from_deprecated(style_id=style_id, speaker_id=speaker) engine = get_engine(core_version) return engine.is_initialized_speaker_synthesis(style_id) + @app.post("/initialize_speaker", status_code=204, tags=["その他"], deprecated=True) + def initialize_speaker( + speaker: int, + skip_reinit: bool = Query( # noqa: B008 + False, description="既に初期化済みの話者の再初期化をスキップするかどうか" + ), + core_version: Optional[str] = None, + ): + """ + 指定されたspeaker_idの話者を初期化します。 + 実行しなくても他のAPIは使用できますが、初回実行時に時間がかかることがあります。 + """ + warnings.warn( + "使用しているエンドポイント(/initialize_speaker)は非推奨です。/initialized_style_id の利用を推奨しています。" + ) + return initialize_style_id( + style_id=speaker, skip_reinit=skip_reinit, core_version=core_version + ) + + @app.get( + "/is_initialized_speaker", response_model=bool, tags=["その他"], deprecated=True + ) + def is_initialized_speaker( + speaker: int, + core_version: Optional[str] = None, + ): + """ + 指定されたspeaker_idの話者が初期化されているかどうかを返します。 + """ + warnings.warn( + "使用しているエンドポイント(/is_initialize_speaker)は非推奨です。/is_initialized_style_id の利用を推奨しています。" + ) + return is_initialized_style_id(style_id=speaker, core_version=core_version) + @app.get("/user_dict", response_model=Dict[str, UserDictWord], tags=["ユーザー辞書"]) def get_user_dict_words(): """ From 5137e5dbe8a4872e342d7b5c74b0d4127111f74a Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Mon, 16 Oct 2023 18:24:56 +0900 Subject: [PATCH 31/44] =?UTF-8?q?(is=5F)initialize=5FspeakerAPI=E3=83=89?= =?UTF-8?q?=E3=82=AD=E3=83=A5=E3=83=A1=E3=83=B3=E3=83=88=E3=81=AE=E8=AA=AC?= =?UTF-8?q?=E6=98=8E=E3=82=92=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/run.py b/run.py index fb0e10abd..cbaf9f6f2 100644 --- a/run.py +++ b/run.py @@ -958,6 +958,7 @@ def initialize_speaker( core_version: Optional[str] = None, ): """ + こちらの利用は、非推奨です。`initialize_speaker` の利用を推奨しています。\n 指定されたspeaker_idの話者を初期化します。 実行しなくても他のAPIは使用できますが、初回実行時に時間がかかることがあります。 """ @@ -976,6 +977,7 @@ def is_initialized_speaker( core_version: Optional[str] = None, ): """ + こちらの利用は、非推奨です。`is_initialize_speaker` の利用を推奨しています。\n 指定されたspeaker_idの話者が初期化されているかどうかを返します。 """ warnings.warn( From 65235484f3fbadbff32a00d177b1f41b25dfc0c7 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Tue, 17 Oct 2023 18:49:02 +0900 Subject: [PATCH 32/44] =?UTF-8?q?run.py=E3=81=AB=E3=81=8A=E3=81=91?= =?UTF-8?q?=E3=82=8BSpeakerNotFoundError=E5=91=A8=E3=82=8A=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/run.py b/run.py index cbaf9f6f2..e88fb4e51 100644 --- a/run.py +++ b/run.py @@ -42,7 +42,7 @@ ParseKanaError, Speaker, SpeakerInfo, - SpeakerNotFoundError, + StyleIdNotFoundError, SupportedDevicesInfo, UserDictWord, VvlibManifest, @@ -569,9 +569,9 @@ def morphable_targets( {str(k): v for k, v in morphable_target.items()} for morphable_target in morphable_targets ] - except SpeakerNotFoundError as e: + except StyleIdNotFoundError as e: raise HTTPException( - status_code=404, detail=f"該当する話者(style_id={e.style_id})が見つかりません" + status_code=404, detail=f"該当するスタイル(style_id={e.style_id})が見つかりません" ) @app.post( @@ -611,9 +611,9 @@ def _synthesis_morphing( status_code=400, detail="指定された話者ペアでのモーフィングはできません", ) - except SpeakerNotFoundError as e: + except StyleIdNotFoundError as e: raise HTTPException( - status_code=404, detail=f"該当する話者(style_id={e.style_id})が見つかりません" + status_code=404, detail=f"該当するスタイル(style_id={e.style_id})が見つかりません" ) # 生成したパラメータはキャッシュされる From b5d0e49858ecd1f5f09c6b751fd4d856c0052fd5 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Tue, 17 Oct 2023 18:53:00 +0900 Subject: [PATCH 33/44] =?UTF-8?q?SpeakerNotFoundError=E3=82=92StyleId...?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- voicevox_engine/model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/voicevox_engine/model.py b/voicevox_engine/model.py index c8e2feb50..7d9288f57 100644 --- a/voicevox_engine/model.py +++ b/voicevox_engine/model.py @@ -112,7 +112,7 @@ class MorphableTargetInfo(BaseModel): # reason: Optional[str] = Field(title="is_morphableがfalseである場合、その理由") -class SpeakerNotFoundError(LookupError): +class StyleIdNotFoundError(LookupError): def __init__(self, style_id: int, *args: object, **kywrds: object) -> None: self.style_id = style_id super().__init__(f"style_id {style_id} is not found.", *args, **kywrds) From 53a979c2dfdf605d0b31147bad92fc8f10b404d4 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Tue, 17 Oct 2023 18:58:02 +0900 Subject: [PATCH 34/44] =?UTF-8?q?SpeakerNotFoundError=E3=82=92StyleId?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4=20(=E5=A4=89=E6=9B=B4=E6=BC=8F?= =?UTF-8?q?=E3=82=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- voicevox_engine/morphing.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/voicevox_engine/morphing.py b/voicevox_engine/morphing.py index afb341914..f952a6564 100644 --- a/voicevox_engine/morphing.py +++ b/voicevox_engine/morphing.py @@ -9,7 +9,7 @@ from .metas.Metas import Speaker, SpeakerSupportPermittedSynthesisMorphing, StyleInfo from .metas.MetasStore import construct_lookup -from .model import AudioQuery, MorphableTargetInfo, SpeakerNotFoundError +from .model import AudioQuery, MorphableTargetInfo, StyleIdNotFoundError from .synthesis_engine import SynthesisEngine @@ -81,14 +81,14 @@ def is_synthesis_morphing_permitted( ) -> bool: """ 指定されたspeakerがモーフィング可能かどうか返す - speakerが見つからない場合はSpeakerNotFoundErrorを送出する + speakerが見つからない場合はStyleIdNotFoundErrorを送出する """ base_speaker_data = speaker_lookup[base_speaker] target_speaker_data = speaker_lookup[target_speaker] if base_speaker_data is None or target_speaker_data is None: - raise SpeakerNotFoundError( + raise StyleIdNotFoundError( base_speaker if base_speaker_data is None else target_speaker ) From 91cead904e666712ac6442a717a5d23ef5d0aa66 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Tue, 17 Oct 2023 19:23:18 +0900 Subject: [PATCH 35/44] =?UTF-8?q?description=E3=81=AE=E8=A9=B1=E8=80=85?= =?UTF-8?q?=E3=82=92=E3=82=B9=E3=82=BF=E3=82=A4=E3=83=AB=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/run.py b/run.py index e88fb4e51..977a21ca8 100644 --- a/run.py +++ b/run.py @@ -926,12 +926,12 @@ def uninstall_library(library_uuid: str): def initialize_style_id( style_id: int, skip_reinit: bool = Query( # noqa: B008 - False, description="既に初期化済みの話者の再初期化をスキップするかどうか" + False, description="既に初期化済みのスタイルの再初期化をスキップするかどうか" ), core_version: Optional[str] = None, ): """ - 指定されたstyle_idの話者を初期化します。 + 指定されたstyle_idのスタイルを初期化します。 実行しなくても他のAPIは使用できますが、初回実行時に時間がかかることがあります。 """ engine = get_engine(core_version) @@ -944,7 +944,7 @@ def is_initialized_style_id( core_version: Optional[str] = None, ): """ - 指定されたstyle_idの話者が初期化されているかどうかを返します。 + 指定されたstyle_idのスタイルが初期化されているかどうかを返します。 """ engine = get_engine(core_version) return engine.is_initialized_speaker_synthesis(style_id) From 46efa5bed7cc1f88363bae27ae34009fb60603ce Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Tue, 17 Oct 2023 19:25:53 +0900 Subject: [PATCH 36/44] =?UTF-8?q?(is=5F)initialize(d)=5Fspeaker...?= =?UTF-8?q?=E3=81=AEspeaker=E3=82=92style=5Fid=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 4 ++-- voicevox_engine/synthesis_engine/synthesis_engine.py | 10 +++++----- .../synthesis_engine/synthesis_engine_base.py | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/run.py b/run.py index 977a21ca8..a85e211ef 100644 --- a/run.py +++ b/run.py @@ -935,7 +935,7 @@ def initialize_style_id( 実行しなくても他のAPIは使用できますが、初回実行時に時間がかかることがあります。 """ engine = get_engine(core_version) - engine.initialize_speaker_synthesis(style_id=style_id, skip_reinit=skip_reinit) + engine.initialize_style_id_synthesis(style_id=style_id, skip_reinit=skip_reinit) return Response(status_code=204) @app.get("/is_initialized_style_id", response_model=bool, tags=["その他"]) @@ -947,7 +947,7 @@ def is_initialized_style_id( 指定されたstyle_idのスタイルが初期化されているかどうかを返します。 """ engine = get_engine(core_version) - return engine.is_initialized_speaker_synthesis(style_id) + return engine.is_initialized_style_id_synthesis(style_id) @app.post("/initialize_speaker", status_code=204, tags=["その他"], deprecated=True) def initialize_speaker( diff --git a/voicevox_engine/synthesis_engine/synthesis_engine.py b/voicevox_engine/synthesis_engine/synthesis_engine.py index 1d6ba5d7a..12da10747 100644 --- a/voicevox_engine/synthesis_engine/synthesis_engine.py +++ b/voicevox_engine/synthesis_engine/synthesis_engine.py @@ -182,7 +182,7 @@ def speakers(self) -> str: def supported_devices(self) -> Optional[str]: return self._supported_devices - def initialize_speaker_synthesis(self, style_id: int, skip_reinit: bool): + def initialize_style_id_synthesis(self, style_id: int, skip_reinit: bool): try: with self.mutex: # 以下の条件のいずれかを満たす場合, 初期化を実行する @@ -193,7 +193,7 @@ def initialize_speaker_synthesis(self, style_id: int, skip_reinit: bool): except OldCoreError: pass # コアが古い場合はどうしようもないので何もしない - def is_initialized_speaker_synthesis(self, style_id: int) -> bool: + def is_initialized_style_id_synthesis(self, style_id: int) -> bool: try: return self.core.is_model_loaded(style_id) except OldCoreError: @@ -216,7 +216,7 @@ def replace_phoneme_length( 母音・子音の長さが設定されたアクセント句モデルのリスト """ # モデルがロードされていない場合はロードする - self.initialize_speaker_synthesis(style_id, skip_reinit=True) + self.initialize_style_id_synthesis(style_id, skip_reinit=True) # phoneme # AccentPhraseをすべてMoraおよびOjtPhonemeの形に分解し、処理可能な形にする flatten_moras, phoneme_data_list = pre_process(accent_phrases) @@ -265,7 +265,7 @@ def replace_mora_pitch( 音高(ピッチ)が設定されたアクセント句モデルのリスト """ # モデルがロードされていない場合はロードする - self.initialize_speaker_synthesis(style_id, skip_reinit=True) + self.initialize_style_id_synthesis(style_id, skip_reinit=True) # numpy.concatenateが空リストだとエラーを返すのでチェック if len(accent_phrases) == 0: return [] @@ -405,7 +405,7 @@ def _synthesis_impl(self, query: AudioQuery, style_id: int): 音声合成結果 """ # モデルがロードされていない場合はロードする - self.initialize_speaker_synthesis(style_id, skip_reinit=True) + self.initialize_style_id_synthesis(style_id, skip_reinit=True) # phoneme # AccentPhraseをすべてMoraおよびOjtPhonemeの形に分解し、処理可能な形にする flatten_moras, phoneme_data_list = pre_process(query.accent_phrases) diff --git a/voicevox_engine/synthesis_engine/synthesis_engine_base.py b/voicevox_engine/synthesis_engine/synthesis_engine_base.py index 271bd9f2a..f6f798a7c 100644 --- a/voicevox_engine/synthesis_engine/synthesis_engine_base.py +++ b/voicevox_engine/synthesis_engine/synthesis_engine_base.py @@ -91,13 +91,13 @@ def speakers(self) -> str: def supported_devices(self) -> Optional[str]: raise NotImplementedError - def initialize_speaker_synthesis( # noqa: B027 + def initialize_style_id_synthesis( # noqa: B027 self, style_id: int, skip_reinit: bool, ): """ - 指定した話者での音声合成を初期化する。何度も実行可能。 + 指定したスタイルでの音声合成を初期化する。何度も実行可能。 未実装の場合は何もしない Parameters ---------- @@ -108,9 +108,9 @@ def initialize_speaker_synthesis( # noqa: B027 """ pass - def is_initialized_speaker_synthesis(self, style_id: int) -> bool: + def is_initialized_style_id_synthesis(self, style_id: int) -> bool: """ - 指定した話者での音声合成が初期化されているかどうかを返す + 指定したスタイルでの音声合成が初期化されているかどうかを返す Parameters ---------- style_id : int From 2b8ad4c77b08589e1dbbd7b9e00fd3e3f198e183 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Tue, 17 Oct 2023 19:30:36 +0900 Subject: [PATCH 37/44] =?UTF-8?q?initialize(d)=5Fspeaker=E3=81=BE=E3=82=8F?= =?UTF-8?q?=E3=82=8A=E3=81=AB=E3=81=8A=E3=81=91=E3=82=8Bdocstring=E3=81=AE?= =?UTF-8?q?=E8=AA=A4=E3=82=8A=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/run.py b/run.py index a85e211ef..47f79c0b0 100644 --- a/run.py +++ b/run.py @@ -958,7 +958,7 @@ def initialize_speaker( core_version: Optional[str] = None, ): """ - こちらの利用は、非推奨です。`initialize_speaker` の利用を推奨しています。\n + こちらの利用は、非推奨です。`initialize_style_id` の利用を推奨しています。\n 指定されたspeaker_idの話者を初期化します。 実行しなくても他のAPIは使用できますが、初回実行時に時間がかかることがあります。 """ @@ -977,7 +977,7 @@ def is_initialized_speaker( core_version: Optional[str] = None, ): """ - こちらの利用は、非推奨です。`is_initialize_speaker` の利用を推奨しています。\n + こちらの利用は、非推奨です。`is_initialize_style_id` の利用を推奨しています。\n 指定されたspeaker_idの話者が初期化されているかどうかを返します。 """ warnings.warn( From 55218cf7c6b564993762daf5a38aef7e69d4915b Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Tue, 17 Oct 2023 19:37:58 +0900 Subject: [PATCH 38/44] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=AAstyle=5Fid?= =?UTF-8?q?=E3=81=AE=E5=A4=89=E6=9B=B4=E3=82=92speaker=E3=81=AB=E3=83=AA?= =?UTF-8?q?=E3=82=BB=E3=83=83=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- voicevox_engine/model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/voicevox_engine/model.py b/voicevox_engine/model.py index 7d9288f57..f2d3524ee 100644 --- a/voicevox_engine/model.py +++ b/voicevox_engine/model.py @@ -123,7 +123,7 @@ class LibrarySpeaker(BaseModel): 音声ライブラリに含まれる話者の情報 """ - style_id: Speaker = Field(title="話者情報") + speaker: Speaker = Field(title="話者情報") speaker_info: SpeakerInfo = Field(title="話者の追加情報") From 7eda81b62fda0aa864a7137e2923b996846f38c3 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Tue, 17 Oct 2023 19:38:56 +0900 Subject: [PATCH 39/44] =?UTF-8?q?README=E3=81=A7=E8=A8=98=E8=BF=B0?= =?UTF-8?q?=E3=81=95=E3=82=8C=E3=81=A6=E3=81=84=E3=82=8Bspeaker=E3=83=91?= =?UTF-8?q?=E3=83=A9=E3=83=A1=E3=83=BC=E3=82=BF=E3=82=92style=5Fid?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 92 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 52 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index ad7eb2a0d..2cdafbb97 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ echo -n "こんにちは、音声合成の世界へようこそ" >text.txt curl -s \ -X POST \ - "127.0.0.1:50021/audio_query?speaker=1"\ + "127.0.0.1:50021/audio_query?style_id=1"\ --get --data-urlencode text@text.txt \ > query.json @@ -45,7 +45,7 @@ curl -s \ -H "Content-Type: application/json" \ -X POST \ -d @query.json \ - "127.0.0.1:50021/synthesis?speaker=1" \ + "127.0.0.1:50021/synthesis?style_id=1" \ > audio.wav ``` @@ -70,7 +70,7 @@ echo -n "ディープラーニングは万能薬ではありません" >text.txt curl -s \ -X POST \ - "127.0.0.1:50021/audio_query?speaker=1" \ + "127.0.0.1:50021/audio_query?style_id=1" \ --get --data-urlencode text@text.txt \ > query.json @@ -82,7 +82,7 @@ cat query.json | grep -o -E "\"kana\":\".*\"" echo -n "ディイプラ'アニングワ/バンノ'オヤクデワ/アリマセ'ン" > kana.txt curl -s \ -X POST \ - "127.0.0.1:50021/accent_phrases?speaker=1&is_kana=true" \ + "127.0.0.1:50021/accent_phrases?style_id=1&is_kana=true" \ --get --data-urlencode text@kana.txt \ > newphrases.json @@ -93,17 +93,17 @@ curl -s \ -H "Content-Type: application/json" \ -X POST \ -d @newquery.json \ - "127.0.0.1:50021/synthesis?speaker=1" \ + "127.0.0.1:50021/synthesis?style_id=1" \ > audio.wav ``` ### ユーザー辞書機能について -APIからユーザー辞書の参照、単語の追加、編集、削除を行うことができます。 +API からユーザー辞書の参照、単語の追加、編集、削除を行うことができます。 #### 参照 -`/user_dict`にGETリクエストを投げることでユーザー辞書の一覧を取得することができます。 +`/user_dict`に GET リクエストを投げることでユーザー辞書の一覧を取得することができます。 ```bash curl -s -X GET "127.0.0.1:50021/user_dict" @@ -111,17 +111,18 @@ curl -s -X GET "127.0.0.1:50021/user_dict" #### 単語追加 -`/user_dict_word`にPOSTリクエストを投げる事でユーザー辞書に単語を追加することができます。 -URLパラメータとして、以下が必要です。 +`/user_dict_word`に POST リクエストを投げる事でユーザー辞書に単語を追加することができます。 +URL パラメータとして、以下が必要です。 + - surface (辞書に登録する単語) - pronunciation (カタカナでの読み方) - accent_type (アクセント核位置、整数) アクセント核位置については、こちらの文章が参考になるかと思います。 〇型となっている数字の部分がアクセント核位置になります。 -https://tdmelodic.readthedocs.io/ja/latest/pages/introduction.html +https://tdmelodic.readthedocs.io/ja/latest/pages/introduction.html -成功した場合の返り値は単語に割り当てられるUUIDの文字列になります。 +成功した場合の返り値は単語に割り当てられる UUID の文字列になります。 ```bash surface="test" @@ -137,13 +138,14 @@ curl -s -X POST "127.0.0.1:50021/user_dict_word" \ #### 単語修正 -`/user_dict_word/{word_uuid}`にPUTリクエストを投げる事でユーザー辞書の単語を修正することができます。 -URLパラメータとして、以下が必要です。 +`/user_dict_word/{word_uuid}`に PUT リクエストを投げる事でユーザー辞書の単語を修正することができます。 +URL パラメータとして、以下が必要です。 + - surface (辞書に登録するワード) - pronunciation (カタカナでの読み方) - accent_type (アクセント核位置、整数) -word_uuidは単語追加時に確認できるほか、ユーザー辞書を参照することでも確認できます。 +word_uuid は単語追加時に確認できるほか、ユーザー辞書を参照することでも確認できます。 成功した場合の返り値は`204 No Content`になります。 ```bash @@ -162,9 +164,9 @@ curl -s -X PUT "127.0.0.1:50021/user_dict_word/$word_uuid" \ #### 単語削除 -`/user_dict_word/{word_uuid}`にDELETEリクエストを投げる事でユーザー辞書の単語を削除することができます。 +`/user_dict_word/{word_uuid}`に DELETE リクエストを投げる事でユーザー辞書の単語を削除することができます。 -word_uuidは単語追加時に確認できるほか、ユーザー辞書を参照することでも確認できます。 +word_uuid は単語追加時に確認できるほか、ユーザー辞書を参照することでも確認できます。 成功した場合の返り値は`204 No Content`になります。 ```bash @@ -199,7 +201,7 @@ curl -s \ -H "Content-Type: application/json" \ -X POST \ -d @query.json \ - "127.0.0.1:50021/synthesis?speaker=$style_id" \ + "127.0.0.1:50021/synthesis?style_id=$style_id" \ > audio.wav ``` @@ -216,7 +218,7 @@ echo -n "モーフィングを利用することで、2つの声を混ぜる curl -s \ -X POST \ - "127.0.0.1:50021/audio_query?speaker=0"\ + "127.0.0.1:50021/audio_query?style_id=0"\ --get --data-urlencode text@text.txt \ > query.json @@ -225,7 +227,7 @@ curl -s \ -H "Content-Type: application/json" \ -X POST \ -d @query.json \ - "127.0.0.1:50021/synthesis?speaker=0" \ + "127.0.0.1:50021/synthesis?style_id=0" \ > audio.wav export MORPH_RATE=0.5 @@ -268,11 +270,11 @@ curl -s -X GET "127.0.0.1:50021/speaker_info?speaker_uuid=7ffcb7ce-00ec-4bdc-82c この API は実験的機能であり、エンジン起動時に引数で`--enable_cancellable_synthesis`を指定しないと有効化されません。 音声合成に必要なパラメータは`/synthesis`と同様です。 -### CORS設定 +### CORS 設定 -VOICEVOXではセキュリティ保護のため`localhost`・`127.0.0.1`・`app://`・Originなし以外のOriginからリクエストを受け入れないようになっています。 +VOICEVOX ではセキュリティ保護のため`localhost`・`127.0.0.1`・`app://`・Origin なし以外の Origin からリクエストを受け入れないようになっています。 そのため、一部のサードパーティアプリからのレスポンスを受け取れない可能性があります。 -これを回避する方法として、エンジンから設定できるUIを用意しています。 +これを回避する方法として、エンジンから設定できる UI を用意しています。 #### 設定方法 @@ -342,7 +344,8 @@ docker run --rm --gpus all -p '127.0.0.1:50021:50021' voicevox/voicevox_engine:n ``` #### トラブルシューティング -GPU版を利用する場合、環境によってエラーが発生することがあります。その場合、`--runtime=nvidia`を`docker run`につけて実行すると解決できることがあります。 + +GPU 版を利用する場合、環境によってエラーが発生することがあります。その場合、`--runtime=nvidia`を`docker run`につけて実行すると解決できることがあります。 ## 貢献者の方へ @@ -416,29 +419,38 @@ CPU スレッド数が未指定の場合は、論理コア数の半分か物理 ``` ### 過去のバージョンのコアを使う -VOICEVOX Core 0.5.4以降のコアを使用する事が可能です。 -Macでのlibtorch版コアのサポートはしていません。 + +VOICEVOX Core 0.5.4 以降のコアを使用する事が可能です。 +Mac での libtorch 版コアのサポートはしていません。 #### 過去のバイナリを指定する -製品版VOICEVOXもしくはコンパイル済みエンジンのディレクトリを`--voicevox_dir`引数で指定すると、そのバージョンのコアが使用されます。 + +製品版 VOICEVOX もしくはコンパイル済みエンジンのディレクトリを`--voicevox_dir`引数で指定すると、そのバージョンのコアが使用されます。 + ```bash python run.py --voicevox_dir="/path/to/voicevox" ``` -Macでは、`DYLD_LIBRARY_PATH`の指定が必要です。 + +Mac では、`DYLD_LIBRARY_PATH`の指定が必要です。 + ```bash DYLD_LIBRARY_PATH="/path/to/voicevox" python run.py --voicevox_dir="/path/to/voicevox" ``` #### 音声ライブラリを直接指定する -[VOICEVOX Coreのzipファイル](https://github.com/VOICEVOX/voicevox_core/releases)を解凍したディレクトリを`--voicelib_dir`引数で指定します。 + +[VOICEVOX Core の zip ファイル](https://github.com/VOICEVOX/voicevox_core/releases)を解凍したディレクトリを`--voicelib_dir`引数で指定します。 また、コアのバージョンに合わせて、[libtorch](https://pytorch.org/)や[onnxruntime](https://github.com/microsoft/onnxruntime)のディレクトリを`--runtime_dir`引数で指定します。 -ただし、システムの探索パス上にlibtorch、onnxruntimeがある場合、`--runtime_dir`引数の指定は不要です。 -`--voicelib_dir`引数、`--runtime_dir`引数は複数回使用可能です。 -APIエンドポイントでコアのバージョンを指定する場合は`core_version`引数を指定してください。(未指定の場合は最新のコアが使用されます) +ただし、システムの探索パス上に libtorch、onnxruntime がある場合、`--runtime_dir`引数の指定は不要です。 +`--voicelib_dir`引数、`--runtime_dir`引数は複数回使用可能です。 +API エンドポイントでコアのバージョンを指定する場合は`core_version`引数を指定してください。(未指定の場合は最新のコアが使用されます) + ```bash python run.py --voicelib_dir="/path/to/voicevox_core" --runtime_dir="/path/to/libtorch_or_onnx" ``` -Macでは、`--runtime_dir`引数の代わりに`DYLD_LIBRARY_PATH`の指定が必要です。 + +Mac では、`--runtime_dir`引数の代わりに`DYLD_LIBRARY_PATH`の指定が必要です。 + ```bash DYLD_LIBRARY_PATH="/path/to/onnx" python run.py --voicelib_dir="/path/to/voicevox_core" ``` @@ -484,7 +496,7 @@ python make_docs.py ## ビルド この方法でビルドしたものは、リリースで公開されているものとは異なります。 -また、GPUで利用するにはcuDNNやCUDA、DirectMLなどのライブラリが追加で必要となります。 +また、GPU で利用するには cuDNN や CUDA、DirectML などのライブラリが追加で必要となります。 ```bash python -m pip install -r requirements-dev.txt @@ -594,19 +606,19 @@ VOICEVOX エディターにうまく読み込ませられないときは、エ ### Variables -| name | description | -| :----------------- | :---------------------------------------------------------------------- | -| DOCKERHUB_USERNAME | Docker Hub ユーザ名 | +| name | description | +| :----------------- | :------------------ | +| DOCKERHUB_USERNAME | Docker Hub ユーザ名 | ### Secrets -| name | description | -| :----------------- | :---------------------------------------------------------------------- | -| DOCKERHUB_TOKEN | [Docker Hub アクセストークン](https://hub.docker.com/settings/security) | +| name | description | +| :-------------- | :---------------------------------------------------------------------- | +| DOCKERHUB_TOKEN | [Docker Hub アクセストークン](https://hub.docker.com/settings/security) | ## 事例紹介 -**[voicevox-client](https://github.com/tuna2134/voicevox-client) [@tuna2134](https://github.com/tuna2134)** ・・・ VOICEVOX ENGINE のためのPythonラッパー +**[voicevox-client](https://github.com/tuna2134/voicevox-client) [@tuna2134](https://github.com/tuna2134)** ・・・ VOICEVOX ENGINE のための Python ラッパー ## ライセンス From 790007f83917c1a85f8ba5c7f6c540d3ca9c5b0d Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Sun, 22 Oct 2023 00:15:26 +0900 Subject: [PATCH 40/44] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=BC=8F=E3=82=8C?= =?UTF-8?q?=E3=81=ABspeaker=E3=82=92style=5Fid=E3=81=AB=E5=A4=89=E6=9B=B4(?= =?UTF-8?q?morphing.py)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- voicevox_engine/morphing.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/voicevox_engine/morphing.py b/voicevox_engine/morphing.py index f952a6564..8db7c6f54 100644 --- a/voicevox_engine/morphing.py +++ b/voicevox_engine/morphing.py @@ -80,8 +80,8 @@ def is_synthesis_morphing_permitted( target_speaker: int, ) -> bool: """ - 指定されたspeakerがモーフィング可能かどうか返す - speakerが見つからない場合はStyleIdNotFoundErrorを送出する + 指定されたstyle_idがモーフィング可能かどうか返す + style_idが見つからない場合はStyleIdNotFoundErrorを送出する """ base_speaker_data = speaker_lookup[base_speaker] From cc2b8e099b9c7543209f6e91b59cfc5d206d43c7 Mon Sep 17 00:00:00 2001 From: wewewe-ok Date: Sun, 22 Oct 2023 00:18:16 +0900 Subject: [PATCH 41/44] =?UTF-8?q?speaker=5Fid=E3=82=92style=5Fid=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=9B=B4(test=5Fsynthesis...base.py)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_synthesis_engine_base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_synthesis_engine_base.py b/test/test_synthesis_engine_base.py index 5f994bc98..8202891b7 100644 --- a/test/test_synthesis_engine_base.py +++ b/test/test_synthesis_engine_base.py @@ -8,11 +8,11 @@ from voicevox_engine.synthesis_engine import SynthesisEngine -def yukarin_s_mock(length: int, phoneme_list: numpy.ndarray, speaker_id: numpy.ndarray): +def yukarin_s_mock(length: int, phoneme_list: numpy.ndarray, style_id: numpy.ndarray): result = [] # mockとしての適当な処理、特に意味はない for i in range(length): - result.append(round(float(phoneme_list[i] * 0.0625 + speaker_id), 2)) + result.append(round(float(phoneme_list[i] * 0.0625 + style_id), 2)) return numpy.array(result) From 9d11bc6c133d51950dc0bfb1633e20bc1c6eb6e0 Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Mon, 23 Oct 2023 02:36:11 +0900 Subject: [PATCH 42/44] =?UTF-8?q?=E3=83=89=E3=82=AD=E3=83=A5=E3=83=A1?= =?UTF-8?q?=E3=83=B3=E3=83=88=E8=AA=BF=E6=95=B4=E3=80=81=E5=9E=8B=E8=A1=A8?= =?UTF-8?q?=E8=A8=98=E3=82=92=E3=81=82=E3=82=8F=E3=81=9B=E3=82=8B=E3=80=81?= =?UTF-8?q?linter=E9=81=A9=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/run.py b/run.py index 1d2d90ade..2535efa2c 100644 --- a/run.py +++ b/run.py @@ -7,6 +7,7 @@ import re import sys import traceback +import warnings import zipfile from functools import lru_cache from io import BytesIO, TextIOWrapper @@ -82,8 +83,6 @@ get_save_dir, ) -import warnings - def get_style_id_from_deprecated( style_id: Optional[int], speaker_id: Optional[int] @@ -935,7 +934,7 @@ def initialize_style_id( skip_reinit: bool = Query( # noqa: B008 False, description="既に初期化済みのスタイルの再初期化をスキップするかどうか" ), - core_version: Optional[str] = None, + core_version: str | None = None, ): """ 指定されたstyle_idのスタイルを初期化します。 @@ -948,7 +947,7 @@ def initialize_style_id( @app.get("/is_initialized_style_id", response_model=bool, tags=["その他"]) def is_initialized_style_id( style_id: int, - core_version: Optional[str] = None, + core_version: str | None = None, ): """ 指定されたstyle_idのスタイルが初期化されているかどうかを返します。 @@ -965,12 +964,12 @@ def initialize_speaker( core_version: str | None = None, ) -> Response: """ - こちらの利用は、非推奨です。`initialize_style_id` の利用を推奨しています。\n + こちらのAPIは非推奨です。`initialize_style_id`を利用してください。\n 指定されたspeaker_idの話者を初期化します。 実行しなくても他のAPIは使用できますが、初回実行時に時間がかかることがあります。 """ warnings.warn( - "使用しているエンドポイント(/initialize_speaker)は非推奨です。/initialized_style_id の利用を推奨しています。" + "使用しているAPI(/initialize_speaker)は非推奨です。/initialized_style_idを利用してください。" ) return initialize_style_id( style_id=speaker, skip_reinit=skip_reinit, core_version=core_version @@ -982,13 +981,13 @@ def initialize_speaker( def is_initialized_speaker( speaker: int, core_version: str | None = None, - )-> bool: + ) -> bool: """ - こちらの利用は、非推奨です。`is_initialize_style_id` の利用を推奨しています。\n + こちらのAPIは非推奨です。`is_initialize_style_id`を利用してください。\n 指定されたspeaker_idの話者が初期化されているかどうかを返します。 """ warnings.warn( - "使用しているエンドポイント(/is_initialize_speaker)は非推奨です。/is_initialized_style_id の利用を推奨しています。" + "使用しているAPI(/is_initialize_speaker)は非推奨です。/is_initialized_style_idを利用してください。" ) return is_initialized_style_id(style_id=speaker, core_version=core_version) From 0cf1e045b3565a056806f28f050032f0a0b6f868 Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Mon, 23 Oct 2023 02:51:12 +0900 Subject: [PATCH 43/44] =?UTF-8?q?=E3=83=9E=E3=83=BC=E3=82=B8=E3=83=9F?= =?UTF-8?q?=E3=82=B9=E8=A7=A3=E6=B6=88=E3=80=81=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E8=A7=A3=E6=B6=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run.py | 67 +++++++++++++++++++++++++++------------------------------- 1 file changed, 31 insertions(+), 36 deletions(-) diff --git a/run.py b/run.py index 2535efa2c..f946fd9c5 100644 --- a/run.py +++ b/run.py @@ -84,24 +84,19 @@ ) -def get_style_id_from_deprecated( - style_id: Optional[int], speaker_id: Optional[int] -) -> int: +def get_style_id_from_deprecated(style_id: int | None, speaker_id: int | None) -> int: """ style_idとspeaker_id両方ともNoneかNoneでないかをチェックし、 どちらか片方しかNoneが存在しなければstyle_idを返す """ - if (style_id is None and speaker_id is None) or ( - style_id is not None and speaker_id is not None - ): - raise HTTPException( - status_code=400, detail="speakerとstyle_idが両方とも存在しないか、両方とも存在しています。" - ) - if speaker_id is not None: - warnings.warn("speakerは非推奨です。style_idの利用を推奨しています。") - style_id = speaker_id - speaker_id = None - return style_id + if speaker_id is not None and style_id is None: + warnings.warn("speakerは非推奨です。style_idを利用してください。", stacklevel=1) + return speaker_id + elif style_id is not None and speaker_id is None: + return style_id + raise HTTPException( + status_code=400, detail="speakerとstyle_idが両方とも存在しないか、両方とも存在しています。" + ) def b64encode_str(s): @@ -245,8 +240,8 @@ def get_engine(core_version: Optional[str]) -> SynthesisEngineBase: ) def audio_query( text: str, - style_id: Optional[int] = Query(default=None), - speaker: Optional[int] = Query(default=None, deprecated=True), + style_id: int | None = Query(default=None), # noqa: B008 + speaker: int | None = Query(default=None, deprecated=True), # noqa: B008 core_version: str | None = None, ) -> AudioQuery: """ @@ -324,8 +319,8 @@ def audio_query_from_preset( ) def accent_phrases( text: str, - style_id: Optional[int] = Query(default=None), - speaker: Optional[int] = Query(default=None, deprecated=True), + style_id: int | None = Query(default=None), # noqa: B008 + speaker: int | None = Query(default=None, deprecated=True), # noqa: B008 is_kana: bool = False, core_version: str | None = None, ) -> list[AccentPhrase]: @@ -363,9 +358,9 @@ def accent_phrases( summary="アクセント句から音高・音素長を得る", ) def mora_data( - accent_phrases: List[AccentPhrase], - style_id: Optional[int] = Query(default=None), - speaker: Optional[int] = Query(default=None, deprecated=True), + accent_phrases: list[AccentPhrase], + style_id: int | None = Query(default=None), # noqa: B008 + speaker: int | None = Query(default=None, deprecated=True), # noqa: B008 core_version: str | None = None, ) -> list[AccentPhrase]: style_id = get_style_id_from_deprecated(style_id=style_id, speaker_id=speaker) @@ -379,9 +374,9 @@ def mora_data( summary="アクセント句から音素長を得る", ) def mora_length( - accent_phrases: List[AccentPhrase], - style_id: Optional[int] = Query(default=None), - speaker: Optional[int] = Query(default=None, deprecated=True), + accent_phrases: list[AccentPhrase], + style_id: int | None = Query(default=None), # noqa: B008 + speaker: int | None = Query(default=None, deprecated=True), # noqa: B008 core_version: str | None = None, ) -> list[AccentPhrase]: style_id = get_style_id_from_deprecated(style_id=style_id, speaker_id=speaker) @@ -397,9 +392,9 @@ def mora_length( summary="アクセント句から音高を得る", ) def mora_pitch( - accent_phrases: List[AccentPhrase], - style_id: Optional[int] = Query(default=None), - speaker: Optional[int] = Query(default=None, deprecated=True), + accent_phrases: list[AccentPhrase], + style_id: int | None = Query(default=None), # noqa: B008 + speaker: int | None = Query(default=None, deprecated=True), # noqa: B008 core_version: str | None = None, ) -> list[AccentPhrase]: style_id = get_style_id_from_deprecated(style_id=style_id, speaker_id=speaker) @@ -423,8 +418,8 @@ def mora_pitch( ) def synthesis( query: AudioQuery, - style_id: Optional[int] = Query(default=None), - speaker: Optional[int] = Query(default=None, deprecated=True), + style_id: int | None = Query(default=None), # noqa: B008 + speaker: int | None = Query(default=None, deprecated=True), # noqa: B008 enable_interrogative_upspeak: bool = Query( # noqa: B008 default=True, description="疑問系のテキストが与えられたら語尾を自動調整する", @@ -466,8 +461,8 @@ def synthesis( def cancellable_synthesis( query: AudioQuery, request: Request, - style_id: Optional[int] = Query(default=None), - speaker: Optional[int] = Query(default=None, deprecated=True), + style_id: int | None = Query(default=None), # noqa: B008 + speaker: int | None = Query(default=None, deprecated=True), # noqa: B008 core_version: str | None = None, ) -> FileResponse: style_id = get_style_id_from_deprecated(style_id=style_id, speaker_id=speaker) @@ -507,9 +502,9 @@ def cancellable_synthesis( summary="複数まとめて音声合成する", ) def multi_synthesis( - queries: List[AudioQuery], - style_id: Optional[int] = Query(default=None), - speaker: Optional[int] = Query(default=None, deprecated=True), + queries: list[AccentPhrase], + style_id: int | None = Query(default=None), # noqa: B008 + speaker: int | None = Query(default=None, deprecated=True), # noqa: B008 core_version: str | None = None, ) -> FileResponse: style_id = get_style_id_from_deprecated(style_id=style_id, speaker_id=speaker) @@ -935,7 +930,7 @@ def initialize_style_id( False, description="既に初期化済みのスタイルの再初期化をスキップするかどうか" ), core_version: str | None = None, - ): + ) -> Response: """ 指定されたstyle_idのスタイルを初期化します。 実行しなくても他のAPIは使用できますが、初回実行時に時間がかかることがあります。 @@ -948,7 +943,7 @@ def initialize_style_id( def is_initialized_style_id( style_id: int, core_version: str | None = None, - ): + ) -> bool: """ 指定されたstyle_idのスタイルが初期化されているかどうかを返します。 """ From c949cb5e191db8a5ecfdf81cb82347d66bb0c57d Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Mon, 23 Oct 2023 02:53:05 +0900 Subject: [PATCH 44/44] stacklevel=1, --- run.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/run.py b/run.py index f946fd9c5..4a8afa27b 100644 --- a/run.py +++ b/run.py @@ -964,7 +964,8 @@ def initialize_speaker( 実行しなくても他のAPIは使用できますが、初回実行時に時間がかかることがあります。 """ warnings.warn( - "使用しているAPI(/initialize_speaker)は非推奨です。/initialized_style_idを利用してください。" + "使用しているAPI(/initialize_speaker)は非推奨です。/initialized_style_idを利用してください。", + stacklevel=1, ) return initialize_style_id( style_id=speaker, skip_reinit=skip_reinit, core_version=core_version @@ -982,7 +983,8 @@ def is_initialized_speaker( 指定されたspeaker_idの話者が初期化されているかどうかを返します。 """ warnings.warn( - "使用しているAPI(/is_initialize_speaker)は非推奨です。/is_initialized_style_idを利用してください。" + "使用しているAPI(/is_initialize_speaker)は非推奨です。/is_initialized_style_idを利用してください。", + stacklevel=1, ) return is_initialized_style_id(style_id=speaker, core_version=core_version)