# app.py from flask import Flask, render_template, request, send_file, redirect, url_for, Response # Import de Response from werkzeug.utils import secure_filename # Changement: On importe la fonction de streaming from tts_engine import get_available_languages, stream_text_to_audio import os import io import tempfile import sys # Import pour les logs app = Flask(__name__) # Configuration simple pour l'upload UPLOAD_FOLDER = 'uploads' os.makedirs(UPLOAD_FOLDER, exist_ok=True) app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # Limite 16MB # Fichier temporaire pour l'audio généré TEMP_AUDIO_FILE = "tts_output.wav" @app.route('/', methods=['GET']) def index(): """Route principale: Affiche le formulaire et la liste des langues.""" # Récupérer les langues pour le menu déroulant languages = get_available_languages() # Afficher la template HTML return render_template('index.html', languages=languages) @app.route('/read', methods=['POST']) def read_text(): """Route de traitement: Reçoit le texte/fichier et la langue, génère l'audio en streaming.""" # 1. Collecte des données (inchangé) text_input = request.form.get('text_input') voice_id = request.form.get('voice_id') # Gérer l'upload de fichier text_to_speak = "" # ... (Logique de lecture de fichier/texte - inchangée) if 'file_upload' in request.files and request.files['file_upload'].filename != '': uploaded_file = request.files['file_upload'] filename = secure_filename(uploaded_file.filename) if filename.endswith('.txt'): try: text_to_speak = uploaded_file.read().decode('utf-8') except Exception as e: return f"Erreur de lecture du fichier: {e}", 400 else: return "Type de fichier non supporté. Veuillez utiliser un fichier .txt.", 400 elif text_input: text_to_speak = text_input if not text_to_speak: return "Veuillez entrer du texte ou télécharger un fichier.", 400 if not voice_id: voices = get_available_languages() # Fallback à la première voix disponible voice_id = next(iter(voices.values()), None) # 2. Génération de l'audio en streaming try: # La fonction retourne un générateur de morceaux audio (bytes, incluant l'en-tête WAV) audio_stream_generator = stream_text_to_audio(text_to_speak, voice_id) # 3. Renvoie la réponse en streaming au client # Le mimetype doit être 'audio/wav' pour que le navigateur lise le flux return Response(audio_stream_generator, mimetype='audio/wav') except Exception as e: print(f"Erreur de génération audio (eSpeak-NG): {e}", file=sys.stderr) return f"Erreur de génération audio: {e}", 500