Update tabs/voice_blender/voice_blender.py
Browse files
tabs/voice_blender/voice_blender.py
CHANGED
|
@@ -1,40 +1,62 @@
|
|
| 1 |
-
import os
|
| 2 |
import gradio as gr
|
| 3 |
import shutil
|
|
|
|
|
|
|
|
|
|
| 4 |
import requests
|
| 5 |
-
|
| 6 |
-
from tempfile import TemporaryDirectory
|
| 7 |
|
| 8 |
-
|
| 9 |
-
sys.path.append(now_dir)
|
| 10 |
|
| 11 |
-
|
| 12 |
-
|
| 13 |
|
| 14 |
-
i18n = I18nAuto()
|
| 15 |
|
| 16 |
-
def
|
| 17 |
-
|
| 18 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
|
| 24 |
-
with ZipFile(zip_path, 'r') as zip_ref:
|
| 25 |
-
zip_ref.extractall(temp_dir.name)
|
| 26 |
-
|
| 27 |
-
pth_files = [os.path.join(temp_dir.name, f) for f in os.listdir(temp_dir.name) if f.endswith('.pth')]
|
| 28 |
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
|
| 34 |
-
def download_and_set_paths(link_a, link_b):
|
| 35 |
-
path_a = download_and_extract_model(link_a)
|
| 36 |
-
path_b = download_and_extract_model(link_b)
|
| 37 |
-
return path_a, path_b
|
| 38 |
|
| 39 |
def voice_blender_tab():
|
| 40 |
gr.Markdown(i18n("## Voice Blender"))
|
|
@@ -52,33 +74,15 @@ def voice_blender_tab():
|
|
| 52 |
interactive=True,
|
| 53 |
placeholder=i18n("Enter model name"),
|
| 54 |
)
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
label=i18n("Path to Model A"),
|
| 65 |
-
value="",
|
| 66 |
-
interactive=False,
|
| 67 |
-
placeholder=i18n("Path will be set automatically after download"),
|
| 68 |
-
)
|
| 69 |
-
with gr.Column():
|
| 70 |
-
model_fusion_b_link = gr.Textbox(
|
| 71 |
-
label=i18n("Hugging Face Link for Model B"),
|
| 72 |
-
value="",
|
| 73 |
-
interactive=True,
|
| 74 |
-
placeholder=i18n("Enter Hugging Face link for model B"),
|
| 75 |
-
)
|
| 76 |
-
model_fusion_b_path = gr.Textbox(
|
| 77 |
-
label=i18n("Path to Model B"),
|
| 78 |
-
value="",
|
| 79 |
-
interactive=False,
|
| 80 |
-
placeholder=i18n("Path will be set automatically after download"),
|
| 81 |
-
)
|
| 82 |
alpha_a = gr.Slider(
|
| 83 |
minimum=0,
|
| 84 |
maximum=1,
|
|
@@ -89,30 +93,43 @@ def voice_blender_tab():
|
|
| 89 |
"Adjusting the position more towards one side or the other will make the model more similar to the first or second."
|
| 90 |
),
|
| 91 |
)
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
)
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
|
| 105 |
-
|
| 106 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 107 |
)
|
| 108 |
|
| 109 |
-
|
| 110 |
-
fn=
|
| 111 |
-
inputs=[
|
| 112 |
-
model_fusion_name,
|
| 113 |
-
model_fusion_a_path,
|
| 114 |
-
model_fusion_b_path,
|
| 115 |
-
alpha_a,
|
| 116 |
-
],
|
| 117 |
outputs=[model_fusion_output_info, model_fusion_pth_output],
|
| 118 |
)
|
|
|
|
| 1 |
+
import os
|
| 2 |
import gradio as gr
|
| 3 |
import shutil
|
| 4 |
+
import tempfile
|
| 5 |
+
from core import run_model_blender_script
|
| 6 |
+
from assets.i18n.i18n import I18nAuto
|
| 7 |
import requests
|
| 8 |
+
import zipfile
|
|
|
|
| 9 |
|
| 10 |
+
i18n = I18nAuto()
|
|
|
|
| 11 |
|
| 12 |
+
# Global variables to store the downloaded model paths
|
| 13 |
+
model_paths = {"model_a": None, "model_b": None}
|
| 14 |
|
|
|
|
| 15 |
|
| 16 |
+
def download_and_extract(url, extract_to):
|
| 17 |
+
try:
|
| 18 |
+
with requests.get(url, stream=True) as r:
|
| 19 |
+
r.raise_for_status()
|
| 20 |
+
with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
|
| 21 |
+
tmp_file.write(r.content)
|
| 22 |
+
|
| 23 |
+
with zipfile.ZipFile(tmp_file.name, 'r') as zip_ref:
|
| 24 |
+
zip_ref.extractall(extract_to)
|
| 25 |
|
| 26 |
+
pth_files = [os.path.join(extract_to, f) for f in os.listdir(extract_to) if f.endswith('.pth')]
|
| 27 |
+
if len(pth_files) == 0:
|
| 28 |
+
raise FileNotFoundError(f"No .pth files found in {extract_to}")
|
| 29 |
+
|
| 30 |
+
return pth_files[0] # Assuming there's one .pth file per model
|
| 31 |
+
except Exception as e:
|
| 32 |
+
raise RuntimeError(f"Failed to download or extract model from {url}. Error: {str(e)}")
|
| 33 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 34 |
|
| 35 |
+
def download_models(model_url_1, model_url_2):
|
| 36 |
+
try:
|
| 37 |
+
# Create temporary directories for model extraction
|
| 38 |
+
temp_dir_1 = tempfile.mkdtemp()
|
| 39 |
+
temp_dir_2 = tempfile.mkdtemp()
|
| 40 |
+
|
| 41 |
+
# Download and extract models
|
| 42 |
+
model_paths["model_a"] = download_and_extract(model_url_1, temp_dir_1)
|
| 43 |
+
model_paths["model_b"] = download_and_extract(model_url_2, temp_dir_2)
|
| 44 |
+
|
| 45 |
+
return "Models downloaded successfully!", model_paths["model_a"], model_paths["model_b"]
|
| 46 |
+
except Exception as e:
|
| 47 |
+
return f"An error occurred during download: {str(e)}", None, None
|
| 48 |
+
|
| 49 |
+
|
| 50 |
+
def blend_models(model_name, alpha_a):
|
| 51 |
+
try:
|
| 52 |
+
if not model_paths["model_a"] or not model_paths["model_b"]:
|
| 53 |
+
raise FileNotFoundError("Models not found. Please download the models first.")
|
| 54 |
+
|
| 55 |
+
message, model_blended = run_model_blender_script(model_name, model_paths["model_a"], model_paths["model_b"], alpha_a)
|
| 56 |
+
return message, model_blended
|
| 57 |
+
except Exception as e:
|
| 58 |
+
return f"An error occurred blending the models: {str(e)}", None
|
| 59 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 60 |
|
| 61 |
def voice_blender_tab():
|
| 62 |
gr.Markdown(i18n("## Voice Blender"))
|
|
|
|
| 74 |
interactive=True,
|
| 75 |
placeholder=i18n("Enter model name"),
|
| 76 |
)
|
| 77 |
+
model_fusion_a_url = gr.Textbox(
|
| 78 |
+
label=i18n("Model A URL"),
|
| 79 |
+
placeholder=i18n("Enter Hugging Face URL for Model A"),
|
| 80 |
+
)
|
| 81 |
+
model_fusion_b_url = gr.Textbox(
|
| 82 |
+
label=i18n("Model B URL"),
|
| 83 |
+
placeholder=i18n("Enter Hugging Face URL for Model B"),
|
| 84 |
+
)
|
| 85 |
+
download_button = gr.Button(i18n("Download Models"), variant="primary")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 86 |
alpha_a = gr.Slider(
|
| 87 |
minimum=0,
|
| 88 |
maximum=1,
|
|
|
|
| 93 |
"Adjusting the position more towards one side or the other will make the model more similar to the first or second."
|
| 94 |
),
|
| 95 |
)
|
| 96 |
+
blend_button = gr.Button(i18n("Blend Models"), variant="primary")
|
| 97 |
+
|
| 98 |
+
# Outputs
|
| 99 |
+
download_info = gr.Textbox(
|
| 100 |
+
label=i18n("Download Information"),
|
| 101 |
+
value="",
|
| 102 |
+
interactive=False,
|
| 103 |
+
)
|
| 104 |
+
model_fusion_a_path = gr.Textbox(
|
| 105 |
+
label=i18n("Model A Path"),
|
| 106 |
+
value="",
|
| 107 |
+
interactive=False,
|
| 108 |
+
)
|
| 109 |
+
model_fusion_b_path = gr.Textbox(
|
| 110 |
+
label=i18n("Model B Path"),
|
| 111 |
+
value="",
|
| 112 |
+
interactive=False,
|
| 113 |
+
)
|
| 114 |
+
model_fusion_output_info = gr.Textbox(
|
| 115 |
+
label=i18n("Output Information"),
|
| 116 |
+
value="",
|
| 117 |
+
interactive=False,
|
| 118 |
+
)
|
| 119 |
+
model_fusion_pth_output = gr.File(
|
| 120 |
+
label=i18n("Download Blended Model"),
|
| 121 |
+
type="filepath",
|
| 122 |
+
interactive=False,
|
| 123 |
+
)
|
| 124 |
+
|
| 125 |
+
download_button.click(
|
| 126 |
+
fn=download_models,
|
| 127 |
+
inputs=[model_fusion_a_url, model_fusion_b_url],
|
| 128 |
+
outputs=[download_info, model_fusion_a_path, model_fusion_b_path],
|
| 129 |
)
|
| 130 |
|
| 131 |
+
blend_button.click(
|
| 132 |
+
fn=blend_models,
|
| 133 |
+
inputs=[model_fusion_name, alpha_a],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 134 |
outputs=[model_fusion_output_info, model_fusion_pth_output],
|
| 135 |
)
|