Spaces:
Running on Zero
Running on Zero
| 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 | |
| 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) | |