File size: 4,523 Bytes
dcc2c7c
 
 
 
 
 
0dd2770
 
54412ba
dcc2c7c
 
 
 
 
0dd2770
631c13e
 
dcc2c7c
 
4ff87f9
cfc7877
7b23cd3
dcc2c7c
 
 
 
 
 
 
 
811ad8f
0dd2770
4ff87f9
 
dcc2c7c
0dd2770
dcc2c7c
 
811ad8f
dcc2c7c
 
4ff87f9
 
 
 
 
 
 
 
 
 
dcc2c7c
4ff87f9
5e3bfe7
4ff87f9
 
dcc2c7c
 
 
 
 
 
 
 
 
 
 
 
 
 
5e3bfe7
631c13e
 
dcc2c7c
 
 
631c13e
 
 
dcc2c7c
631c13e
4ff87f9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51e2649
631c13e
dcc2c7c
4ff87f9
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
import logging
from flask import Flask, render_template, request, jsonify, after_this_request
from functools import wraps
from io import BytesIO
import base64
import subprocess
import os
import random
import string
import re
import sys

# Configuraci贸n del registro
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

app = Flask(__name__)

# Define el directorio donde se guardan los archivos
file_folder = getattr(sys, '_MEIPASS', os.path.abspath(os.path.dirname(__file__)))
temp_audio_folder = "/home/app/temp_audio/"
model_folder = "/home/app/"
piper_binary_path = "/home/app/piper"

# Define los nombres asignados a modelos espec铆ficos
model_names = {
    "Espa帽ol M茅xico | Claude": "es_MX-claude-14947-epoch-high.onnx",
    "Espa帽ol M茅xico |  Cortana v1": "es_MX-cortana-19669-epoch-high.onnx",
    "Espa帽ol M茅xico |  TheGevy": "es_MX-gevy-10196-epoch-high.onnx",
    "English United States Example": "en_US-ljspeech-high.onnx"
}

def filter_text(text):
    filtered_text = re.sub(r'[^\w\s,.\(\):\u00C0-\u00FF]', '', text)  # Filtra caracteres no deseados
    filtered_text = filtered_text.replace('\n', ' ')  # Reemplaza saltos de l铆nea con espacios
    return filtered_text

def convert_text_to_speech(text, model):
    filtered_text = filter_text(text)
    random_name = ''.join(random.choices(string.ascii_letters + string.digits, k=8)) + '.wav'
    output_file = os.path.join(temp_audio_folder, random_name)

    if os.path.isfile(piper_binary_path) and model in model_names:
        model_path = os.path.join(model_folder, model_names[model])
        if os.path.isfile(model_path):
            # Construye el comando para ejecutar Piper
            command = f'echo "{filtered_text}" | "{piper_binary_path}" -m {model_path} -f {output_file}'
            try:
                subprocess.run(command, shell=True, check=True)
                return output_file
            except subprocess.CalledProcessError as e:
                logging.error(f"Error al ejecutar el comando: {e}")
        else:
            logging.error(f"Modelo '{model}' no encontrado en la ubicaci贸n especificada.")
    else:
        logging.error(f"No se encontr贸 el binario de Piper en la ubicaci贸n especificada o modelo no asignado.")
    return None

# Define una funci贸n decoradora para restringir el acceso a la ruta /convert
def restrict_access(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        # Verifica si la solicitud se hizo desde la p谩gina index.html
        referer = request.headers.get("Referer")
        if referer and referer.endswith("/"):
            # Permite el acceso a la funci贸n si la solicitud proviene de la p谩gina index.html
            return func(*args, **kwargs)
        else:
            # Devuelve un mensaje de error o redirecciona a otra p谩gina
            return "Acceso no autorizado", 403  # C贸digo de respuesta HTTP 403 - Forbidden
    return wrapper

@app.route('/')
def index():
    model_options = list(model_names.keys())
    # Registra el contenido de la carpeta actual
    logging.info("Contents of current folder: %s", os.listdir(file_folder))
    return render_template('index.html', model_options=model_options)

@app.route('/convert', methods=['POST'])
@restrict_access
def convert_text():
    try:
        text = request.form['text']
        model = request.form['model']
        output_file = convert_text_to_speech(text, model)

        @after_this_request
        def remove_file(response):
            try:
                if output_file and os.path.exists(output_file):
                    os.remove(output_file)
                    logging.info("Audio file deleted: %s", output_file)
            except Exception as error:
                logging.error("Error deleting file: %s", error)
            return response

        if output_file:
            with open(output_file, 'rb') as audio_file:
                audio_content = audio_file.read()

            audio_base64 = base64.b64encode(audio_content).decode('utf-8')
            return jsonify({'audio_base64': audio_base64})
        else:
            return jsonify({'error': 'Error al convertir texto a voz'}), 500  # Internal Server Error
    except Exception as e:
        logging.error("Error processing request: %s", e)
        return jsonify({'error': 'Error interno del servidor'}), 500  # Internal Server Error

if __name__ == '__main__':
    logging.info("Se est谩 iniciando la aplicaci贸n.")
    app.run(host='0.0.0.0', port=7860, debug=False)