Spaces:
Sleeping
Sleeping
File size: 4,724 Bytes
39e0760 2de692c 2b3b2a1 752ec84 254d283 2b3b2a1 2de692c 39e0760 2de692c 6c70207 2de692c 6c70207 2de692c 6c70207 d986ac0 254d283 39e0760 2b3b2a1 d986ac0 254d283 752ec84 254d283 d44f7c0 6c70207 254d283 2b3b2a1 d44f7c0 d986ac0 254d283 2b3b2a1 d44f7c0 2b3b2a1 d44f7c0 2b3b2a1 d44f7c0 6c70207 254d283 6c70207 d44f7c0 6c70207 d986ac0 2b3b2a1 d44f7c0 2b3b2a1 d986ac0 2b3b2a1 39e0760 2b3b2a1 39e0760 2de692c bc644af 2de692c 2b3b2a1 bc644af 752ec84 |
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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
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()
|