File size: 2,633 Bytes
ed0dbc1
d2d09cc
1381c8e
d2d09cc
8b4b52c
ed0dbc1
3853cf4
ed0dbc1
 
 
243993a
ed0dbc1
0c24b94
6f03b74
3853cf4
 
6f03b74
96808c3
eed21cc
9e2fa56
 
 
ed0dbc1
eed21cc
 
3853cf4
eed21cc
 
 
 
 
 
 
c9f6306
eed21cc
 
ed0dbc1
eed21cc
ed0dbc1
3853cf4
ed0dbc1
eed21cc
ed0dbc1
eed21cc
 
ed0dbc1
eed21cc
04736e7
ed0dbc1
3853cf4
eed21cc
 
3853cf4
eed21cc
8b4b52c
7ab6d17
eed21cc
 
7ab6d17
eed21cc
 
3853cf4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

logging.info("Iniciando y cargando el modelo preentrenado.")
model = MusicGen.get_pretrained('nateraw/musicgen-songstarter-v0.2')
logging.info("Modelo cargado exitosamente.")

@spaces.GPU(queue=False)
def generar_musica(descripcion, melodia_audio, duracion):
    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)
        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

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)
output_path = gr.Audio(label="Música generada", type="filepath")

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.",
).queue(concurrency_count=10).launch(server_port=7860, server_name="0.0.0.0")