|
import os |
|
import random |
|
import re |
|
import string |
|
import subprocess |
|
import base64 |
|
from flask import Flask, render_template, request, jsonify, after_this_request |
|
|
|
app = Flask(__name__) |
|
|
|
|
|
file_folder = '/home/app/' |
|
|
|
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[:500] |
|
|
|
def convert_text_to_speech(parrafo, model): |
|
parrafo_filtrado = filter_text(parrafo) |
|
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') |
|
|
|
if os.path.isfile(piper_exe): |
|
comando = f'echo "{parrafo_filtrado}" | "{piper_exe}" -m {model} -f {output_file}' |
|
try: |
|
subprocess.run(comando, shell=True, check=True) |
|
return output_file |
|
except subprocess.CalledProcessError as e: |
|
app.logger.error("Error executing command: %s", e) |
|
return None |
|
else: |
|
return "The piper.exe file was not found in the correct directory." |
|
|
|
@app.route('/') |
|
def index(): |
|
model_folder = file_folder |
|
model_options = [file for file in os.listdir(model_folder) if file.endswith('.onnx')] |
|
|
|
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.get('text') |
|
model = request.form.get('model') |
|
|
|
if not text or not model: |
|
return jsonify({'error': 'Invalid request'}), 400 |
|
|
|
output_file = convert_text_to_speech(text, model) |
|
if output_file: |
|
@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 |
|
else: |
|
return jsonify({'error': 'Conversion failed'}), 500 |
|
|
|
if __name__ == '__main__': |
|
app.run(host='0.0.0.0', port=7860, debug=False) |
|
|