Spaces:
Running
Running
| import os | |
| import sys | |
| import subprocess | |
| import uuid | |
| from pathlib import Path | |
| import shutil | |
| sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) | |
| def run_setup_script(): | |
| setup_script = os.path.join(os.path.dirname(__file__), "setup_scripts.py") | |
| try: | |
| result = subprocess.run(["python", setup_script], capture_output=True, text=True, check=True) | |
| return result.stdout | |
| except subprocess.CalledProcessError as e: | |
| print(f"Setup script failed with error: {e.stderr}") | |
| return f"Setup script failed: {e.stderr}" | |
| def get_files_in_ckpts(extensions, include_subdirs=False): | |
| """List files in ckpts directory with specified extensions, optionally including subdirectories.""" | |
| ################3 | |
| print("os.getcwd()", os.getcwd()) | |
| ckpts_dir = "ckpts" | |
| print(f"Current dir: {os.getcwd()}") | |
| if not os.path.exists(ckpts_dir): | |
| print(f"No {ckpts_dir} folder") | |
| return | |
| for root, _, files in os.walk(ckpts_dir): | |
| for file in files: | |
| print(os.path.join(root, file)) | |
| ############# | |
| ckpts_dir = Path("ckpts") | |
| if not ckpts_dir.exists(): | |
| return ["No files found"] | |
| files = [] | |
| for ext in extensions: | |
| if include_subdirs: | |
| files.extend([str(f) for f in ckpts_dir.glob(f"**/*{ext}")]) | |
| else: | |
| files.extend([str(f) for f in ckpts_dir.glob(f"*{ext}")]) | |
| return files if files else ["No files found"] | |
| def handle_file_upload(file_obj, allowed_extensions): | |
| """Copy uploaded file to a permanent location and validate extension.""" | |
| if not file_obj: | |
| return None, "No file uploaded." | |
| try: | |
| file_ext = os.path.splitext(file_obj.name)[1].lower() | |
| if file_ext not in allowed_extensions: | |
| return None, f"Invalid file extension. Allowed: {', '.join(allowed_extensions)}" | |
| upload_dir = Path("uploads") | |
| upload_dir.mkdir(exist_ok=True) | |
| file_name = f"upload_{str(uuid.uuid4())[:8]}{file_ext}" | |
| dest_path = upload_dir / file_name | |
| shutil.copyfile(file_obj.name, dest_path) | |
| return str(dest_path), None | |
| except Exception as e: | |
| return None, f"File upload error: {str(e)}" | |
| def run_tts_inference(ref_audio, ref_text, gen_text, speed, use_upload, model_cfg, ckpt_file, vocab_file): | |
| """Run F5-TTS inference with selected or uploaded model files.""" | |
| if use_upload: | |
| model_cfg_path, model_cfg_error = handle_file_upload(model_cfg, [".yaml"]) | |
| ckpt_file_path, ckpt_file_error = handle_file_upload(ckpt_file, [".pt", ".safetensors"]) | |
| vocab_file_path, vocab_file_error = handle_file_upload(vocab_file, [".txt", ".safetensors"]) | |
| if model_cfg_error or ckpt_file_error or vocab_file_error: | |
| return None, model_cfg_error or ckpt_file_error or vocab_file_error | |
| if not (model_cfg_path and ckpt_file_path and vocab_file_path): | |
| return None, "Please upload all model files (model_cfg, ckpt_file, vocab_file)." | |
| config = {"model_cfg": model_cfg_path, "ckpt_file": ckpt_file_path, "vocab_file": vocab_file_path} | |
| else: | |
| if any(f == "No files found" for f in [model_cfg, ckpt_file, vocab_file]): | |
| return None, "No valid model files found in ckpts. Upload custom files or add files to ckpts." | |
| config = {"model_cfg": model_cfg, "ckpt_file": ckpt_file, "vocab_file": vocab_file} | |
| if not ref_audio: | |
| return None, "Reference audio is required." | |
| output_dir = "apps/gradio_app/temp_data" | |
| os.makedirs(output_dir, exist_ok=True) | |
| output_file = f"infer_audio_{str(uuid.uuid4())[:8]}.mp3" | |
| output_path = os.path.join(output_dir, output_file) | |
| try: | |
| command = [ | |
| "python", "src/f5_tts/infer/infer_cli.py", | |
| "--model_cfg", config["model_cfg"], | |
| "--ckpt_file", config["ckpt_file"], | |
| "--vocab_file", config["vocab_file"], | |
| "--ref_audio", ref_audio, | |
| "--ref_text", ref_text, | |
| "--gen_text", gen_text, | |
| "--speed", str(speed), | |
| "--output_dir", output_dir, | |
| "--output_file", output_file | |
| ] | |
| result = subprocess.run(command, capture_output=True, text=True) | |
| if result.returncode != 0: | |
| return None, f"Inference error: {result.stderr}" | |
| if not os.path.exists(output_path): | |
| return None, f"Output audio not found at {output_path}" | |
| return output_path, "Audio generated successfully!" | |
| except Exception as e: | |
| return None, f"Inference error: {str(e)}" |