CoolFace
Apppublic

lenML/ChatTTS-Forge

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