|
from flask import Flask, render_template, request, jsonify |
|
from io import BytesIO |
|
import base64 |
|
import subprocess |
|
import os |
|
import random |
|
import string |
|
import re |
|
|
|
app = Flask(__name__) |
|
|
|
def filter_text(text): |
|
filtered_text = re.sub(r'[^\w\s,.\(\):\u00C0-\u00FF]', '', text) |
|
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) |
|
bundle_dir = os.path.abspath(os.path.dirname(__file__)) |
|
print("Cargando carpeta Modelos desde:", os.path.join(bundle_dir, '.')) |
|
random_name = ''.join(random.choices(string.ascii_letters + string.digits, k=8)) + '.wav' |
|
output_file = os.path.join('.', random_name) |
|
piper_exe = '/app/piper' |
|
print("Ejecutando piper.exe desde:", piper_exe) |
|
|
|
if os.path.isfile(piper_exe): |
|
comando = f'echo {parrafo_filtrado} | "{piper_exe}" -m {model} -f {output_file}' |
|
subprocess.run(comando, shell=True) |
|
return output_file |
|
else: |
|
return "El archivo piper.exe no se encontró en el directorio correcto." |
|
|
|
@app.route('/') |
|
def index(): |
|
model_folder = '.' |
|
bundle_dir = os.path.abspath(os.path.dirname(__file__)) |
|
print("Cargando carpeta Modelos desde:", os.path.join(bundle_dir, model_folder)) |
|
model_options = [file for file in os.listdir(model_folder) if file.endswith('.onnx')] |
|
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) |
|
|
|
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}) |
|
|
|
if __name__ == '__main__': |
|
app.run(debug=True, host='0.0.0.0', port=7860) |