File size: 3,132 Bytes
dcc2c7c
 
 
 
0dd2770
 
54412ba
dcc2c7c
0dd2770
631c13e
 
ee9c6b6
 
8b9fcd0
6d1fe44
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8b9fcd0
 
 
 
 
 
 
 
 
 
 
 
6d1fe44
ee9c6b6
 
 
 
 
ec64c3b
ee9c6b6
ec64c3b
ee9c6b6
ec64c3b
 
ee9c6b6
ec64c3b
 
 
 
 
5e3bfe7
631c13e
 
ee9c6b6
ec64c3b
 
ee9c6b6
631c13e
 
 
 
029b0ee
 
 
 
 
 
 
 
ec64c3b
029b0ee
ec64c3b
029b0ee
 
 
 
 
 
 
 
 
 
51e2649
631c13e
ee9c6b6
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
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/'


import logging

model_names = {
    "es_MX-claude-14947-epoch-high.onnx": {
        "replacements": {
            ('(', ','), (')', ','), ('?', ','), ('¿', ','), (':', ','), ('\n', ' ')
        }
    },
    "kamora": {
        "replacements": {
            # Define los reemplazos específicos del modelo 2 aquí
        }
    },
    # Agrega más modelos si es necesario
}

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


def convert_text_to_speech(parrafo, model):
    # Limit text to 500 characters
    parrafo = parrafo[:100000]
    
    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')  # Adjusted the path for 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 "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)