123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392 |
- # ruff: noqa: E402
- # %%
- print("Starting server...\n")
- import tts_webui.utils.setup_or_recover as setup_or_recover
- setup_or_recover.setup_or_recover()
- import tts_webui.utils.dotenv_init as dotenv_init
- dotenv_init.init()
- import os
- import gradio as gr
- from tts_webui.utils.suppress_warnings import suppress_warnings
- suppress_warnings()
- from tts_webui.config.load_config import default_config
- from tts_webui.config.config import config
- from tts_webui.css.css import full_css
- from tts_webui.history_tab.collections_directories_atom import (
- collections_directories_atom,
- )
- from tts_webui.utils.generic_error_tab_advanced import generic_error_tab_advanced
- from tts_webui.extensions_loader.interface_extensions import (
- extension_list_tab,
- handle_extension_class,
- )
- from tts_webui.extensions_loader.decorator_extensions import (
- extension_decorator_list_tab,
- )
- def reload_config_and_restart_ui():
- os._exit(0)
- # print("Reloading config and restarting UI...")
- # config = load_config()
- # gradio_interface_options = config["gradio_interface_options"] if "gradio_interface_options" in config else {}
- # demo.close()
- # time.sleep(1)
- # demo.launch(**gradio_interface_options)
- gradio_interface_options = (
- config["gradio_interface_options"]
- if "gradio_interface_options" in config
- else default_config
- )
- import time
- import importlib
- def run_tab(module_name, function_name, name, requirements=None):
- print(f"Loading {name} tab...")
- start_time = time.time()
- try:
- module = importlib.import_module(module_name)
- func = getattr(module, function_name)
- func()
- except Exception as e:
- generic_error_tab_advanced(e, name=name, requirements=requirements)
- finally:
- elapsed_time = time.time() - start_time
- print(f" Done in {elapsed_time:.2f} seconds. ({name})\n")
- def load_tabs(list_of_tabs):
- for tab in list_of_tabs:
- module_name, function_name, name = tab[:3]
- requirements = tab[3] if len(tab) > 3 else None
- run_tab(module_name, function_name, name, requirements)
- def main_ui(theme_choice="Base"):
- themes = {
- "Base": gr.themes.Base,
- "Default": gr.themes.Default,
- "Monochrome": gr.themes.Monochrome,
- }
- theme: gr.themes.Base = themes[theme_choice](
- # primary_hue="blue",
- primary_hue="sky",
- secondary_hue="sky",
- neutral_hue="neutral",
- font=[
- gr.themes.GoogleFont("Inter"),
- "ui-sans-serif",
- "system-ui",
- "sans-serif",
- ],
- )
- theme.set(
- embed_radius="*radius_sm",
- block_label_radius="*radius_sm",
- block_label_right_radius="*radius_sm",
- block_radius="*radius_sm",
- block_title_radius="*radius_sm",
- container_radius="*radius_sm",
- checkbox_border_radius="*radius_sm",
- input_radius="*radius_sm",
- table_radius="*radius_sm",
- button_large_radius="*radius_sm",
- button_small_radius="*radius_sm",
- button_primary_background_fill_hover="*primary_300",
- button_primary_background_fill_hover_dark="*primary_600",
- button_secondary_background_fill_hover="*secondary_200",
- button_secondary_background_fill_hover_dark="*secondary_600",
- )
- with gr.Blocks(
- css=full_css,
- title="TTS Generation WebUI",
- analytics_enabled=False, # it broke too many times
- theme=theme,
- ) as blocks:
- gr.Markdown(
- """
- # TTS Generation WebUI (Legacy - Gradio) [React UI](http://localhost:3000) [Feedback / Bug reports](https://forms.gle/2L62owhBsGFzdFBC8) [Discord Server](https://discord.gg/V8BKTVRtJ9)
- ### _(Text To Speech, Audio & Music Generation, Conversion)_
- """
- )
- with gr.Tabs():
- all_tabs()
- return blocks
- def all_tabs():
- with gr.Tab("Text-to-Speech"), gr.Tabs():
- tts_tabs = [
- ("tts_webui.bark.bark_tab", "bark_tab", "Bark TTS"),
- (
- "tts_webui.bark.clone.tab_voice_clone",
- "tab_voice_clone",
- "Bark Voice Clone",
- "-r requirements_bark_hubert_quantizer.txt",
- ),
- (
- "tts_webui.tortoise.tortoise_tab",
- "tortoise_tab",
- "Tortoise TTS",
- ),
- (
- "tts_webui.seamlessM4T.seamless_tab",
- "seamless_tab",
- "SeamlessM4Tv2Model",
- ),
- (
- "tts_webui.vall_e_x.vall_e_x_tab",
- "valle_x_tab",
- "Valle-X",
- "-r requirements_vall_e.txt",
- ),
- ("tts_webui.mms.mms_tab", "mms_tab", "MMS"),
- (
- "tts_webui.maha_tts.maha_tts_tab",
- "maha_tts_tab",
- "MahaTTS",
- "-r requirements_maha_tts.txt",
- ),
- (
- "tts_webui.styletts2.styletts2_tab",
- "style_tts2_tab",
- "StyleTTS2",
- "-r requirements_styletts2.txt",
- ),
- ]
- load_tabs(tts_tabs)
- handle_extension_class("text-to-speech", config)
- with gr.Tab("Audio/Music Generation"), gr.Tabs():
- audio_music_generation_tabs = [
- (
- "tts_webui.stable_audio.stable_audio_tab",
- "stable_audio_tab",
- "Stable Audio",
- "-r requirements_stable_audio.txt",
- ),
- (
- "tts_webui.magnet.magnet_tab",
- "magnet_tab",
- "MAGNeT",
- "-r requirements_audiocraft.txt",
- ),
- (
- "tts_webui.musicgen.musicgen_tab",
- "musicgen_tab",
- "MusicGen",
- "-r requirements_audiocraft.txt",
- ),
- ]
- load_tabs(audio_music_generation_tabs)
- handle_extension_class("audio-music-generation", config)
- with gr.Tab("Audio Conversion"), gr.Tabs():
- audio_conversion_tabs = [
- (
- "tts_webui.rvc_tab.rvc_tab",
- "rvc_conversion_tab",
- "RVC",
- "-r requirements_rvc.txt",
- ),
- (
- "tts_webui.rvc_tab.uvr5_tab",
- "uvr5_tab",
- "UVR5",
- "-r requirements_rvc.txt",
- ),
- (
- "tts_webui.demucs.demucs_tab",
- "demucs_tab",
- "Demucs",
- "-r requirements_audiocraft.txt",
- ),
- ("tts_webui.vocos.vocos_tabs", "vocos_tabs", "Vocos"),
- ]
- load_tabs(audio_conversion_tabs)
- handle_extension_class("audio-conversion", config)
- with gr.Tab("Outputs"), gr.Tabs():
- from tts_webui.history_tab.main import history_tab
- collections_directories_atom.render()
- try:
- history_tab()
- history_tab(directory="favorites")
- history_tab(
- directory="outputs",
- show_collections=True,
- )
- except Exception as e:
- generic_error_tab_advanced(e, name="History", requirements=None)
- outputs_tabs = [
- # voices
- # ("tts_webui.history_tab.voices_tab", "voices_tab", "Voices"),
- ]
- load_tabs(outputs_tabs)
- handle_extension_class("outputs", config)
- with gr.Tab("Tools"), gr.Tabs():
- tools_tabs = []
- load_tabs(tools_tabs)
- handle_extension_class("tools", config)
- with gr.Tab("Settings"), gr.Tabs():
- from tts_webui.settings_tab_gradio import settings_tab_gradio
- settings_tab_gradio(reload_config_and_restart_ui, gradio_interface_options)
- settings_tabs = [
- # (
- # "tts_webui.bark.settings_tab_bark",
- # "settings_tab_bark",
- # "Settings (Bark)",
- # ),
- (
- "tts_webui.utils.model_location_settings_tab",
- "model_location_settings_tab",
- "Model Location Settings",
- ),
- ("tts_webui.utils.gpu_info_tab", "gpu_info_tab", "GPU Info"),
- ("tts_webui.utils.pip_list_tab", "pip_list_tab", "Installed Packages"),
- ]
- load_tabs(settings_tabs)
- extension_list_tab()
- extension_decorator_list_tab()
- handle_extension_class("settings", config)
- def start_gradio_server():
- def print_pretty_options(options):
- print(" Gradio interface options:")
- max_key_length = max(len(key) for key in options.keys())
- for key, value in options.items():
- if key == "auth" and value is not None:
- print(f" {key}:{' ' * (max_key_length - len(key))} {value[0]}:******")
- else:
- print(f" {key}:{' ' * (max_key_length - len(key))} {value}")
- # detect if --share is passed
- if "--share" in os.sys.argv:
- print("Gradio share mode enabled")
- gradio_interface_options["share"] = True
- if "--docker" in os.sys.argv:
- gradio_interface_options["server_name"] = "0.0.0.0"
- print("Info: Docker mode: opening gradio server on all interfaces")
- print("Starting Gradio server...")
- if "enable_queue" in gradio_interface_options:
- del gradio_interface_options["enable_queue"]
- if gradio_interface_options["auth"] is not None:
- # split username:password into (username, password)
- gradio_interface_options["auth"] = tuple(
- gradio_interface_options["auth"].split(":")
- )
- print("Gradio server authentication enabled")
- # delete show_tips option
- if "show_tips" in gradio_interface_options:
- del gradio_interface_options["show_tips"]
- # TypeError: Blocks.launch() got an unexpected keyword argument 'file_directories'
- if "file_directories" in gradio_interface_options:
- del gradio_interface_options["file_directories"]
- print_pretty_options(gradio_interface_options)
- demo = main_ui()
- print("\n\n")
- if gradio_interface_options["server_name"] == "0.0.0.0":
- print("Notice: Server is open to the internet")
- print(
- f"Gradio server will be available on http://localhost:{gradio_interface_options['server_port']}"
- )
- # concurrency_count=gradio_interface_options.get("concurrency_count", 5),
- demo.queue().launch(**gradio_interface_options, allowed_paths=["."])
- def server_hypervisor():
- import subprocess
- import signal
- import sys
- postgres_dir = os.path.join("data", "postgres")
- def stop_postgres(postgres_process):
- try:
- subprocess.check_call(f"pg_ctl stop -D {postgres_dir} -m fast", shell=True)
- print("PostgreSQL stopped gracefully.")
- except Exception as e:
- print(f"Error stopping PostgreSQL: {e}")
- postgres_process.terminate()
- def signal_handler(signal, frame, postgres_process):
- print("Shutting down...")
- stop_postgres(postgres_process)
- sys.exit(0)
- print("Starting React UI...")
- subprocess.Popen(
- "npm start --prefix react-ui",
- env={
- **os.environ,
- "GRADIO_BACKEND_AUTOMATIC": f"http://127.0.0.1:{gradio_interface_options['server_port']}",
- },
- shell=True,
- )
- if "--docker" in os.sys.argv:
- print("Info: Docker mode: skipping Postgres")
- return
- print("Starting Postgres...")
- postgres_process = subprocess.Popen(f"postgres -D {postgres_dir} -p 7773", shell=True)
- try:
- signal.signal(
- signal.SIGINT,
- lambda sig, frame: signal_handler(sig, frame, postgres_process),
- ) # Ctrl+C
- signal.signal(
- signal.SIGTERM,
- lambda sig, frame: signal_handler(sig, frame, postgres_process),
- ) # Termination signals
- if os.name != "nt":
- signal.signal(
- signal.SIGHUP,
- lambda sig, frame: signal_handler(sig, frame, postgres_process),
- ) # Terminal closure
- signal.signal(
- signal.SIGQUIT,
- lambda sig, frame: signal_handler(sig, frame, postgres_process),
- ) # Quit
- except (ValueError, OSError) as e:
- print(f"Failed to set signal handlers: {e}")
- if __name__ == "__main__":
- server_hypervisor()
- import webbrowser
- if gradio_interface_options["inbrowser"]:
- webbrowser.open("http://localhost:3000")
- start_gradio_server()
|