lenML/ChatTTS-Forge
301
1import tempfile2 3import gradio as gr4import torch5 6from modules.speaker import Speaker7from modules.utils.hf import spaces8from modules.webui import webui_config9from modules.webui.webui_utils import tts_generate10 11 12@torch.inference_mode()13@spaces.GPU(duration=120)14def test_spk_voice(15 spk_file,16 text: str,17 progress=gr.Progress(track_tqdm=True),18):19 if spk_file == "" or spk_file is None:20 return None21 spk = Speaker.from_file(spk_file)22 return tts_generate(spk=spk, text=text, progress=progress)23 24 25def speaker_editor_ui():26 def on_generate(spk_file, name, gender, desc):27 spk: Speaker = Speaker.from_file(spk_file)28 spk.name = name29 spk.gender = gender30 spk.describe = desc31 32 with tempfile.NamedTemporaryFile(delete=False, suffix=".pt") as tmp_file:33 torch.save(spk, tmp_file)34 tmp_file_path = tmp_file.name35 36 return tmp_file_path37 38 def create_test_voice_card(spk_file):39 with gr.Group():40 gr.Markdown("🎤Test voice")41 with gr.Row():42 test_voice_btn = gr.Button(43 "Test Voice", variant="secondary", interactive=False44 )45 46 with gr.Column(scale=4):47 test_text = gr.Textbox(48 label="Test Text",49 placeholder="Please input test text",50 value=webui_config.localization.DEFAULT_SPEAKER_TEST_TEXT,51 )52 with gr.Row():53 with gr.Column(scale=4):54 output_audio = gr.Audio(label="Output Audio", format="mp3")55 56 test_voice_btn.click(57 fn=test_spk_voice,58 inputs=[spk_file, test_text],59 outputs=[output_audio],60 )61 62 return test_voice_btn63 64 has_file = gr.State(False)65 66 # TODO 也许需要写个说明?67 # gr.Markdown("SPEAKER_CREATOR_GUIDE")68 69 with gr.Row():70 with gr.Column(scale=2):71 with gr.Group():72 gr.Markdown("💼Speaker file")73 spk_file = gr.File(label="*.pt file", file_types=[".pt"])74 75 with gr.Group():76 gr.Markdown("ℹ️Speaker info")77 name_input = gr.Textbox(78 label="Name",79 placeholder="Enter speaker name",80 value="*",81 interactive=False,82 )83 gender_input = gr.Textbox(84 label="Gender",85 placeholder="Enter gender",86 value="*",87 interactive=False,88 )89 desc_input = gr.Textbox(90 label="Description",91 placeholder="Enter description",92 value="*",93 interactive=False,94 )95 with gr.Group():96 gr.Markdown("🔊Generate speaker.pt")97 generate_button = gr.Button("Save .pt file", interactive=False)98 output_file = gr.File(label="Save to File")99 with gr.Column(scale=5):100 btn1 = create_test_voice_card(spk_file=spk_file)101 btn2 = create_test_voice_card(spk_file=spk_file)102 btn3 = create_test_voice_card(spk_file=spk_file)103 btn4 = create_test_voice_card(spk_file=spk_file)104 105 generate_button.click(106 fn=on_generate,107 inputs=[spk_file, name_input, gender_input, desc_input],108 outputs=[output_file],109 )110 111 def spk_file_change(spk_file):112 empty = spk_file is None or spk_file == ""113 if empty:114 return [115 gr.Textbox(value="*", interactive=False),116 gr.Textbox(value="*", interactive=False),117 gr.Textbox(value="*", interactive=False),118 gr.Button(interactive=False),119 gr.Button(interactive=False),120 gr.Button(interactive=False),121 gr.Button(interactive=False),122 gr.Button(interactive=False),123 ]124 spk: Speaker = Speaker.from_file(spk_file)125 return [126 gr.Textbox(value=spk.name, interactive=True),127 gr.Textbox(value=spk.gender, interactive=True),128 gr.Textbox(value=spk.describe, interactive=True),129 gr.Button(interactive=True),130 gr.Button(interactive=True),131 gr.Button(interactive=True),132 gr.Button(interactive=True),133 gr.Button(interactive=True),134 ]135 136 spk_file.change(137 fn=spk_file_change,138 inputs=[spk_file],139 outputs=[140 name_input,141 gender_input,142 desc_input,143 generate_button,144 btn1,145 btn2,146 btn3,147 btn4,148 ],149 )150 