Spaces:
Running
Running
File size: 3,670 Bytes
dcc2c7c 0dd2770 54412ba dcc2c7c 8b9fcd0 0dd2770 631c13e 8b9fcd0 ec64c3b 40a2e22 8b9fcd0 811ad8f 8b9fcd0 40a2e22 8b9fcd0 ec64c3b 8b9fcd0 0dd2770 ec64c3b 5e3bfe7 631c13e ec64c3b 631c13e 029b0ee ec64c3b 029b0ee ec64c3b 029b0ee 51e2649 631c13e 8b9fcd0 |
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 |
from flask import Flask, render_template, request, jsonify, after_this_request
from io import BytesIO
import base64
import subprocess
import os
import random
import string
import re
import logging
app = Flask(__name__)
# Define los nombres asignados a modelos específicos, en caso de no existir no se muestran
model_names = {
"Español México | Kamora Neuronal": {
"model_path": "es_ES-kamora-7539-high.onnx",
"replacements": [('\n', '. ')]
},
"Español México | Claude": {
"model_path": "es_MX-claude-14947-epoch-high.onnx",
"replacements": [('(', ','), (')', ','), ('?', ','), ('¿', ','), (':', ','), ('\n', ' ')]
}
}
# Comprueba si los modelos definidos existen en la carpeta de modelos
model_folder = '/home/app/'
existing_models = [model_name for model_name in model_names.keys() if os.path.isfile(os.path.join(model_folder, model_names[model_name]["model_path"]))]
def multiple_replace(text, replacements):
# Iterar sobre cada par de remplazo
for old, new in replacements:
text = text.replace(old, new)
return text
def filter_text(text, model_name):
if model_name in model_names:
replacements = model_names[model_name]["replacements"]
# Realizar reemplazos específicos del modelo
filtered_text = multiple_replace(text, replacements)
# Escapar todos los caracteres especiales dentro de las comillas
filtered_text = re.sub(r'(["\'])', lambda m: "\\" + m.group(0), filtered_text)
return filtered_text
else:
logging.error(f"No se encontró el modelo '{model_name}'.")
return None
# Define una función para convertir texto a voz
def convert_text_to_speech(text, model_name):
filtered_text = filter_text(text, model_name)[:500] # Limitar el texto a 500 caracteres
if filtered_text is None:
return None
random_name = ''.join(random.choices(string.ascii_letters + string.digits, k=8)) + '.wav'
output_file = os.path.join(file_folder, random_name)
app.logger.info("Audio file created at: %s", output_file)
piper_exe = os.path.join(file_folder, 'piper') # Adjusted the path for piper
if os.path.isfile(piper_exe):
comando = f'echo {filtered_text} | "{piper_exe}" -m {model_name} -f {output_file}'
subprocess.run(comando, shell=True)
return output_file
else:
return "The piper.exe file was not found in the correct directory."
@app.route('/')
def index():
model_folder = file_folder # Adjusted the model folder to file_folder
model_options = [file for file in os.listdir(model_folder) if file.endswith('.onnx')]
# Log the contents of the current folder
app.logger.info("Contents of current folder: %s", os.listdir(file_folder))
return render_template('index.html', model_options=model_options)
@app.route('/convert', methods=['POST'])
def convert_text():
text = request.form['text']
model = request.form['model']
output_file = convert_text_to_speech(text, model)
@after_this_request
def remove_file(response):
try:
os.remove(output_file)
app.logger.info("Audio file deleted: %s", output_file)
except Exception as error:
app.logger.error("Error deleting file: %s", error)
return response
with open(output_file, 'rb') as audio_file:
audio_content = audio_file.read()
audio_base64 = base64.b64encode(audio_content).decode('utf-8')
response = jsonify({'audio_base64': audio_base64})
return response
if __name__ == '__main__':
app.run(host='0.0.0.0', port=7860, debug=False)
|