Spaces:
Sleeping
Sleeping
| # 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" | |
| 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) | |
| 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 |