Spaces:
Runtime error
Runtime error
""" | |
Web application for the Ultimate RVC project. | |
Each tab of the application is defined in its own module in the | |
`web/tabs` directory. Components that are accessed across multiple | |
tabs are passed as arguments to the render functions in the respective | |
modules. | |
""" | |
from typing import Annotated | |
import os | |
import gradio as gr | |
import typer | |
from ultimate_rvc.common import AUDIO_DIR, MODELS_DIR, TEMP_DIR | |
from ultimate_rvc.core.generate.song_cover import get_named_song_dirs | |
from ultimate_rvc.core.manage.audio import get_saved_output_audio | |
from ultimate_rvc.core.manage.models import get_saved_model_names | |
from ultimate_rvc.web.tabs.manage_audio import render as render_manage_audio_tab | |
from ultimate_rvc.web.tabs.manage_models import render as render_manage_models_tab | |
from ultimate_rvc.web.tabs.multi_step_generation import render as render_multi_step_tab | |
from ultimate_rvc.web.tabs.one_click_generation import render as render_one_click_tab | |
from ultimate_rvc.web.tabs.other_settings import render as render_other_settings_tab | |
app_wrapper = typer.Typer() | |
def _init_app() -> list[gr.Dropdown]: | |
""" | |
Initialize the Ultimate RVC web application by updating the choices | |
of all dropdown components. | |
Returns | |
------- | |
tuple[gr.Dropdown, ...] | |
Updated dropdowns for selecting voice models, cached songs, | |
and output audio files. | |
""" | |
model_names = get_saved_model_names() | |
named_song_dirs = get_named_song_dirs() | |
models = [ | |
gr.Dropdown( | |
choices=model_names, | |
value=None if not model_names else model_names[0], | |
) | |
for _ in range(2) | |
] | |
model_delete = [gr.Dropdown(choices=model_names)] | |
cached_songs = [gr.Dropdown(choices=named_song_dirs) for _ in range(3)] | |
song_dirs = [ | |
gr.Dropdown( | |
choices=named_song_dirs, | |
value=None if not named_song_dirs else named_song_dirs[0][1], | |
) | |
for _ in range(5) | |
] | |
output_audio = [gr.Dropdown(choices=get_saved_output_audio())] | |
return models + model_delete + cached_songs + song_dirs + output_audio | |
def render_app() -> gr.Blocks: | |
""" | |
Render the Ultimate RVC web application. | |
Returns | |
------- | |
gr.Blocks | |
The rendered web application. | |
""" | |
css = """ | |
h1 { text-align: center; margin-top: 20px; margin-bottom: 20px; } | |
""" | |
cache_delete_frequency = 86400 # every 24 hours check for files to delete | |
cache_delete_cutoff = 86400 # and delete files older than 24 hours | |
with gr.Blocks( | |
title="Ultimate RVC", | |
css=css, | |
delete_cache=(cache_delete_frequency, cache_delete_cutoff), | |
) as app: | |
gr.HTML("<h1>Ultimate RVC 🧡</h1>") | |
song_dirs = [ | |
gr.Dropdown( | |
# NOTE choices and value must be explicitly set like | |
# this to avoid caching issues when reloading the app | |
# (and hence calling _init_app) in both production and | |
# development modes | |
choices=get_named_song_dirs(), | |
value=None, | |
label="Song directory", | |
info=( | |
"Directory where intermediate audio files are stored and loaded" | |
" from locally. When a new song is retrieved, its directory is" | |
" chosen by default." | |
), | |
render=False, | |
) | |
for _ in range(5) | |
] | |
cached_song_1click, cached_song_multi = [ | |
gr.Dropdown( | |
label="Source", | |
info="Select a song from the list of cached songs.", | |
visible=False, | |
render=False, | |
) | |
for _ in range(2) | |
] | |
intermediate_audio = gr.Dropdown( | |
label="Song directories", | |
multiselect=True, | |
info=( | |
"Select one or more song directories containing intermediate audio" | |
" files to delete." | |
), | |
render=False, | |
) | |
output_audio = gr.Dropdown( | |
label="Output audio files", | |
multiselect=True, | |
info="Select one or more output audio files to delete.", | |
render=False, | |
) | |
model_1click, model_multi = [ | |
gr.Dropdown( | |
# NOTE choices and value must be explicitly set like | |
# this to avoid caching issues when reloading the app | |
# (and hence calling _init_app) in both production and | |
# development modes | |
choices=get_saved_model_names(), | |
value=None, | |
label="Voice model", | |
render=False, | |
info="Select a voice model to use for converting vocals.", | |
) | |
for _ in range(2) | |
] | |
model_delete = gr.Dropdown(label="Voice models", multiselect=True, render=False) | |
# main tab | |
with gr.Tab("Generate song covers"): | |
render_one_click_tab( | |
song_dirs, | |
cached_song_1click, | |
cached_song_multi, | |
model_1click, | |
intermediate_audio, | |
output_audio, | |
) | |
render_multi_step_tab( | |
song_dirs, | |
cached_song_1click, | |
cached_song_multi, | |
model_multi, | |
intermediate_audio, | |
output_audio, | |
) | |
with gr.Tab("Manage models"): | |
render_manage_models_tab( | |
model_delete, | |
model_1click, | |
model_multi, | |
) | |
with gr.Tab("Manage audio"): | |
render_manage_audio_tab( | |
song_dirs, | |
cached_song_1click, | |
cached_song_multi, | |
intermediate_audio, | |
output_audio, | |
) | |
with gr.Tab("Other settings"): | |
render_other_settings_tab() | |
app.load( | |
_init_app, | |
outputs=[ | |
model_1click, | |
model_multi, | |
model_delete, | |
intermediate_audio, | |
cached_song_1click, | |
cached_song_multi, | |
*song_dirs, | |
output_audio, | |
], | |
show_progress="hidden", | |
) | |
return app | |
app = render_app() | |
def start_app( | |
share: Annotated[ | |
bool, | |
typer.Option("--share", "-s", help="Enable sharing"), | |
] = False, | |
listen: Annotated[ | |
bool, | |
typer.Option( | |
"--listen", | |
"-l", | |
help="Make the web application reachable from your local network.", | |
), | |
] = False, | |
listen_host: Annotated[ | |
str | None, | |
typer.Option( | |
"--listen-host", | |
"-h", | |
help="The hostname that the server will use.", | |
), | |
] = None, | |
listen_port: Annotated[ | |
int | None, | |
typer.Option( | |
"--listen-port", | |
"-p", | |
help="The listening port that the server will use.", | |
), | |
] = None, | |
ssr_mode: Annotated[ | |
bool, | |
typer.Option( | |
"--ssr-mode", | |
help="Enable server-side rendering mode.", | |
), | |
] = False, | |
) -> None: | |
"""Run the Ultimate RVC web application.""" | |
os.environ["GRADIO_TEMP_DIR"] = str(TEMP_DIR) | |
gr.set_static_paths([MODELS_DIR, AUDIO_DIR]) | |
app.queue() | |
app.launch( | |
share=share, | |
server_name=(None if not listen else (listen_host or "0.0.0.0")), # noqa: S104 | |
server_port=listen_port, | |
ssr_mode=ssr_mode, | |
) | |
if __name__ == "__main__": | |
app_wrapper() | |