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)