music / app.py
Hjgugugjhuhjggg's picture
Update app.py
c76eb51 verified
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()