52 lines
1.7 KiB
Python
52 lines
1.7 KiB
Python
import os
|
|
import subprocess
|
|
import uuid
|
|
from flask import Flask, request, send_file, jsonify
|
|
|
|
app = Flask(__name__)
|
|
|
|
# CONFIGURATION
|
|
PIPER_MODEL = "/workspace/voice.onnx"
|
|
OUTPUT_DIR = "/workspace/temp_audio"
|
|
|
|
# Créer le dossier temporaire s'il n'existe pas
|
|
os.makedirs(OUTPUT_DIR, exist_ok=True)
|
|
|
|
@app.route('/v1/audio/speech', methods=['POST'])
|
|
def text_to_speech():
|
|
data = request.json
|
|
text = data.get("input")
|
|
|
|
if not text:
|
|
return jsonify({"error": "No input text provided"}), 400
|
|
|
|
# Générer un nom de fichier unique
|
|
file_id = str(uuid.uuid4())
|
|
output_file = os.path.join(OUTPUT_DIR, f"{file_id}.wav")
|
|
|
|
try:
|
|
# Commande Piper : lit le texte via stdin et écrit dans un fichier
|
|
# On utilise echo pour envoyer le texte à Piper
|
|
command = f'echo "{text}" | piper --model {PIPER_MODEL} --output_file {output_file}'
|
|
|
|
# Exécution de la commande
|
|
subprocess.run(command, shell=True, check=True)
|
|
|
|
# Envoyer le fichier généré à Open WebUI
|
|
return send_file(output_file, mimetype="audio/wav")
|
|
|
|
except subprocess.CalledProcessError as e:
|
|
return jsonify({"error": f"Piper failed: {str(e)}"}), 500
|
|
except Exception as e:
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@app.route('/v1/models', methods=['GET'])
|
|
def list_models():
|
|
# Nécessaire pour que certaines interfaces valident la connexion
|
|
return jsonify({
|
|
"data": [{"id": "voice.onnx", "object": "model", "owned_by": "piper"}]
|
|
})
|
|
|
|
if __name__ == '__main__':
|
|
# Le serveur écoute sur toutes les interfaces sur le port 8000
|
|
app.run(host='0.0.0.0', port=8000) |