Uhhy's picture
Update app.py
6f03b74 verified
raw
history blame
3.31 kB
import spaces
import gradio as gr
import torchaudio
from audiocraft.models import MusicGen
from audiocraft.data.audio import audio_write
import logging
import os
import uuid
from torch.cuda.amp import autocast
import torch
# Configura el logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# Cargar el modelo globalmente solo una vez
logging.info("Iniciando y cargando el modelo preentrenado.")
model = None
def cargar_modelo():
global model
if model is None:
logging.info("Cargando MusicGen por primera vez.")
model = MusicGen.get_pretrained('nateraw/musicgen-songstarter-v0.2')
logging.info("Modelo cargado exitosamente.")
else:
logging.info("El modelo ya ha sido cargado anteriormente, reutilizando.")
# Llamar a la función para cargar el modelo inmediatamente al inicio del script
cargar_modelo()
@spaces.GPU(duration=0)
def generar_musica(descripcion, melodia_audio, duracion):
# Limpiar la caché de la GPU antes de generar
torch.cuda.empty_cache()
torch.cuda.synchronize()
with autocast():
logging.info("Iniciando la generación de música.")
model.set_generation_params(duration=duracion)
if descripcion:
descripcion = [descripcion]
if melodia_audio:
logging.info(f"Cargando la melodía de audio desde: {melodia_audio}")
melodia, sr = torchaudio.load(melodia_audio)
logging.info("Generando música con descripción y melodía.")
wav = model.generate_with_chroma(descripcion, melodia[None], sr)
else:
logging.info("Generando música solo con descripción.")
wav = model.generate(descripcion)
else:
logging.info("Generando música de manera incondicional.")
wav = model.generate_unconditional(1)
filename = f'{str(uuid.uuid4())}.wav'
logging.info(f"Guardando la música generada con el nombre: {filename}")
path = audio_write(filename, wav[0].cpu().to(torch.float32), model.sample_rate, strategy="loudness", loudness_compressor=True)
print("Música guardada en", path, ".")
# Verifica la forma del tensor de audio generado y si fue guardado correctamente
logging.info(f"La forma del tensor de audio generado: {wav[0].shape}")
logging.info("Música generada y guardada con éxito.")
if not os.path.exists(path):
raise ValueError(f'No se pudo guardar el audio en {path}')
return path
# Definir la interfaz Gradio
descripcion = gr.Textbox(label="Descripción", placeholder="acústico, guitarra, melodía, trap, re menor, 90 bpm")
melodia_audio = gr.Audio(label="Melodía de audio (opcional)", type="filepath")
duracion = gr.Slider(label="Duración (segundos)", minimum=10, maximum=600, step=10, value=30) # Máximo 10 minutos (600 segundos)
output_path = gr.Audio(label="Música generada", type="filepath")
# Iniciar la aplicación en el puerto 7860
gr.Interface(
fn=generar_musica,
inputs=[descripcion, melodia_audio, duracion],
outputs=output_path,
title="Generador de Música",
description="Genera música utilizando el modelo MusicGen.",
).launch(server_port=7860)