From 630a8730980d874e7a518359feb6a900e87a26eb Mon Sep 17 00:00:00 2001 From: litagin02 Date: Tue, 9 Jan 2024 17:42:31 +0900 Subject: [PATCH] Feat: multi-speaker in app.py --- app.py | 24 ++++++++++++++++++++---- common/tts_model.py | 4 +++- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/app.py b/app.py index baab228..c1250b0 100644 --- a/app.py +++ b/app.py @@ -52,6 +52,7 @@ def tts_fn( style_weight, kata_tone_json_str, use_tone, + speaker, ): assert model_holder.current_model is not None @@ -82,6 +83,8 @@ def tts_fn( phone_tone = kata_tone2phone_tone(kata_tone) tone = [t for _, t in phone_tone] + speaker_id = model_holder.current_model.spk2id[speaker] + start_time = datetime.datetime.now() try: @@ -101,6 +104,7 @@ def tts_fn( style=style, style_weight=style_weight, given_tone=tone, + sid=speaker_id, ) except InvalidToneError as e: logger.error(f"Tone error: {e}") @@ -109,7 +113,7 @@ def tts_fn( end_time = datetime.datetime.now() duration = (end_time - start_time).total_seconds() - if tone is None and language == "JP" and not line_split: + if tone is None and language == "JP": # アクセント指定に使えるようにアクセント情報を返す norm_text = text_normalize(text) kata_tone = g2kata_tone(norm_text) @@ -285,14 +289,25 @@ if __name__ == "__main__": maximum=2, value=DEFAULT_SPLIT_INTERVAL, step=0.1, - label="分けた場合に挟む無音の長さ(秒)", + label="改行ごとに挟む無音の長さ(秒)", + ) + line_split.change( + lambda x: (gr.Slider(visible=x)), + inputs=[line_split], + outputs=[split_interval], ) tone = gr.Textbox( label="アクセント調整(数値は 0=低 か1=高 のみ)", - info="改行で分けない場合のみ使えます", + info="改行で分けない場合のみ使えます。万能ではありません。", ) use_tone = gr.Checkbox(label="アクセント調整を使う", value=False) + use_tone.change( + lambda x: (gr.Checkbox(value=False) if x else gr.Checkbox()), + inputs=[use_tone], + outputs=[line_split], + ) language = gr.Dropdown(choices=languages, value="JP", label="Language") + speaker = gr.Dropdown(label="話者") with gr.Accordion(label="詳細設定", open=False): sdp_ratio = gr.Slider( minimum=0, @@ -390,6 +405,7 @@ if __name__ == "__main__": style_weight, tone, use_tone, + speaker, ], outputs=[text_output, audio_output, tone], ) @@ -410,7 +426,7 @@ if __name__ == "__main__": load_button.click( model_holder.load_model_gr, inputs=[model_name, model_path], - outputs=[style, tts_button], + outputs=[style, tts_button, speaker], ) style_mode.change( diff --git a/common/tts_model.py b/common/tts_model.py index 5e52064..9ce75e4 100644 --- a/common/tts_model.py +++ b/common/tts_model.py @@ -199,7 +199,7 @@ class ModelHolder: def load_model_gr( self, model_name: str, model_path: str - ) -> tuple[gr.Dropdown, gr.Button]: + ) -> tuple[gr.Dropdown, gr.Button, gr.Dropdown]: if model_name not in self.model_files_dict: raise ValueError(f"Model `{model_name}` is not found") if model_path not in self.model_files_dict[model_name]: @@ -210,10 +210,12 @@ class ModelHolder: style_vec_path=os.path.join(self.root_dir, model_name, "style_vectors.npy"), device=self.device, ) + speakers = list(self.current_model.spk2id.keys()) styles = list(self.current_model.style2id.keys()) return ( gr.Dropdown(choices=styles, value=styles[0]), gr.Button(interactive=True, value="音声合成"), + gr.Dropdown(choices=speakers, value=speakers[0]), ) def update_model_files_gr(self, model_name: str) -> gr.Dropdown: