lenML/ChatTTS-Forge
301
1import gradio as gr2import torch3 4from modules.webui import webui_config5from modules.webui.webui_utils import (6 get_speakers,7 get_styles,8 load_spk_info,9 refine_text,10 tts_generate,11)12 13 14def create_tts_interface():15 speakers = get_speakers()16 17 def get_speaker_show_name(spk):18 if spk.gender == "*" or spk.gender == "":19 return spk.name20 return f"{spk.gender} : {spk.name}"21 22 speaker_names = ["*random"] + [23 get_speaker_show_name(speaker) for speaker in speakers24 ]25 speaker_names.sort(key=lambda x: x.startswith("*") and "-1" or x)26 27 styles = ["*auto"] + [s.get("name") for s in get_styles()]28 29 history = []30 31 with gr.Row():32 with gr.Column(scale=1):33 with gr.Row():34 with gr.Group():35 gr.Markdown("🗣️Speaker")36 with gr.Tabs():37 with gr.Tab(label="Pick"):38 spk_input_text = gr.Textbox(39 label="Speaker (Text or Seed)",40 value="female2",41 show_label=False,42 )43 spk_input_dropdown = gr.Dropdown(44 choices=speaker_names,45 # label="Choose Speaker",46 interactive=True,47 value="female : female2",48 show_label=False,49 )50 spk_rand_button = gr.Button(51 value="🎲",52 # tooltip="Random Seed",53 variant="secondary",54 )55 spk_input_dropdown.change(56 fn=lambda x: x.startswith("*")57 and "-1"58 or x.split(":")[-1].strip(),59 inputs=[spk_input_dropdown],60 outputs=[spk_input_text],61 )62 spk_rand_button.click(63 lambda x: str(torch.randint(0, 2**32 - 1, (1,)).item()),64 inputs=[spk_input_text],65 outputs=[spk_input_text],66 )67 68 with gr.Tab(label="Upload"):69 spk_file_upload = gr.File(70 label="Speaker (Upload)", file_types=[".pt"]71 )72 73 gr.Markdown("📝Speaker info")74 infos = gr.Markdown("empty", elem_classes=["no-translate"])75 76 spk_file_upload.change(77 fn=load_spk_info,78 inputs=[spk_file_upload],79 outputs=[infos],80 )81 82 with gr.Row():83 with gr.Group():84 gr.Markdown("🎭Style")85 gr.Markdown("TTS_STYLE_GUIDE")86 style_input_dropdown = gr.Dropdown(87 choices=styles,88 # label="Choose Style",89 interactive=True,90 show_label=False,91 value="*auto",92 )93 94 with gr.Group():95 gr.Markdown("🎛️Sampling")96 temperature_input = gr.Slider(97 0.01, 2.0, value=0.3, step=0.01, label="Temperature"98 )99 top_p_input = gr.Slider(0.1, 1.0, value=0.7, step=0.1, label="Top P")100 top_k_input = gr.Slider(1, 50, value=20, step=1, label="Top K")101 batch_size_input = gr.Slider(102 1,103 webui_config.max_batch_size,104 value=4,105 step=1,106 label="Batch Size",107 )108 with gr.Group():109 gr.Markdown("🎛️Spliter")110 eos_input = gr.Textbox(111 label="eos",112 value="[uv_break]",113 )114 spliter_thr_input = gr.Slider(115 label="Spliter Threshold",116 value=100,117 minimum=50,118 maximum=1000,119 step=1,120 )121 122 with gr.Group():123 gr.Markdown("💃Inference Seed")124 infer_seed_input = gr.Number(125 value=42,126 label="Inference Seed",127 show_label=False,128 minimum=-1,129 maximum=2**32 - 1,130 )131 infer_seed_rand_button = gr.Button(132 value="🎲",133 # tooltip="Random Seed",134 variant="secondary",135 )136 # 感觉这个没必要设置...137 use_decoder_input = gr.Checkbox(138 value=True, label="Use Decoder", visible=False139 )140 141 infer_seed_rand_button.click(142 lambda x: int(torch.randint(0, 2**32 - 1, (1,)).item()),143 inputs=[infer_seed_input],144 outputs=[infer_seed_input],145 )146 with gr.Column(scale=4):147 with gr.Group():148 input_title = gr.Markdown(149 "📝Text Input",150 elem_id="input-title",151 )152 gr.Markdown(f"TTS_TEXT_GUIDE")153 text_input = gr.Textbox(154 show_label=False,155 label="Text to Speech",156 lines=10,157 placeholder="输入文本或选择示例",158 elem_id="text-input",159 value=webui_config.localization.DEFAULT_TTS_TEXT,160 )161 # TODO 字数统计,其实实现很好写,但是就是会触发loading...并且还要和后端交互...162 # text_input.change(163 # fn=lambda x: (164 # f"📝Text Input ({len(x)} char)"165 # if x166 # else (167 # "📝Text Input (0 char)"168 # if not x169 # else "📝Text Input (0 char)"170 # )171 # ),172 # inputs=[text_input],173 # outputs=[input_title],174 # )175 with gr.Row():176 contorl_tokens = [177 "[laugh]",178 "[uv_break]",179 "[v_break]",180 "[lbreak]",181 ]182 183 for tk in contorl_tokens:184 t_btn = gr.Button(tk)185 t_btn.click(186 lambda text, tk=tk: text + " " + tk,187 inputs=[text_input],188 outputs=[text_input],189 )190 191 with gr.Group():192 gr.Markdown("🎄Examples")193 sample_dropdown = gr.Dropdown(194 choices=[195 sample["text"]196 for sample in webui_config.localization.tts_examples197 ],198 show_label=False,199 value=None,200 interactive=True,201 )202 sample_dropdown.change(203 fn=lambda x: x,204 inputs=[sample_dropdown],205 outputs=[text_input],206 )207 208 with gr.Group():209 gr.Markdown("🎨Output")210 tts_output = gr.Audio(label="Generated Audio", format="mp3")211 with gr.Column(scale=1):212 with gr.Group():213 gr.Markdown("🎶Refiner")214 refine_prompt_input = gr.Textbox(215 label="Refine Prompt",216 value="[oral_2][laugh_0][break_6]",217 )218 refine_button = gr.Button("✍️Refine Text")219 220 # 由于使用不是很方便,所以列为实验性功能221 with gr.Group(visible=webui_config.experimental):222 gr.Markdown("🔧Prompt engineering")223 prompt1_input = gr.Textbox(label="Prompt 1")224 prompt2_input = gr.Textbox(label="Prompt 2")225 prefix_input = gr.Textbox(label="Prefix")226 227 prompt_audio = gr.File(228 label="prompt_audio", visible=webui_config.experimental229 )230 231 with gr.Group():232 gr.Markdown("🎛️Adjuster")233 # 调节 speed pitch volume234 # 可以选择开启 响度均衡235 236 speed_input = gr.Slider(237 label="Speed",238 value=1.0,239 minimum=0.5,240 maximum=2.0,241 step=0.1,242 )243 pitch_input = gr.Slider(244 label="Pitch",245 value=0,246 minimum=-12,247 maximum=12,248 step=0.1,249 )250 volume_up_input = gr.Slider(251 label="Volume Gain",252 value=0,253 minimum=-12,254 maximum=12,255 step=0.1,256 )257 258 enable_loudness_normalization = gr.Checkbox(259 value=True,260 label="Enable Loudness EQ",261 )262 headroom_input = gr.Slider(263 label="Headroom",264 value=1,265 minimum=0,266 maximum=12,267 step=0.1,268 )269 270 with gr.Group():271 gr.Markdown("🔊Generate")272 disable_normalize_input = gr.Checkbox(273 value=False,274 label="Disable Normalize",275 # 不需要了276 visible=False,277 )278 279 with gr.Group():280 # gr.Markdown("💪🏼Enhance")281 enable_enhance = gr.Checkbox(value=True, label="Enable Enhance")282 enable_de_noise = gr.Checkbox(value=False, label="Enable De-noise")283 tts_button = gr.Button(284 "🔊Generate Audio",285 variant="primary",286 elem_classes="big-button",287 )288 289 refine_button.click(290 refine_text,291 inputs=[text_input, refine_prompt_input],292 outputs=[text_input],293 )294 295 tts_button.click(296 tts_generate,297 inputs=[298 text_input,299 temperature_input,300 top_p_input,301 top_k_input,302 spk_input_text,303 infer_seed_input,304 use_decoder_input,305 prompt1_input,306 prompt2_input,307 prefix_input,308 style_input_dropdown,309 disable_normalize_input,310 batch_size_input,311 enable_enhance,312 enable_de_noise,313 spk_file_upload,314 spliter_thr_input,315 eos_input,316 pitch_input,317 speed_input,318 volume_up_input,319 enable_loudness_normalization,320 headroom_input,321 ],322 outputs=tts_output,323 )324 