Spaces:
Sleeping
Sleeping
import gradio as gr | |
from transformers import pipeline | |
import os | |
from TTS.api import TTS | |
from pydub import AudioSegment | |
# Inicializar los modelos de Coqui TTS para dos voces | |
tts_juan = TTS(model_name="tts_models/es/mai/tacotron2-DDC", progress_bar=False, gpu=False) | |
tts_maria = TTS(model_name="tts_models/es/css10/vits", progress_bar=False, gpu=False) | |
# Modelo de resumen compatible con español | |
resumidor = pipeline("summarization", model="mrm8488/bert-small2bert-small-finetuned-cnn_daily_mail-summarization") | |
# Función para convertir texto a audio con voces diferentes | |
def convertir_texto_a_audio(texto, nombre_archivo, voz): | |
if voz == "Juan": | |
tts_juan.tts_to_file(text=texto, file_path=nombre_archivo) | |
elif voz == "María": | |
tts_maria.tts_to_file(text=texto, file_path=nombre_archivo) | |
else: | |
# Voz predeterminada | |
tts_juan.tts_to_file(text=texto, file_path=nombre_archivo) | |
def procesar_conversacion(conversacion): | |
lineas = conversacion.strip().split('\n') | |
dialogos = [] | |
for linea in lineas: | |
if linea.startswith("Juan:"): | |
dialogos.append(("Juan", linea.replace("Juan:", "").strip())) | |
elif linea.startswith("María:"): | |
dialogos.append(("María", linea.replace("María:", "").strip())) | |
return dialogos | |
def generar_audio_conversacion(dialogos): | |
audios = [] | |
for idx, (persona, texto) in enumerate(dialogos): | |
ruta_audio = os.path.join("/tmp", f"dialogo_{idx}.wav") | |
convertir_texto_a_audio(texto, ruta_audio, persona) | |
audios.append(ruta_audio) | |
return audios | |
def combinar_audios(rutas_audios): | |
conversacion_audio = AudioSegment.empty() | |
for ruta in rutas_audios: | |
audio = AudioSegment.from_file(ruta) | |
conversacion_audio += audio | |
ruta_final = os.path.join("/tmp", "conversacion_final.wav") | |
conversacion_audio.export(ruta_final, format="wav") | |
return ruta_final | |
# Creamos el modelo de generación de diálogo | |
dialogador = pipeline("text-generation", model="microsoft/DialoGPT-small") | |
def transformar_texto(archivo): | |
if archivo is None: | |
raise gr.Error("Por favor, sube un archivo de texto.") | |
try: | |
with open(archivo.name, 'r', encoding='utf-8') as f: | |
texto = f.read() | |
except Exception as e: | |
raise gr.Error(f"Error al leer el archivo: {e}") | |
max_palabras = 2000 # Nuevo límite de palabras | |
num_palabras = len(texto.split()) | |
if num_palabras > max_palabras: | |
raise gr.Error(f"El texto excede el límite de {max_palabras} palabras.") | |
# Resumimos el texto para que el prompt no sea demasiado largo | |
try: | |
resumen = resumidor( | |
texto, | |
max_length=130, # Ajusta según las capacidades del modelo | |
min_length=30, | |
do_sample=False, | |
clean_up_tokenization_spaces=True | |
)[0]['summary_text'] | |
except Exception as e: | |
raise gr.Error(f"Error al resumir el texto: {e}") | |
try: | |
# Generamos la conversación utilizando el resumen | |
prompt = f""" | |
Crear una conversación educativa entre Juan y María sobre el siguiente tema: | |
{resumen} | |
La conversación debe tener el formato: | |
Juan: [pregunta] | |
María: [respuesta] | |
... | |
Por favor, asegúrate de que la conversación cubra los puntos principales del texto. | |
""" | |
output = dialogador( | |
prompt, | |
max_length=1024, # Aumentamos el límite de tokens generados | |
num_return_sequences=1, | |
clean_up_tokenization_spaces=True | |
) | |
if not output: | |
raise gr.Error("El modelo no generó ninguna salida. Por favor, intenta con un texto más corto o diferente.") | |
conversacion = output[0]['generated_text'] | |
except Exception as e: | |
raise gr.Error(f"Error al generar la conversación: {e}") | |
# Procesamos la conversación y generamos los audios | |
dialogos = procesar_conversacion(conversacion) | |
if not dialogos: | |
raise gr.Error("No se pudo procesar la conversación generada. Asegúrate de que el modelo está generando el formato correcto.") | |
rutas_audios = generar_audio_conversacion(dialogos) | |
ruta_audio_final = combinar_audios(rutas_audios) | |
return ruta_audio_final | |
# Crear la interfaz de usuario | |
interfaz = gr.Interface( | |
fn=transformar_texto, | |
inputs=gr.File(label="Sube tu documento de texto (.txt)"), | |
outputs=gr.Audio(type="filepath", label="Escucha la conversación generada"), | |
title="📝➡️🎙️ Transformador de Texto a Conversación", | |
description="Sube un documento de texto y conviértelo en una conversación educativa entre dos personas.", | |
theme="default", | |
allow_flagging="never" | |
) | |
interfaz.launch() | |