|
import gradio as gr |
|
import os |
|
import glob |
|
import subprocess |
|
from pathlib import Path |
|
from datetime import datetime |
|
from helpers import update_model_dropdown, handle_file_upload, clear_old_output, save_uploaded_file, update_file_list |
|
from download import download_callback |
|
from model import get_model_config, MODEL_CONFIGS |
|
from processing import process_audio, auto_ensemble_process, ensemble_audio_fn |
|
|
|
|
|
BASE_DIR = os.path.dirname(os.path.abspath(__file__)) |
|
|
|
|
|
def create_interface(): |
|
|
|
css = """ |
|
/* Genel Tema */ |
|
body { |
|
background: url('/content/studio_bg.jpg') no-repeat center center fixed; |
|
background-size: cover; |
|
background-color: #1a0d0d; /* Daha koyu ve sofistike kırmızı ton */ |
|
min-height: 100vh; |
|
margin: 0; |
|
padding: 2rem; |
|
font-family: 'Montserrat', sans-serif; /* Daha modern ve profesyonel font */ |
|
color: #D4A017; /* Altın tonu metin, lüks hissi */ |
|
overflow-x: hidden; |
|
} |
|
|
|
body::before { |
|
content: ''; |
|
position: fixed; |
|
top: 0; |
|
left: 0; |
|
width: 100%; |
|
height: 100%; |
|
background: linear-gradient(135deg, rgba(26, 13, 13, 0.9), rgba(45, 11, 11, 0.85)); |
|
z-index: -1; |
|
} |
|
|
|
/* Logo Stilleri */ |
|
.logo-container { |
|
position: fixed; |
|
top: 1.5rem; |
|
left: 2rem; |
|
display: flex; |
|
align-items: center; |
|
z-index: 3000; |
|
background: rgba(0, 0, 0, 0.7); |
|
padding: 0.5rem 1rem; |
|
border-radius: 10px; |
|
box-shadow: 0 4px 15px rgba(212, 160, 23, 0.3); |
|
} |
|
|
|
.logo-img { |
|
width: 100px; |
|
height: auto; |
|
filter: drop-shadow(0 0 5px rgba(212, 160, 23, 0.5)); |
|
} |
|
|
|
/* Başlık Stilleri */ |
|
.header-text { |
|
text-align: center; |
|
padding: 4rem 0 2rem; |
|
color: #D4A017; /* Altın tonu, profesyonel ve dikkat çekici */ |
|
font-size: 3rem; |
|
font-weight: 800; |
|
text-transform: uppercase; |
|
letter-spacing: 2px; |
|
text-shadow: 0 0 15px rgba(212, 160, 23, 0.7), 0 0 5px rgba(255, 64, 64, 0.5); |
|
z-index: 1500; |
|
animation: text-glow 4s infinite ease-in-out; |
|
} |
|
|
|
/* Profesyonel Panel Stili */ |
|
.dubbing-panel { |
|
background: rgba(26, 13, 13, 0.95); |
|
border: 1px solid #D4A017; |
|
border-radius: 12px; |
|
padding: 1.5rem; |
|
box-shadow: 0 8px 25px rgba(212, 160, 23, 0.2); |
|
transition: transform 0.3s ease; |
|
} |
|
|
|
.dubbing-panel:hover { |
|
transform: translateY(-5px); |
|
} |
|
|
|
/* Düğme Stilleri */ |
|
button { |
|
background: linear-gradient(45deg, #800000, #A31818); /* Koyu kırmızıdan parlak kırmızıya */ |
|
border: 1px solid #D4A017 !important; |
|
color: #FFF !important; |
|
border-radius: 8px !important; |
|
padding: 10px 20px !important; |
|
font-weight: 600; |
|
text-transform: uppercase; |
|
letter-spacing: 1px; |
|
transition: all 0.3s ease !important; |
|
box-shadow: 0 4px 15px rgba(212, 160, 23, 0.3); |
|
} |
|
|
|
button:hover { |
|
background: linear-gradient(45deg, #A31818, #D42F2F) !important; |
|
transform: scale(1.05) !important; |
|
box-shadow: 0 6px 20px rgba(212, 160, 23, 0.5) !important; |
|
} |
|
|
|
/* Yükleme Alanı */ |
|
.compact-upload.horizontal { |
|
background: rgba(26, 13, 13, 0.9); |
|
border: 1px solid #D4A017; |
|
border-radius: 8px; |
|
padding: 0.5rem 1rem; |
|
display: flex; |
|
align-items: center; |
|
gap: 10px; |
|
max-width: 450px; |
|
transition: all 0.3s ease; |
|
} |
|
|
|
.compact-upload.horizontal:hover { |
|
border-color: #FFD700; /* Parlak altın hover efekti */ |
|
background: rgba(45, 11, 11, 0.95); |
|
} |
|
|
|
.compact-upload.horizontal button { |
|
background: #800000; |
|
border: 1px solid #D4A017; |
|
padding: 6px 12px; |
|
font-size: 0.8rem; |
|
} |
|
|
|
/* Sekme Stilleri */ |
|
.gr-tab { |
|
background: rgba(26, 13, 13, 0.9); |
|
border: 1px solid #D4A017; |
|
border-radius: 12px 12px 0 0; |
|
padding: 0.75rem 1.5rem; |
|
color: #D4A017; |
|
font-weight: 600; |
|
text-transform: uppercase; |
|
transition: all 0.3s ease; |
|
} |
|
|
|
.gr-tab-selected { |
|
background: #800000; |
|
color: #FFF; |
|
border-bottom: none; |
|
box-shadow: 0 4px 15px rgba(212, 160, 23, 0.4); |
|
} |
|
|
|
/* Altbilgi */ |
|
.footer { |
|
text-align: center; |
|
padding: 1rem; |
|
color: #D4A017; |
|
font-size: 1rem; |
|
font-weight: 500; |
|
text-shadow: 0 0 5px rgba(212, 160, 23, 0.3); |
|
position: relative; |
|
z-index: 1001; |
|
} |
|
|
|
/* Animasyonlar */ |
|
@keyframes text-glow { |
|
0% { text-shadow: 0 0 5px rgba(212, 160, 23, 0.5); } |
|
50% { text-shadow: 0 0 20px rgba(212, 160, 23, 1), 0 0 10px rgba(255, 64, 64, 0.7); } |
|
100% { text-shadow: 0 0 5px rgba(212, 160, 23, 0.5); } |
|
} |
|
""" |
|
|
|
|
|
with gr.Blocks(theme=gr.themes.Soft(), css=css) as demo: |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=1, min_width=200): |
|
gr.HTML(""" |
|
<div class="logo-container"> |
|
<img src="/content/gk_logo.png" alt="Gecekondu Dubbing" class="logo-img"> |
|
</div> |
|
""") |
|
with gr.Column(scale=4): |
|
gr.HTML(""" |
|
<div class="header-text"> |
|
Gecekondu Dubbing Production |
|
</div> |
|
""") |
|
|
|
with gr.Tabs(): |
|
with gr.Tab("Audio Separation", elem_id="separation_tab"): |
|
with gr.Row(equal_height=True): |
|
|
|
with gr.Column(scale=1, min_width=380): |
|
with gr.Accordion("📥 Input & Model", open=True): |
|
with gr.Tabs(): |
|
with gr.Tab("🖥 Upload"): |
|
input_audio_file = gr.File( |
|
file_types=[".wav", ".mp3", ".m4a", ".mp4", ".mkv", ".flac"], |
|
elem_classes=["compact-upload", "horizontal", "x-narrow"], |
|
label="" |
|
) |
|
|
|
with gr.Tab("📂 Path"): |
|
file_path_input = gr.Textbox(placeholder="/path/to/audio.wav") |
|
|
|
with gr.Row(): |
|
model_category = gr.Dropdown( |
|
label="Category", |
|
choices=list(MODEL_CONFIGS.keys()), |
|
value="Vocal Models" |
|
) |
|
model_dropdown = gr.Dropdown( |
|
label="Model", |
|
choices=list(MODEL_CONFIGS["Vocal Models"].keys()) |
|
) |
|
|
|
with gr.Accordion("⚙ Settings", open=False): |
|
with gr.Row(): |
|
export_format = gr.Dropdown( |
|
label="Format", |
|
choices=['wav FLOAT', 'flac PCM_16', 'flac PCM_24'], |
|
value='wav FLOAT' |
|
) |
|
chunk_size = gr.Dropdown( |
|
label="Chunk Size", |
|
choices=[352800, 485100], |
|
value=352800, |
|
info="Don't change unless you have specific requirements" |
|
) |
|
|
|
with gr.Row(): |
|
overlap = gr.Slider(2, 50, step=1, label="Overlap", value=2) |
|
gr.Markdown("Recommended: 2-10 (Higher values increase quality but require more VRAM)") |
|
use_tta = gr.Checkbox(label="TTA Boost") |
|
|
|
with gr.Row(): |
|
use_demud_phaseremix_inst = gr.Checkbox(label="Phase Fix") |
|
gr.Markdown("Advanced phase correction for instrumental tracks") |
|
extract_instrumental = gr.Checkbox(label="Instrumental") |
|
|
|
with gr.Row(): |
|
process_btn = gr.Button("🚀 Process", variant="primary") |
|
clear_old_output_btn = gr.Button("🧹 Reset", variant="secondary") |
|
clear_old_output_status = gr.Textbox(label="Status", interactive=False) |
|
|
|
|
|
with gr.Column(scale=2, min_width=800): |
|
with gr.Tabs(): |
|
with gr.Tab("🎧 Main"): |
|
with gr.Column(): |
|
original_audio = gr.Audio(label="Original", interactive=False) |
|
with gr.Row(): |
|
vocals_audio = gr.Audio(label="Vocals", show_download_button=True) |
|
instrumental_audio = gr.Audio(label="Instrumental", show_download_button=True) |
|
|
|
with gr.Tab("🔍 Details"): |
|
with gr.Column(): |
|
with gr.Row(): |
|
male_audio = gr.Audio(label="Male") |
|
female_audio = gr.Audio(label="Female") |
|
speech_audio = gr.Audio(label="Speech") |
|
with gr.Row(): |
|
drum_audio = gr.Audio(label="Drums") |
|
bass_audio = gr.Audio(label="Bass") |
|
with gr.Row(): |
|
other_audio = gr.Audio(label="Other") |
|
effects_audio = gr.Audio(label="Effects") |
|
|
|
with gr.Tab("⚙ Advanced"): |
|
with gr.Column(): |
|
with gr.Row(): |
|
phaseremix_audio = gr.Audio(label="Phase Remix") |
|
dry_audio = gr.Audio(label="Dry") |
|
with gr.Row(): |
|
music_audio = gr.Audio(label="Music") |
|
karaoke_audio = gr.Audio(label="Karaoke") |
|
bleed_audio = gr.Audio(label="Bleed") |
|
|
|
with gr.Row(): |
|
gr.Markdown(""" |
|
<div style=" |
|
background: rgba(245,245,220,0.15); |
|
padding: 1rem; |
|
border-radius: 8px; |
|
border-left: 3px solid #6c757d; |
|
margin: 1rem 0 1.5rem 0; |
|
"> |
|
<b>🔈 Processing Tip:</b> For noisy results, use <code>bleed_suppressor_v1</code> |
|
or <code>denoisedebleed</code> models in the <i>"Denoise & Effect Removal"</i> |
|
category to clean the output |
|
</div> |
|
""") |
|
|
|
|
|
with gr.Tab("Auto Ensemble"): |
|
with gr.Row(): |
|
with gr.Column(): |
|
with gr.Group(): |
|
auto_input_audio_file = gr.File(label="Upload file") |
|
auto_file_path_input = gr.Textbox( |
|
label="Or enter file path", |
|
placeholder="Enter full path to audio file", |
|
interactive=True |
|
) |
|
|
|
with gr.Accordion("⚙️ Advanced Settings", open=False): |
|
with gr.Row(): |
|
auto_use_tta = gr.Checkbox(label="Use TTA", value=False) |
|
auto_extract_instrumental = gr.Checkbox(label="Instrumental Only") |
|
|
|
with gr.Row(): |
|
auto_overlap = gr.Slider( |
|
label="Overlap", |
|
minimum=2, |
|
maximum=50, |
|
value=2, |
|
step=1 |
|
) |
|
auto_chunk_size = gr.Dropdown( |
|
label="Chunk Size", |
|
choices=[352800, 485100], |
|
value=352800 |
|
) |
|
export_format2 = gr.Dropdown( |
|
label="Output Format", |
|
choices=['wav FLOAT', 'flac PCM_16', 'flac PCM_24'], |
|
value='wav FLOAT' |
|
) |
|
|
|
|
|
with gr.Group(): |
|
gr.Markdown("### 🧠 Model Selection") |
|
with gr.Row(): |
|
auto_category_dropdown = gr.Dropdown( |
|
label="Model Category", |
|
choices=list(MODEL_CONFIGS.keys()), |
|
value="Vocal Models" |
|
) |
|
|
|
|
|
auto_model_dropdown = gr.Dropdown( |
|
label="Select Models from Category", |
|
choices=list(MODEL_CONFIGS["Vocal Models"].keys()), |
|
multiselect=True, |
|
max_choices=50, |
|
interactive=True |
|
) |
|
|
|
|
|
selected_models = gr.Dropdown( |
|
label="Selected Models", |
|
choices=[], |
|
multiselect=True, |
|
interactive=False |
|
) |
|
|
|
with gr.Row(): |
|
add_btn = gr.Button("➕ Add Selected", variant="secondary") |
|
clear_btn = gr.Button("🗑️ Clear All", variant="stop") |
|
|
|
|
|
with gr.Group(): |
|
gr.Markdown("### ⚡ Ensemble Settings") |
|
with gr.Row(): |
|
auto_ensemble_type = gr.Dropdown( |
|
label="Method", |
|
choices=['avg_wave', 'median_wave', 'min_wave', 'max_wave', |
|
'avg_fft', 'median_fft', 'min_fft', 'max_fft'], |
|
value='avg_wave' |
|
) |
|
|
|
gr.Markdown("**Recommendation:** avg_wave and max_fft best results") |
|
|
|
auto_process_btn = gr.Button("🚀 Start Processing", variant="primary") |
|
|
|
with gr.Column(): |
|
with gr.Tabs(): |
|
with gr.Tab("🔊 Original Audio"): |
|
original_audio2 = gr.Audio( |
|
label="Original Audio", |
|
interactive=False, |
|
every=1, |
|
elem_id="original_audio_player" |
|
) |
|
with gr.Tab("🎚️ Ensemble Result"): |
|
auto_output_audio = gr.Audio( |
|
label="Output Preview", |
|
show_download_button=True, |
|
interactive=False |
|
) |
|
|
|
auto_status = gr.Textbox( |
|
label="Processing Status", |
|
interactive=False, |
|
placeholder="Waiting for processing...", |
|
elem_classes="status-box" |
|
) |
|
|
|
gr.Markdown(""" |
|
<div style=" |
|
background: rgba(110, 142, 251, 0.1); |
|
padding: 1.2rem; |
|
border-radius: 12px; |
|
border-left: 4px solid #6e8efb; |
|
margin: 1rem 0; |
|
backdrop-filter: blur(3px); |
|
border: 1px solid rgba(255,255,255,0.2); |
|
"> |
|
<div style="display: flex; align-items: start; gap: 1rem;"> |
|
<div style=" |
|
font-size: 1.4em; |
|
color: #6e8efb; |
|
margin-top: -2px; |
|
">⚠️</div> |
|
<div style="color: #2d3748;"> |
|
<h4 style=" |
|
margin: 0 0 0.8rem 0; |
|
color: #4a5568; |
|
font-weight: 600; |
|
font-size: 1.1rem; |
|
"> |
|
Model Selection Guidelines |
|
</h4> |
|
<ul style=" |
|
margin: 0; |
|
padding-left: 1.2rem; |
|
color: #4a5568; |
|
line-height: 1.6; |
|
"> |
|
<li><strong>Avoid cross-category mixing:</strong> Combining vocal and instrumental models may create unwanted blends</li> |
|
<li><strong>Special model notes:</strong> |
|
<ul style="padding-left: 1.2rem; margin: 0.5rem 0;"> |
|
<li>Duality models (v1/v2) - Output both stems</li> |
|
<li>MDX23C Separator - Hybrid results</li> |
|
</ul> |
|
</li> |
|
<li><strong>Best practice:</strong> Use 3-5 similar models from same category</li> |
|
</ul> |
|
<div style=" |
|
margin-top: 1rem; |
|
padding: 0.8rem; |
|
background: rgba(167, 119, 227, 0.1); |
|
border-radius: 8px; |
|
color: #6e8efb; |
|
font-size: 0.9rem; |
|
"> |
|
💡 Pro Tip: Start with "VOCALS-MelBand-Roformer BigBeta5e" + "VOCALS-BS-Roformer_1297" combination |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
""") |
|
|
|
|
|
with gr.Tab("Download Sources"): |
|
with gr.Row(): |
|
with gr.Column(): |
|
gr.Markdown("### 🗂️ Cloud Storage") |
|
drive_url_input = gr.Textbox(label="Google Drive Shareable Link") |
|
drive_download_btn = gr.Button("⬇️ Download from Drive", variant="secondary") |
|
drive_download_status = gr.Textbox(label="Download Status") |
|
drive_download_output = gr.File(label="Downloaded File", interactive=False) |
|
|
|
with gr.Column(): |
|
gr.Markdown("### 🌐 Direct Links") |
|
direct_url_input = gr.Textbox(label="Audio File URL") |
|
direct_download_btn = gr.Button("⬇️ Download from URL", variant="secondary") |
|
direct_download_status = gr.Textbox(label="Download Status") |
|
direct_download_output = gr.File(label="Downloaded File", interactive=False) |
|
|
|
with gr.Column(): |
|
gr.Markdown("### 🍪 Cookie Management") |
|
cookie_file = gr.File( |
|
label="Upload Cookies.txt", |
|
file_types=[".txt"], |
|
interactive=True, |
|
elem_id="cookie_upload" |
|
) |
|
gr.Markdown(""" |
|
<div style="margin-left:15px; font-size:0.95em"> |
|
**📌 Why Needed?** |
|
- Access age-restricted content |
|
- Download private/unlisted videos |
|
- Bypass regional restrictions |
|
- Avoid YouTube download limits |
|
|
|
**⚠️ Important Notes** |
|
- NEVER share your cookie files! |
|
- Refresh cookies when: |
|
• Getting "403 Forbidden" errors |
|
• Downloads suddenly stop |
|
• Seeing "Session expired" messages |
|
|
|
**🔄 Renewal Steps** |
|
1. Install this <a href="https://chromewebstore.google.com/detail/get-cookiestxt-clean/ahmnmhfbokciafffnknlekllgcnafnie" target="_blank">Chrome extension</a> |
|
2. Login to YouTube in Chrome |
|
3. Click extension icon → "Export" |
|
4. Upload the downloaded file here |
|
|
|
**⏳ Cookie Lifespan** |
|
- Normal sessions: 24 hours |
|
- Sensitive operations: 1 hour |
|
- Password changes: Immediate invalidation |
|
</div> |
|
""") |
|
|
|
|
|
with gr.Tab("🎚️ Manuel Ensemble"): |
|
with gr.Row(equal_height=True): |
|
with gr.Column(scale=1, min_width=400): |
|
with gr.Accordion("📂 Input Sources", open=True): |
|
with gr.Row(): |
|
refresh_btn = gr.Button("🔄 Refresh", variant="secondary", size="sm") |
|
ensemble_type = gr.Dropdown( |
|
label="Ensemble Algorithm", |
|
choices=['avg_wave', 'median_wave', 'min_wave', 'max_wave', |
|
'avg_fft', 'median_fft', 'min_fft', 'max_fft'], |
|
value='avg_wave' |
|
) |
|
|
|
|
|
file_path = os.path.join(Path.home(), 'Music-Source-Separation', 'output') |
|
initial_files = glob.glob(f"{file_path}/*.wav") + glob.glob(os.path.join(BASE_DIR, 'Music-Source-Separation-Training', 'old_output', '*.wav')) |
|
|
|
gr.Markdown("### Select Audio Files") |
|
file_dropdown = gr.Dropdown( |
|
choices=initial_files, |
|
label="Available Files", |
|
multiselect=True, |
|
interactive=True, |
|
elem_id="file-dropdown" |
|
) |
|
|
|
weights_input = gr.Textbox( |
|
label="Custom Weights (comma separated)", |
|
placeholder="Example: 0.8, 1.2, 1.0, ...", |
|
info="Leave empty for equal weights" |
|
) |
|
|
|
|
|
with gr.Column(scale=2, min_width=800): |
|
with gr.Tabs(): |
|
with gr.Tab("🎧 Result Preview"): |
|
ensemble_output_audio = gr.Audio( |
|
label="Ensembled Output", |
|
interactive=False, |
|
show_download_button=True, |
|
elem_id="output-audio" |
|
) |
|
|
|
with gr.Tab("📋 Processing Log"): |
|
ensemble_status = gr.Textbox( |
|
label="Processing Details", |
|
interactive=False, |
|
elem_id="log-box" |
|
) |
|
|
|
with gr.Row(): |
|
ensemble_process_btn = gr.Button( |
|
"⚡ Process Ensemble", |
|
variant="primary", |
|
size="sm", |
|
elem_id="process-btn" |
|
) |
|
|
|
gr.HTML(""" |
|
<div class="footer"> |
|
Presented by Gecekondu Production |
|
</div> |
|
""") |
|
|
|
def update_models(category): |
|
return gr.Dropdown(choices=list(MODEL_CONFIGS[category].keys())) |
|
|
|
def add_models(new_models, existing_models): |
|
updated = list(set(existing_models + new_models)) |
|
return gr.Dropdown(choices=updated, value=updated) |
|
|
|
def clear_models(): |
|
return gr.Dropdown(choices=[], value=[]) |
|
|
|
|
|
model_category.change(fn=update_model_dropdown, inputs=model_category, outputs=model_dropdown) |
|
clear_old_output_btn.click(fn=clear_old_output, outputs=clear_old_output_status) |
|
|
|
input_audio_file.upload( |
|
fn=lambda x, y: handle_file_upload(x, y, is_auto_ensemble=False), |
|
inputs=[input_audio_file, file_path_input], |
|
outputs=[input_audio_file, original_audio] |
|
) |
|
file_path_input.change( |
|
fn=lambda x, y: handle_file_upload(x, y, is_auto_ensemble=False), |
|
inputs=[input_audio_file, file_path_input], |
|
outputs=[input_audio_file, original_audio] |
|
) |
|
|
|
auto_input_audio_file.upload( |
|
fn=lambda x, y: handle_file_upload(x, y, is_auto_ensemble=True), |
|
inputs=[auto_input_audio_file, auto_file_path_input], |
|
outputs=[auto_input_audio_file, original_audio2] |
|
) |
|
auto_file_path_input.change( |
|
fn=lambda x, y: handle_file_upload(x, y, is_auto_ensemble=True), |
|
inputs=[auto_input_audio_file, auto_file_path_input], |
|
outputs=[auto_input_audio_file, original_audio2] |
|
) |
|
|
|
auto_category_dropdown.change(fn=update_models, inputs=auto_category_dropdown, outputs=auto_model_dropdown) |
|
add_btn.click(fn=add_models, inputs=[auto_model_dropdown, selected_models], outputs=selected_models) |
|
clear_btn.click(fn=clear_models, inputs=[], outputs=selected_models) |
|
|
|
process_btn.click( |
|
fn=process_audio, |
|
inputs=[ |
|
input_audio_file, model_dropdown, chunk_size, overlap, export_format, |
|
use_tta, use_demud_phaseremix_inst, extract_instrumental, gr.State(None), gr.State(None) |
|
], |
|
outputs=[ |
|
vocals_audio, instrumental_audio, phaseremix_audio, drum_audio, karaoke_audio, |
|
bass_audio, other_audio, effects_audio, speech_audio, bleed_audio, music_audio, |
|
dry_audio, male_audio, female_audio |
|
] |
|
) |
|
|
|
auto_process_btn.click( |
|
fn=auto_ensemble_process, |
|
inputs=[ |
|
auto_input_audio_file, selected_models, auto_chunk_size, auto_overlap, export_format2, |
|
auto_use_tta, auto_extract_instrumental, auto_ensemble_type, gr.State(None) |
|
], |
|
outputs=[auto_output_audio, auto_status] |
|
) |
|
|
|
drive_download_btn.click( |
|
fn=download_callback, |
|
inputs=[drive_url_input, gr.State('drive')], |
|
outputs=[drive_download_output, drive_download_status, input_audio_file, auto_input_audio_file, original_audio, original_audio2] |
|
) |
|
|
|
direct_download_btn.click( |
|
fn=download_callback, |
|
inputs=[direct_url_input, gr.State('direct'), cookie_file], |
|
outputs=[direct_download_output, direct_download_status, input_audio_file, auto_input_audio_file, original_audio, original_audio2] |
|
) |
|
|
|
refresh_btn.click(fn=update_file_list, outputs=file_dropdown) |
|
ensemble_process_btn.click(fn=ensemble_audio_fn, inputs=[file_dropdown, ensemble_type, weights_input], outputs=[ensemble_output_audio, ensemble_status]) |
|
|
|
return demo |
|
|