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()
|