Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,17 +1,51 @@
|
|
1 |
import gradio as gr
|
2 |
from transformers import pipeline
|
3 |
import os
|
4 |
-
from
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
#
|
12 |
-
|
13 |
-
|
14 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
dialogador = pipeline("text-generation", model="microsoft/DialoGPT-small")
|
16 |
|
17 |
def transformar_texto(archivo):
|
@@ -19,77 +53,61 @@ def transformar_texto(archivo):
|
|
19 |
raise gr.Error("Por favor, sube un archivo de texto.")
|
20 |
|
21 |
try:
|
22 |
-
# Lee el contenido del archivo subido
|
23 |
with open(archivo.name, 'r', encoding='utf-8') as f:
|
24 |
texto = f.read()
|
25 |
except Exception as e:
|
26 |
raise gr.Error(f"Error al leer el archivo: {e}")
|
27 |
|
28 |
-
|
29 |
-
max_palabras = 1000 # Puedes ajustar este número
|
30 |
num_palabras = len(texto.split())
|
31 |
if num_palabras > max_palabras:
|
32 |
-
raise gr.Error(f"El texto excede el límite de {max_palabras} palabras
|
33 |
|
34 |
try:
|
35 |
-
#
|
36 |
-
|
37 |
-
|
38 |
-
max_length=50,
|
39 |
-
min_length=25,
|
40 |
-
do_sample=False,
|
41 |
-
clean_up_tokenization_spaces=True
|
42 |
-
)[0]['summary_text']
|
43 |
-
except Exception as e:
|
44 |
-
raise gr.Error(f"Error al resumir el texto: {e}")
|
45 |
|
46 |
-
|
47 |
-
|
48 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
49 |
conversacion = dialogador(
|
50 |
prompt,
|
51 |
-
max_length=
|
52 |
num_return_sequences=1,
|
53 |
clean_up_tokenization_spaces=True
|
54 |
)[0]['generated_text']
|
55 |
except Exception as e:
|
56 |
raise gr.Error(f"Error al generar la conversación: {e}")
|
57 |
|
58 |
-
#
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
except Exception as e:
|
63 |
-
raise gr.Error(f"Error al convertir texto a audio: {e}")
|
64 |
|
65 |
-
return
|
66 |
|
67 |
-
#
|
68 |
interfaz = gr.Interface(
|
69 |
fn=transformar_texto,
|
70 |
inputs=gr.File(label="Sube tu documento de texto (.txt)"),
|
71 |
outputs=gr.Audio(type="filepath", label="Escucha la conversación generada"),
|
72 |
title="📝➡️🎙️ Transformador de Texto a Conversación",
|
73 |
-
description=""
|
74 |
-
Sube un documento de texto y conviértelo en una conversación tipo podcast entre dos personas.
|
75 |
-
|
76 |
-
**Versión Gratuita:**
|
77 |
-
- Límite de 1000 palabras por texto.
|
78 |
-
- Conversación básica entre dos personas.
|
79 |
-
|
80 |
-
**Próximamente:**
|
81 |
-
- Versiones premium sin límites.
|
82 |
-
- Personalización de voces y estilos.
|
83 |
-
- Descarga en formato de audio.
|
84 |
-
|
85 |
-
¡Mantente atento para más actualizaciones!
|
86 |
-
""", # Asegúrate de que las comillas triples cierran aquí
|
87 |
theme="default",
|
88 |
allow_flagging="never"
|
89 |
)
|
90 |
|
91 |
interfaz.launch()
|
92 |
|
93 |
-
|
94 |
|
95 |
|
|
|
1 |
import gradio as gr
|
2 |
from transformers import pipeline
|
3 |
import os
|
4 |
+
from TTS.api import TTS
|
5 |
+
from pydub import AudioSegment
|
6 |
+
|
7 |
+
# Inicializar los modelos de Coqui TTS para dos voces
|
8 |
+
tts_juan = TTS(model_name="tts_models/es/mai/tacotron2-DDC", progress_bar=False, gpu=False)
|
9 |
+
tts_maria = TTS(model_name="tts_models/es/css10/vits", progress_bar=False, gpu=False)
|
10 |
+
|
11 |
+
# Función para convertir texto a audio con voces diferentes
|
12 |
+
def convertir_texto_a_audio(texto, nombre_archivo, voz):
|
13 |
+
if voz == "Juan":
|
14 |
+
tts_juan.tts_to_file(text=texto, file_path=nombre_archivo)
|
15 |
+
elif voz == "María":
|
16 |
+
tts_maria.tts_to_file(text=texto, file_path=nombre_archivo)
|
17 |
+
else:
|
18 |
+
# Voz predeterminada
|
19 |
+
tts_juan.tts_to_file(text=texto, file_path=nombre_archivo)
|
20 |
+
|
21 |
+
def procesar_conversacion(conversacion):
|
22 |
+
lineas = conversacion.strip().split('\n')
|
23 |
+
dialogos = []
|
24 |
+
for linea in lineas:
|
25 |
+
if linea.startswith("Juan:"):
|
26 |
+
dialogos.append(("Juan", linea.replace("Juan:", "").strip()))
|
27 |
+
elif linea.startswith("María:"):
|
28 |
+
dialogos.append(("María", linea.replace("María:", "").strip()))
|
29 |
+
return dialogos
|
30 |
+
|
31 |
+
def generar_audio_conversacion(dialogos):
|
32 |
+
audios = []
|
33 |
+
for idx, (persona, texto) in enumerate(dialogos):
|
34 |
+
ruta_audio = os.path.join("/tmp", f"dialogo_{idx}.wav")
|
35 |
+
convertir_texto_a_audio(texto, ruta_audio, persona)
|
36 |
+
audios.append(ruta_audio)
|
37 |
+
return audios
|
38 |
+
|
39 |
+
def combinar_audios(rutas_audios):
|
40 |
+
conversacion_audio = AudioSegment.empty()
|
41 |
+
for ruta in rutas_audios:
|
42 |
+
audio = AudioSegment.from_file(ruta)
|
43 |
+
conversacion_audio += audio
|
44 |
+
ruta_final = os.path.join("/tmp", "conversacion_final.wav")
|
45 |
+
conversacion_audio.export(ruta_final, format="wav")
|
46 |
+
return ruta_final
|
47 |
+
|
48 |
+
# Creamos el modelo de generación de diálogo
|
49 |
dialogador = pipeline("text-generation", model="microsoft/DialoGPT-small")
|
50 |
|
51 |
def transformar_texto(archivo):
|
|
|
53 |
raise gr.Error("Por favor, sube un archivo de texto.")
|
54 |
|
55 |
try:
|
|
|
56 |
with open(archivo.name, 'r', encoding='utf-8') as f:
|
57 |
texto = f.read()
|
58 |
except Exception as e:
|
59 |
raise gr.Error(f"Error al leer el archivo: {e}")
|
60 |
|
61 |
+
max_palabras = 1000
|
|
|
62 |
num_palabras = len(texto.split())
|
63 |
if num_palabras > max_palabras:
|
64 |
+
raise gr.Error(f"El texto excede el límite de {max_palabras} palabras.")
|
65 |
|
66 |
try:
|
67 |
+
# Generamos la conversación utilizando el texto completo
|
68 |
+
prompt = f"""
|
69 |
+
Crear una conversación entre dos personas, Juan y María, donde Juan hace preguntas sobre el siguiente texto y María responde:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
70 |
|
71 |
+
{texto}
|
72 |
+
|
73 |
+
La conversación debe estar en el siguiente formato:
|
74 |
+
|
75 |
+
Juan: [pregunta]
|
76 |
+
María: [respuesta]
|
77 |
+
Juan: [pregunta]
|
78 |
+
María: [respuesta]
|
79 |
+
...
|
80 |
+
|
81 |
+
La conversación debe ser educativa y cubrir los puntos principales del texto.
|
82 |
+
"""
|
83 |
conversacion = dialogador(
|
84 |
prompt,
|
85 |
+
max_length=2000,
|
86 |
num_return_sequences=1,
|
87 |
clean_up_tokenization_spaces=True
|
88 |
)[0]['generated_text']
|
89 |
except Exception as e:
|
90 |
raise gr.Error(f"Error al generar la conversación: {e}")
|
91 |
|
92 |
+
# Procesamos la conversación y generamos los audios
|
93 |
+
dialogos = procesar_conversacion(conversacion)
|
94 |
+
rutas_audios = generar_audio_conversacion(dialogos)
|
95 |
+
ruta_audio_final = combinar_audios(rutas_audios)
|
|
|
|
|
96 |
|
97 |
+
return ruta_audio_final
|
98 |
|
99 |
+
# Crear la interfaz de usuario
|
100 |
interfaz = gr.Interface(
|
101 |
fn=transformar_texto,
|
102 |
inputs=gr.File(label="Sube tu documento de texto (.txt)"),
|
103 |
outputs=gr.Audio(type="filepath", label="Escucha la conversación generada"),
|
104 |
title="📝➡️🎙️ Transformador de Texto a Conversación",
|
105 |
+
description="Sube un documento de texto y conviértelo en una conversación educativa entre dos personas.",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
106 |
theme="default",
|
107 |
allow_flagging="never"
|
108 |
)
|
109 |
|
110 |
interfaz.launch()
|
111 |
|
|
|
112 |
|
113 |
|