xaman4 / app.py
salomonsky's picture
Update app.py
2b1c90d verified
# gtts_server.py
#
# Requisitos:
# pip install Flask gTTS Flask-Cors
#
# C贸mo ejecutar:
# Sube este archivo como app.py a tu Hugging Face Space.
# Aseg煤rate de tener un archivo requirements.txt con:
# Flask
# gTTS
# Flask-Cors
from flask import Flask, request, jsonify, send_file
from flask_cors import CORS
from gtts import gTTS
from io import BytesIO
# Inicializar la aplicaci贸n Flask
app = Flask(__name__)
# Habilitar CORS para permitir peticiones desde el navegador (frontend)
CORS(app)
# La ruta ahora acepta tanto POST (para enviar datos) como OPTIONS (para el "permiso" de seguridad)
@app.route('/api/tts', methods=['POST', 'OPTIONS'])
def text_to_speech():
"""
Endpoint para convertir texto a voz.
Maneja la petici贸n de permiso OPTIONS y la petici贸n POST.
"""
# Si la petici贸n es OPTIONS, Flask-CORS la manejar谩 y devolver谩 la respuesta correcta.
# No necesitamos hacer nada especial aqu铆 para OPTIONS.
if request.method == 'POST':
try:
data = request.get_json()
if not data or 'text' not in data:
return jsonify({"error": "No se proporcion贸 texto (clave 'text')."}), 400
text_to_speak = data.get('text')
# Generar el audio con acento de M茅xico
tts = gTTS(text=text_to_speak, lang='es', tld='com.mx', slow=False)
mp3_fp = BytesIO()
tts.write_to_fp(mp3_fp)
mp3_fp.seek(0)
return send_file(
mp3_fp,
mimetype='audio/mpeg',
as_attachment=False,
download_name='narration.mp3'
)
except Exception as e:
print(f"Ha ocurrido un error: {e}")
return jsonify({"error": str(e)}), 500
# Por defecto, si no es POST, se asume que CORS ya manej贸 OPTIONS
return jsonify(success=True)
if __name__ == '__main__':
# Cuando se ejecuta en Hugging Face, ellos manejan el host y el puerto.
# El modo debug debe estar en False para evitar errores de 'signal'.
app.run(host='0.0.0.0', port=7860, debug=False)