Spaces:
Running
Running
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 | |
app = Flask(__name__) | |
# Define the folder where files are saved | |
file_folder = '/home/app/' | |
# Models with specific character replacements | |
models_replacements = { | |
"Español México | Voz HirCoir": { | |
"model_path": "es_MX-locutor-18488-epoch-high.onnx", | |
"replacements": [('(', ','), (')', ','), ('?', ','), ('¿', ','), (':', ','), ('\n', ' ')] | |
}, | |
"Español México | Kamora Neuronal": { | |
"model_path": "kamora.onnx", | |
"replacements": [('\n', '')] # Modified to remove newlines | |
}, | |
"Español México | Claude": { | |
"model_path": "es_MX-claude-14947-epoch-high.onnx", | |
"replacements": [('(', ','), (')', ','), ('?', ','), ('¿', ','), (':', ','), ('\n', ' ')] | |
}, | |
"Español México | Cortana Infinnity": { | |
"model_path": "es_MX-cortana-19669-epoch-high.onnx", | |
"replacements": [('(', ','), (')', ','), ('?', ','), ('¿', ','), (':', ','), ('\n', ' ')] | |
}, | |
"Español México | TheGevy": { | |
"model_path": "es_MX-gevy-10196-epoch-high.onnx", | |
"replacements": [('(', ','), (')', ','), ('?', ','), ('¿', ','), (':', ','), ('\n', ' ')] | |
}, | |
"English US | Voice": { | |
"model_path": "en_US-ljspeech-high.onnx", | |
"replacements": [('(', ','), (')', ','), ('?', ','), ('¿', ','), (':', ','), ('\n', ' ')] | |
} | |
} | |
def filter_text(text, replacements): | |
for replacement in replacements: | |
text = text.replace(replacement[0], replacement[1]) | |
# Agrega una barra invertida adicional antes de cada caracter especial | |
special_chars = ['"', "'", '\\'] | |
for char in special_chars: | |
text = text.replace(char, '\\' + char) | |
# Elimina los saltos de línea | |
text = text.replace('\n', '') | |
# Define una función de reemplazo usando una función lambda | |
replace_func = lambda m: "\\" + m.group(0) | |
# Crea una expresión regular con los caracteres que deseas reemplazar | |
regex_pattern = r'(["\'])' | |
# Realiza el reemplazo utilizando la función sub de re | |
filtered_text = re.sub(regex_pattern, replace_func, text) | |
return filtered_text | |
def convert_text_to_speech(parrafo, model): | |
# Limit text to 500 characters | |
parrafo = parrafo[:10000] | |
model_info = models_replacements.get(model) | |
if model_info: | |
model_path = model_info.get("model_path") | |
replacements = model_info.get("replacements") | |
parrafo_filtrado = filter_text(parrafo, replacements) | |
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 {parrafo_filtrado} | "{piper_exe}" -m {model_path} -f {output_file}' | |
subprocess.run(comando, shell=True) | |
return output_file | |
else: | |
return "The piper.exe file was not found in the correct directory." | |
else: | |
return "Model not found." | |
def index(): | |
model_options = list(models_replacements.keys()) | |
# 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) | |
def convert_text(): | |
text = request.form['text'] | |
model = request.form['model'] | |
output_file = convert_text_to_speech(text, model) | |
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) | |