Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,11 +1,13 @@
|
|
| 1 |
# app.py
|
| 2 |
-
|
|
|
|
| 3 |
from werkzeug.utils import secure_filename
|
| 4 |
-
|
|
|
|
| 5 |
import os
|
| 6 |
import io
|
| 7 |
import tempfile
|
| 8 |
-
|
| 9 |
|
| 10 |
app = Flask(__name__)
|
| 11 |
|
|
@@ -30,27 +32,24 @@ def index():
|
|
| 30 |
|
| 31 |
@app.route('/read', methods=['POST'])
|
| 32 |
def read_text():
|
| 33 |
-
"""Route de traitement: Reçoit le texte/fichier et la langue, génère l'audio."""
|
| 34 |
|
| 35 |
-
# 1.
|
| 36 |
-
text_input = request.form.get('text_input'
|
| 37 |
-
voice_id = request.form.get('
|
| 38 |
-
uploaded_file = request.files.get('file_input')
|
| 39 |
|
|
|
|
| 40 |
text_to_speak = ""
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
filename = secure_filename(uploaded_file.filename)
|
| 45 |
-
# Gestion simple pour les fichiers .txt uniquement pour l'instant
|
| 46 |
if filename.endswith('.txt'):
|
| 47 |
try:
|
| 48 |
-
|
| 49 |
-
text_to_speak = uploaded_file.read().decode('utf-8')
|
| 50 |
except Exception as e:
|
| 51 |
return f"Erreur de lecture du fichier: {e}", 400
|
| 52 |
else:
|
| 53 |
-
# Le PDF nécessiterait l'installation de PyPDF2 et un traitement plus complexe.
|
| 54 |
return "Type de fichier non supporté. Veuillez utiliser un fichier .txt.", 400
|
| 55 |
|
| 56 |
elif text_input:
|
|
@@ -60,23 +59,19 @@ def read_text():
|
|
| 60 |
return "Veuillez entrer du texte ou télécharger un fichier.", 400
|
| 61 |
|
| 62 |
if not voice_id:
|
| 63 |
-
# Fallback au cas où aucune voix n'est sélectionnée (devrait être géré par l'interface)
|
| 64 |
voices = get_available_languages()
|
| 65 |
-
|
|
|
|
| 66 |
|
| 67 |
-
#
|
| 68 |
try:
|
| 69 |
-
#
|
| 70 |
-
|
| 71 |
-
audio_path = os.path.join(temp_dir, TEMP_AUDIO_FILE)
|
| 72 |
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
# Flask envoie le fichier et le supprime après (mieux que de le garder sur le disque)
|
| 77 |
-
return send_file(audio_path, mimetype="audio/wav", as_attachment=False)
|
| 78 |
|
| 79 |
except Exception as e:
|
| 80 |
-
print(f"Erreur
|
| 81 |
-
return f"Erreur
|
| 82 |
-
|
|
|
|
| 1 |
# app.py
|
| 2 |
+
|
| 3 |
+
from flask import Flask, render_template, request, send_file, redirect, url_for, Response # Import de Response
|
| 4 |
from werkzeug.utils import secure_filename
|
| 5 |
+
# Changement: On importe la fonction de streaming
|
| 6 |
+
from tts_engine import get_available_languages, stream_text_to_audio
|
| 7 |
import os
|
| 8 |
import io
|
| 9 |
import tempfile
|
| 10 |
+
import sys # Import pour les logs
|
| 11 |
|
| 12 |
app = Flask(__name__)
|
| 13 |
|
|
|
|
| 32 |
|
| 33 |
@app.route('/read', methods=['POST'])
|
| 34 |
def read_text():
|
| 35 |
+
"""Route de traitement: Reçoit le texte/fichier et la langue, génère l'audio en streaming."""
|
| 36 |
|
| 37 |
+
# 1. Collecte des données (inchangé)
|
| 38 |
+
text_input = request.form.get('text_input')
|
| 39 |
+
voice_id = request.form.get('voice_id')
|
|
|
|
| 40 |
|
| 41 |
+
# Gérer l'upload de fichier
|
| 42 |
text_to_speak = ""
|
| 43 |
+
# ... (Logique de lecture de fichier/texte - inchangée)
|
| 44 |
+
if 'file_upload' in request.files and request.files['file_upload'].filename != '':
|
| 45 |
+
uploaded_file = request.files['file_upload']
|
| 46 |
filename = secure_filename(uploaded_file.filename)
|
|
|
|
| 47 |
if filename.endswith('.txt'):
|
| 48 |
try:
|
| 49 |
+
text_to_speak = uploaded_file.read().decode('utf-8')
|
|
|
|
| 50 |
except Exception as e:
|
| 51 |
return f"Erreur de lecture du fichier: {e}", 400
|
| 52 |
else:
|
|
|
|
| 53 |
return "Type de fichier non supporté. Veuillez utiliser un fichier .txt.", 400
|
| 54 |
|
| 55 |
elif text_input:
|
|
|
|
| 59 |
return "Veuillez entrer du texte ou télécharger un fichier.", 400
|
| 60 |
|
| 61 |
if not voice_id:
|
|
|
|
| 62 |
voices = get_available_languages()
|
| 63 |
+
# Fallback à la première voix disponible
|
| 64 |
+
voice_id = next(iter(voices.values()), None)
|
| 65 |
|
| 66 |
+
# 2. Génération de l'audio en streaming
|
| 67 |
try:
|
| 68 |
+
# La fonction retourne un générateur de morceaux audio (bytes, incluant l'en-tête WAV)
|
| 69 |
+
audio_stream_generator = stream_text_to_audio(text_to_speak, voice_id)
|
|
|
|
| 70 |
|
| 71 |
+
# 3. Renvoie la réponse en streaming au client
|
| 72 |
+
# Le mimetype doit être 'audio/wav' pour que le navigateur lise le flux
|
| 73 |
+
return Response(audio_stream_generator, mimetype='audio/wav')
|
|
|
|
|
|
|
| 74 |
|
| 75 |
except Exception as e:
|
| 76 |
+
print(f"Erreur de génération audio (eSpeak-NG): {e}", file=sys.stderr)
|
| 77 |
+
return f"Erreur de génération audio: {e}", 500
|
|
|