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