lenML/ChatTTS-Forge
301
1import tempfile2 3import gradio as gr4import torch5 6from modules.models import load_chat_tts7from modules.speaker import Speaker8from modules.utils.hf import spaces9from modules.utils.rng import np_rng10from modules.utils.SeedContext import SeedContext11from modules.webui import webui_config12from modules.webui.webui_utils import get_speakers, tts_generate13 14names_list = [15 "Alice",16 "Bob",17 "Carol",18 "Carlos",19 "Charlie",20 "Chuck",21 "Chad",22 "Craig",23 "Dan",24 "Dave",25 "David",26 "Erin",27 "Eve",28 "Yves",29 "Faythe",30 "Frank",31 "Grace",32 "Heidi",33 "Ivan",34 "Judy",35 "Mallory",36 "Mallet",37 "Darth",38 "Michael",39 "Mike",40 "Niaj",41 "Olivia",42 "Oscar",43 "Peggy",44 "Pat",45 "Rupert",46 "Sybil",47 "Trent",48 "Ted",49 "Trudy",50 "Victor",51 "Vanna",52 "Walter",53 "Wendy",54]55 56 57@torch.inference_mode()58@spaces.GPU(duration=120)59def create_spk_from_seed(60 seed: int,61 name: str,62 gender: str,63 desc: str,64):65 spk = Speaker.from_seed(seed)66 spk.name = name67 spk.gender = gender68 spk.describe = desc69 70 with tempfile.NamedTemporaryFile(delete=False, suffix=".pt") as tmp_file:71 torch.save(spk, tmp_file)72 tmp_file_path = tmp_file.name73 74 return tmp_file_path75 76 77@torch.inference_mode()78@spaces.GPU(duration=120)79def test_spk_voice(80 seed: int,81 text: str,82 progress=gr.Progress(track_tqdm=True),83):84 spk = Speaker.from_seed(seed)85 return tts_generate(spk=spk, text=text, progress=progress)86 87 88def random_speaker():89 seed = np_rng()90 name = names_list[seed % len(names_list)]91 return seed, name92 93 94def speaker_creator_ui():95 def on_generate(seed, name, gender, desc):96 file_path = create_spk_from_seed(seed, name, gender, desc)97 return file_path98 99 def create_test_voice_card(seed_input):100 with gr.Group():101 gr.Markdown("🎤Test voice")102 with gr.Row():103 test_voice_btn = gr.Button("Test Voice", variant="secondary")104 105 with gr.Column(scale=4):106 test_text = gr.Textbox(107 label="Test Text",108 placeholder="Please input test text",109 value=webui_config.localization.DEFAULT_SPEAKER_TEST_TEXT,110 )111 with gr.Row():112 current_seed = gr.Label(label="Current Seed", value=-1)113 with gr.Column(scale=4):114 output_audio = gr.Audio(label="Output Audio", format="mp3")115 116 test_voice_btn.click(117 fn=test_spk_voice,118 inputs=[seed_input, test_text],119 outputs=[output_audio],120 )121 test_voice_btn.click(122 fn=lambda x: x,123 inputs=[seed_input],124 outputs=[current_seed],125 )126 127 gr.Markdown("SPEAKER_CREATOR_GUIDE")128 129 with gr.Row():130 with gr.Column(scale=2):131 with gr.Group():132 gr.Markdown("ℹ️Speaker info")133 seed_input = gr.Number(label="Seed", value=2)134 name_input = gr.Textbox(135 label="Name", placeholder="Enter speaker name", value="Bob"136 )137 gender_input = gr.Textbox(138 label="Gender", placeholder="Enter gender", value="*"139 )140 desc_input = gr.Textbox(141 label="Description",142 placeholder="Enter description",143 )144 random_button = gr.Button("Random Speaker")145 with gr.Group():146 gr.Markdown("🔊Generate speaker.pt")147 generate_button = gr.Button("Save .pt file")148 output_file = gr.File(label="Save to File")149 with gr.Column(scale=5):150 create_test_voice_card(seed_input=seed_input)151 create_test_voice_card(seed_input=seed_input)152 create_test_voice_card(seed_input=seed_input)153 create_test_voice_card(seed_input=seed_input)154 155 random_button.click(156 random_speaker,157 outputs=[seed_input, name_input],158 )159 160 generate_button.click(161 fn=on_generate,162 inputs=[seed_input, name_input, gender_input, desc_input],163 outputs=[output_file],164 )165 