CoolFace
Apppublic

lenML/ChatTTS-Forge

sourceHugging Faceagpl-3.0updated 2y agoView on Hugging Face
301likes
speaker_editor.py150 linesDownload Raw Back to speaker
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