File size: 2,705 Bytes
5e3bfe7
0dd2770
 
5e3bfe7
0dd2770
 
5e3bfe7
0dd2770
 
 
 
6daaf10
 
0dd2770
6daaf10
0dd2770
 
 
 
6daaf10
0dd2770
 
5e3bfe7
 
 
 
 
 
 
 
6daaf10
0dd2770
 
 
5e3bfe7
5953c63
09d0fa0
5e3bfe7
 
 
 
 
09d0fa0
5e3bfe7
 
 
 
 
 
 
 
30bf56e
 
 
0dd2770
5953c63
5e3bfe7
 
 
 
 
 
 
 
0dd2770
5953c63
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
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()