Files
VASTAI-STUDIO-AUDIO/tts_server.py
2026-02-23 13:26:17 +00:00

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)