File size: 3,258 Bytes
8add5a6
d59877f
 
 
 
 
79bbaad
 
c76eb51
79bbaad
d59877f
c76eb51
d59877f
 
c76eb51
 
79bbaad
d59877f
3f2ba73
c76eb51
d59877f
c76eb51
 
d59877f
 
80bc806
 
3f2ba73
c76eb51
 
d59877f
 
c76eb51
 
 
 
 
d59877f
c76eb51
 
 
d59877f
c76eb51
d59877f
 
c76eb51
d59877f
3f2ba73
 
 
d59877f
c76eb51
d59877f
c76eb51
 
3f2ba73
 
 
 
 
c76eb51
d59877f
 
 
 
c76eb51
d59877f
 
 
 
c76eb51
6cff445
d59877f
 
 
 
 
 
c76eb51
3f2ba73
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import torch
import gradio as gr
from transformers import AutoProcessor, MusicgenForConditionalGeneration
from TTS.api import TTS
import librosa
import numpy as np
import os

# Establecer variable de entorno para Coqui TTS
os.environ["COQUI_TOS_AGREED"] = "1"

# Cargar el procesador y el modelo de MusicGen
processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
model_musicgen = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")

# Cargar el modelo de TTS
model_tts = TTS(model_name="tts_models/multilingual/multi-dataset/xtts_v2", progress_bar=False).to("cpu")

def generate_music(text_prompt, audio_file=None, tts_text=None):
    # Procesar la descripción de la música
    inputs = processor(text=text_prompt, padding=True, return_tensors="pt")
    
    # Parámetros de duración máxima y mínima para la música generada
    max_duration_sec = 600
    min_duration_sec = 30
    max_new_tokens = int(max_duration_sec * model_musicgen.config.min_length)
    min_new_tokens = int(min_duration_sec * model_musicgen.config.min_length)
    
    # Generar música
    audio_values = model_musicgen.generate(**inputs)
    music = audio_values.cpu().numpy()[0]

    # Si se proporciona un archivo de audio y texto para clonar la voz
    if audio_file and tts_text:
        try:
            # Generar la voz clonada usando TTS
            cloned_audio = model_tts.tts_with_vc(tts_text, speaker_wav=audio_file, language="es")

            # Asegurarse de que la tasa de muestreo sea la correcta (44.1kHz)
            if model_tts.synthesizer.output_sample_rate != 44100:
                cloned_audio, _ = librosa.resample(cloned_audio, model_tts.synthesizer.output_sample_rate, 44100)

            # Convertir música generada en un array de floats
            music_np = librosa.util.buf_to_float(music, n_bytes=2)

            # Ajustar las longitudes de los arrays (rellenar el más corto)
            if len(music_np) > len(cloned_audio):
                cloned_audio = np.pad(cloned_audio, (0, len(music_np) - len(cloned_audio)))
            else:
                music_np = np.pad(music_np, (0, len(cloned_audio) - len(music_np)))

            # Combinar la música y el audio clonado
            combined_audio = music_np + cloned_audio

            # Normalizar y convertir a formato int16
            combined_audio = combined_audio / np.max(np.abs(combined_audio))
            combined_audio_int16 = (combined_audio * 32767).astype(np.int16)

            return (44100, combined_audio_int16)
        except Exception as e:
            print(f"Error combinando audio: {e}")
            return (44100, music)

    return (44100, music)

# Crear la interfaz Gradio
iface = gr.Interface(
    fn=generate_music,
    inputs=[
        gr.Textbox(label="Descripción de la música"),
        gr.Audio(type="filepath", label="Subir audio de voz (Opcional)"),
        gr.Textbox(label="Texto para clonar la voz (Opcional)"),
    ],
    outputs=gr.Audio(label="Música generada", type="numpy"),
    title="Generador de Música con MusicGen y XTTS",
    description="Introduce una descripción de la música que deseas generar y opcionalmente un audio de voz para clonar con texto.",
)

# Lanzar la interfaz
iface.launch()