import argparse import subprocess import os import sys import random import string import gradio as gr import tempfile import re def filter_text(text): # Expresión regular para permitir solo letras de la A a la Z en mayúsculas y minúsculas, # letras con acentos utilizadas en español México, números, comas, puntos, paréntesis, dos puntos y espacios filtered_text = re.sub(r'[^A-Za-zÁÉÍÓÚÜáéíóúü0-9,.\(\):\s]', '', text) # Eliminar saltos de línea y reemplazar paréntesis por comas filtered_text = filtered_text.replace('\n', ' ') filtered_text = filtered_text.replace('(', ',').replace(')', ',') return filtered_text def convert_text_to_speech(parrafo, model): parrafo_filtrado = filter_text(parrafo) # Determinar el directorio base dependiendo de si se ejecuta desde el código fuente o desde el ejecutable congelado if getattr(sys, 'frozen', False): # La aplicación se está ejecutando desde un ejecutable congelado bundle_dir = getattr(sys, '_MEIPASS', os.path.abspath(os.path.dirname(sys.argv[0]))) else: # La aplicación se está ejecutando desde el código fuente bundle_dir = os.path.abspath(os.path.dirname(__file__)) # Generar un nombre de archivo aleatorio random_name = ''.join(random.choices(string.ascii_letters + string.digits, k=8)) + '.wav' output_file = os.path.join('.', random_name) # Construir la ruta al archivo piper.exe piper_exe = os.path.join(bundle_dir, 'piper') # Verificar si la ruta es válida if os.path.isfile(piper_exe): # Ejecutar el comando para generar el archivo de audio comando = f'echo {parrafo_filtrado} | "{piper_exe}" -m {model} -f {output_file}' subprocess.run(comando, shell=True) # Devolver la ruta al archivo de audio generado return output_file else: return "El archivo piper.exe no se encontró en el directorio correcto." # Función para cargar y reproducir el archivo de audio en Gradio def play_audio(parrafo, model): output_file = convert_text_to_speech(parrafo, model) with open(output_file, 'rb') as audio_file: audio_content = audio_file.read() return audio_content # Crear la interfaz de Gradio input_text = gr.Textbox(label="Introduce el texto") model_options = [ "es_MX-locutor-voice-11400-epoch-high.onnx", "otro_modelo.onnx", "es_MX-cortanav3-high.onnx", "es_MX-gafe-12232-epoch-high.onnx" ] # Agrega aquí más modelos si es necesario select_model = gr.Dropdown(model_options, label="Selecciona el modelo") gr.Interface(play_audio, inputs=[input_text, select_model], outputs=gr.Audio(), flagging_options=None).launch()