Spaces:
Running
Running
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)
|