File size: 4,383 Bytes
6450a0b
 
 
ec43347
6450a0b
0dd2770
54412ba
6450a0b
0dd2770
631c13e
 
6450a0b
 
8b9fcd0
79df6e6
 
cf8407f
 
6450a0b
cf8407f
79df6e6
cb46d56
6450a0b
6d1fe44
79df6e6
 
6450a0b
cf8407f
 
 
6450a0b
cf8407f
 
 
6450a0b
cf8407f
 
 
6450a0b
79df6e6
6d1fe44
 
6450a0b
 
 
28871b0
 
 
 
6450a0b
 
 
 
 
 
 
 
 
 
 
28871b0
ee9c6b6
6450a0b
 
 
79df6e6
 
 
6450a0b
 
79df6e6
 
6450a0b
 
79df6e6
 
6450a0b
79df6e6
 
 
 
ec64c3b
79df6e6
5e3bfe7
631c13e
 
79df6e6
6450a0b
 
631c13e
 
 
 
029b0ee
 
 
 
 
 
 
 
6450a0b
029b0ee
ec64c3b
029b0ee
 
 
 
 
 
 
 
 
 
51e2649
631c13e
79df6e6
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
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."

@app.route('/')
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)

@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)