File size: 2,196 Bytes
51e2649
631c13e
 
0dd2770
 
 
 
 
 
631c13e
 
0dd2770
631c13e
0dd2770
 
 
 
6daaf10
0dd2770
631c13e
51e2649
 
 
 
631c13e
5e3bfe7
51e2649
 
5e3bfe7
 
51e2649
5e3bfe7
631c13e
 
51e2649
631c13e
 
 
 
 
 
 
 
 
51e2649
 
 
 
 
 
 
 
 
30bf56e
 
631c13e
 
51e2649
 
 
 
 
0dd2770
631c13e
51e2649
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
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__)

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__))
    random_name = ''.join(random.choices(string.ascii_letters + string.digits, k=8)) + '.wav'
    output_file = os.path.join('.', random_name)
    app.logger.info("Archivo de audio creado en: %s", output_file)
    piper_exe = os.path.join(bundle_dir, './piper')
    
    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 = os.path.join('./')
    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)
    
    @after_this_request
    def remove_file(response):
        try:
            os.remove(output_file)
            app.logger.info("Archivo de audio eliminado: %s", output_file)
        except Exception as error:
            app.logger.error("Error eliminando el archivo: %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', debug=False)