CloneMe / app.py
Jonatas2026's picture
Update app.py
153d0c4 verified
Raw
History Blame Contribute Delete
3.49 kB
import os
import subprocess
import sys
# ==========================================
# 1. PREPARAÇÃO DO AMBIENTE
# ==========================================
os.environ["COQUI_TOS_AGREED"] = "1"
os.environ["TORCH_LOAD_WEIGHTS_ONLY"] = "0"
def install_packages():
print("Verificando/Instalando pacotes necessários...")
pacotes = [
"gradio>=4.0.0",
"librosa",
"soundfile",
"TTS==0.22.0",
"transformers==4.36.2",
"spaces"
]
subprocess.check_call([sys.executable, "-m", "pip", "install"] + pacotes)
print("Dependências instaladas com sucesso!")
try:
import librosa
import TTS
import spaces
except ImportError:
install_packages()
# ==========================================
# 2. IMPORTS PRINCIPAIS
# ==========================================
import gradio as gr
import librosa
import numpy as np
import torch
import spaces
from TTS.api import TTS
# ==========================================
# 3. PATCH DO PYTORCH
# ==========================================
_original_load = torch.load
def _patched_load(*args, **kwargs):
kwargs["weights_only"] = False
return _original_load(*args, **kwargs)
torch.load = _patched_load
tts_model = None
# ==========================================
# 4. LÓGICA DO PROCESSAMENTO (COM ZEROGPU)
# ==========================================
# O Hugging Face EXIGE este decorador para liberar a placa de vídeo
@spaces.GPU
def processar_cyr(caminho_referencia, caminho_alvo):
global tts_model
if caminho_referencia is None or caminho_alvo is None:
return "Erro: Envie ambos os arquivos de áudio antes de prosseguir."
try:
# Carrega o modelo apenas quando a GPU for alocada para esta função
if tts_model is None:
print("Iniciando motor TTS na GPU...")
# Força o uso da GPU já que o decorador garantiu o acesso
tts_model = TTS("tts_models/multilingual/multi-dataset/xtts_v2", gpu=True)
print("Motor carregado!")
audio_ref, sr_ref = librosa.load(caminho_referencia, sr=None)
duracao_ref = librosa.get_duration(y=audio_ref, sr=sr_ref)
audio_alvo, sr_alvo = librosa.load(caminho_alvo, sr=None)
duracao_alvo = librosa.get_duration(y=audio_alvo, sr=sr_alvo)
resultado = (f"Áudio de Referência processado: Duração de {duracao_ref:.2f} segundos (Taxa: {sr_ref}Hz)\n"
f"Áudio Alvo processado: Duração de {duracao_alvo:.2f} segundos (Taxa: {sr_alvo}Hz)\n"
"Análise básica concluída com sucesso! (Motor XTTS ativo na memória da GPU)")
except Exception as e:
resultado = f"Ocorreu um erro ao processar os áudios: {str(e)}"
return resultado
# ==========================================
# 5. INTERFACE VISUAL
# ==========================================
with gr.Blocks(title="CloneMe") as demo:
gr.Markdown("# CloneMe")
with gr.Row():
ref_input = gr.Audio(label="Upload da Referência", type="filepath")
alvo_input = gr.Audio(label="Upload do Alvo", type="filepath")
btn_next = gr.Button("Next Step")
output = gr.Textbox(label="Status do Processamento", lines=4)
btn_next.click(
fn=processar_cyr,
inputs=[ref_input, alvo_input],
outputs=output
)
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860)