| | import tempfile |
| |
|
| | import gradio as gr |
| | import torch |
| |
|
| | from modules.speaker import Speaker |
| | from modules.utils.hf import spaces |
| | from modules.webui import webui_config |
| | from modules.webui.webui_utils import tts_generate |
| |
|
| |
|
| | @torch.inference_mode() |
| | @spaces.GPU(duration=120) |
| | def test_spk_voice( |
| | spk_file, |
| | text: str, |
| | progress=gr.Progress(track_tqdm=True), |
| | ): |
| | if spk_file == "" or spk_file is None: |
| | return None |
| | spk = Speaker.from_file(spk_file) |
| | return tts_generate(spk=spk, text=text, progress=progress) |
| |
|
| |
|
| | def speaker_editor_ui(): |
| | def on_generate(spk_file, name, gender, desc): |
| | spk: Speaker = Speaker.from_file(spk_file) |
| | spk.name = name |
| | spk.gender = gender |
| | spk.describe = desc |
| |
|
| | with tempfile.NamedTemporaryFile(delete=False, suffix=".pt") as tmp_file: |
| | torch.save(spk, tmp_file) |
| | tmp_file_path = tmp_file.name |
| |
|
| | return tmp_file_path |
| |
|
| | def create_test_voice_card(spk_file): |
| | with gr.Group(): |
| | gr.Markdown("🎤Test voice") |
| | with gr.Row(): |
| | test_voice_btn = gr.Button( |
| | "Test Voice", variant="secondary", interactive=False |
| | ) |
| |
|
| | with gr.Column(scale=4): |
| | test_text = gr.Textbox( |
| | label="Test Text", |
| | placeholder="Please input test text", |
| | value=webui_config.localization.DEFAULT_SPEAKER_TEST_TEXT, |
| | ) |
| | with gr.Row(): |
| | with gr.Column(scale=4): |
| | output_audio = gr.Audio(label="Output Audio", format="mp3") |
| |
|
| | test_voice_btn.click( |
| | fn=test_spk_voice, |
| | inputs=[spk_file, test_text], |
| | outputs=[output_audio], |
| | ) |
| |
|
| | return test_voice_btn |
| |
|
| | has_file = gr.State(False) |
| |
|
| | |
| | |
| |
|
| | with gr.Row(): |
| | with gr.Column(scale=2): |
| | with gr.Group(): |
| | gr.Markdown("💼Speaker file") |
| | spk_file = gr.File(label="*.pt file", file_types=[".pt"]) |
| |
|
| | with gr.Group(): |
| | gr.Markdown("ℹ️Speaker info") |
| | name_input = gr.Textbox( |
| | label="Name", |
| | placeholder="Enter speaker name", |
| | value="*", |
| | interactive=False, |
| | ) |
| | gender_input = gr.Textbox( |
| | label="Gender", |
| | placeholder="Enter gender", |
| | value="*", |
| | interactive=False, |
| | ) |
| | desc_input = gr.Textbox( |
| | label="Description", |
| | placeholder="Enter description", |
| | value="*", |
| | interactive=False, |
| | ) |
| | with gr.Group(): |
| | gr.Markdown("🔊Generate speaker.pt") |
| | generate_button = gr.Button("Save .pt file", interactive=False) |
| | output_file = gr.File(label="Save to File") |
| | with gr.Column(scale=5): |
| | btn1 = create_test_voice_card(spk_file=spk_file) |
| | btn2 = create_test_voice_card(spk_file=spk_file) |
| | btn3 = create_test_voice_card(spk_file=spk_file) |
| | btn4 = create_test_voice_card(spk_file=spk_file) |
| |
|
| | generate_button.click( |
| | fn=on_generate, |
| | inputs=[spk_file, name_input, gender_input, desc_input], |
| | outputs=[output_file], |
| | ) |
| |
|
| | def spk_file_change(spk_file): |
| | empty = spk_file is None or spk_file == "" |
| | if empty: |
| | return [ |
| | gr.Textbox(value="*", interactive=False), |
| | gr.Textbox(value="*", interactive=False), |
| | gr.Textbox(value="*", interactive=False), |
| | gr.Button(interactive=False), |
| | gr.Button(interactive=False), |
| | gr.Button(interactive=False), |
| | gr.Button(interactive=False), |
| | gr.Button(interactive=False), |
| | ] |
| | spk: Speaker = Speaker.from_file(spk_file) |
| | return [ |
| | gr.Textbox(value=spk.name, interactive=True), |
| | gr.Textbox(value=spk.gender, interactive=True), |
| | gr.Textbox(value=spk.describe, interactive=True), |
| | gr.Button(interactive=True), |
| | gr.Button(interactive=True), |
| | gr.Button(interactive=True), |
| | gr.Button(interactive=True), |
| | gr.Button(interactive=True), |
| | ] |
| |
|
| | spk_file.change( |
| | fn=spk_file_change, |
| | inputs=[spk_file], |
| | outputs=[ |
| | name_input, |
| | gender_input, |
| | desc_input, |
| | generate_button, |
| | btn1, |
| | btn2, |
| | btn3, |
| | btn4, |
| | ], |
| | ) |
| |
|