Spaces:
Sleeping
Sleeping
Upload app.py
Browse files
app.py
CHANGED
|
@@ -2,6 +2,7 @@
|
|
| 2 |
"""
|
| 3 |
Educational AI Assistant for Arabic Lessons - Hugging Face Spaces Version
|
| 4 |
Spécialement optimisée pour la reconnaissance vocale arabe
|
|
|
|
| 5 |
"""
|
| 6 |
|
| 7 |
import gradio as gr
|
|
@@ -167,14 +168,18 @@ def generate_questions(text, progress=None):
|
|
| 167 |
if progress:
|
| 168 |
progress(0.8, "Génération des questions...")
|
| 169 |
|
| 170 |
-
|
| 171 |
-
|
|
|
|
| 172 |
2. ما هي أهم المفاهيم التي تم شرحها في هذا الدرس؟
|
| 173 |
3. كيف يمكن تطبيق المعلومات الواردة في هذا الدرس في الحياة العملية؟
|
| 174 |
4. ما هي العلاقة بين المفاهيم المختلفة التي تم تقديمها؟
|
| 175 |
5. لو طلب منك تلخيص هذا الدرس في ثلاث نقاط، ماذا ستكتب؟"""
|
| 176 |
-
|
| 177 |
-
|
|
|
|
|
|
|
|
|
|
| 178 |
|
| 179 |
# Fonction pour générer une carte mentale
|
| 180 |
def generate_mind_map(text, progress=None):
|
|
@@ -185,38 +190,42 @@ def generate_mind_map(text, progress=None):
|
|
| 185 |
if progress:
|
| 186 |
progress(0.9, "Création de la carte mentale...")
|
| 187 |
|
| 188 |
-
|
| 189 |
-
|
| 190 |
-
|
| 191 |
-
|
| 192 |
-
|
| 193 |
-
|
| 194 |
-
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
|
| 200 |
-
|
| 201 |
-
|
| 202 |
-
|
| 203 |
-
|
| 204 |
-
|
| 205 |
-
|
| 206 |
-
|
| 207 |
-
|
| 208 |
-
|
| 209 |
-
|
| 210 |
-
|
| 211 |
-
|
| 212 |
-
|
| 213 |
-
|
| 214 |
-
|
| 215 |
-
|
| 216 |
-
|
| 217 |
-
|
| 218 |
-
|
| 219 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 220 |
|
| 221 |
# Fonction principale de traitement
|
| 222 |
def process_lesson(file_obj, progress=gr.Progress()):
|
|
@@ -235,35 +244,55 @@ def process_lesson(file_obj, progress=gr.Progress()):
|
|
| 235 |
progress(0.2, "Préparation du fichier...")
|
| 236 |
|
| 237 |
# Traitement du fichier selon son type
|
| 238 |
-
|
| 239 |
-
|
| 240 |
-
|
| 241 |
-
|
| 242 |
-
|
| 243 |
-
|
| 244 |
-
|
| 245 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 246 |
|
| 247 |
# 1. Transcription
|
| 248 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 249 |
|
| 250 |
# Libérer la mémoire après transcription
|
| 251 |
clear_gpu_memory()
|
| 252 |
|
| 253 |
# 2. Résumé (seulement si la transcription a réussi)
|
| 254 |
-
|
| 255 |
-
|
| 256 |
-
|
| 257 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 258 |
|
| 259 |
# Libérer la mémoire après résumé
|
| 260 |
clear_gpu_memory()
|
| 261 |
|
| 262 |
# 3. Génération de questions (simplifiée)
|
| 263 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 264 |
|
| 265 |
# 4. Génération de la carte mentale (simplifiée)
|
| 266 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 267 |
|
| 268 |
progress(1.0, "Terminé!")
|
| 269 |
return transcription, summary, questions, mind_map
|
|
|
|
| 2 |
"""
|
| 3 |
Educational AI Assistant for Arabic Lessons - Hugging Face Spaces Version
|
| 4 |
Spécialement optimisée pour la reconnaissance vocale arabe
|
| 5 |
+
Version avec gestion d'erreurs renforcée
|
| 6 |
"""
|
| 7 |
|
| 8 |
import gradio as gr
|
|
|
|
| 168 |
if progress:
|
| 169 |
progress(0.8, "Génération des questions...")
|
| 170 |
|
| 171 |
+
try:
|
| 172 |
+
# Version simplifiée avec des questions génériques
|
| 173 |
+
questions = """1. ما هي الفكرة الرئيسية للدرس؟
|
| 174 |
2. ما هي أهم المفاهيم التي تم شرحها في هذا الدرس؟
|
| 175 |
3. كيف يمكن تطبيق المعلومات الواردة في هذا الدرس في الحياة العملية؟
|
| 176 |
4. ما هي العلاقة بين المفاهيم المختلفة التي تم تقديمها؟
|
| 177 |
5. لو طلب منك تلخيص هذا الدرس في ثلاث نقاط، ماذا ستكتب؟"""
|
| 178 |
+
|
| 179 |
+
return questions
|
| 180 |
+
except Exception as e:
|
| 181 |
+
print(f"Erreur dans generate_questions: {e}")
|
| 182 |
+
return f"Erreur lors de la génération des questions: {str(e)}"
|
| 183 |
|
| 184 |
# Fonction pour générer une carte mentale
|
| 185 |
def generate_mind_map(text, progress=None):
|
|
|
|
| 190 |
if progress:
|
| 191 |
progress(0.9, "Création de la carte mentale...")
|
| 192 |
|
| 193 |
+
try:
|
| 194 |
+
# Version ultra-simplifiée avec vérification des indices
|
| 195 |
+
lines = text.split('.')
|
| 196 |
+
|
| 197 |
+
# Création d'une structure Markdown basique
|
| 198 |
+
markdown_map = "# خريطة ذهنية للدرس\n\n"
|
| 199 |
+
|
| 200 |
+
# Titre principal - avec vérification que lines n'est pas vide
|
| 201 |
+
if lines and len(lines) > 0 and lines[0].strip():
|
| 202 |
+
main_idea = lines[0].strip()[:100] + ("..." if len(lines[0]) > 100 else "")
|
| 203 |
+
markdown_map += f"## الموضوع الرئيسي\n- {main_idea}\n\n"
|
| 204 |
+
else:
|
| 205 |
+
markdown_map += f"## الموضوع الرئيسي\n- (لم يتم العثور على موضوع رئيسي)\n\n"
|
| 206 |
+
|
| 207 |
+
# Points principaux (limités à 3 pour simplicité)
|
| 208 |
+
markdown_map += "## النقاط الرئيسية\n\n"
|
| 209 |
+
|
| 210 |
+
# Vérifier s'il y a des lignes supplémentaires
|
| 211 |
+
if len(lines) > 1:
|
| 212 |
+
count = 0
|
| 213 |
+
for line in lines[1:]:
|
| 214 |
+
if line and line.strip() and len(line.strip()) > 15:
|
| 215 |
+
point_text = line.strip()[:80] + ("..." if len(line) > 80 else "")
|
| 216 |
+
markdown_map += f"### نقطة {count+1}\n- {point_text}\n\n"
|
| 217 |
+
count += 1
|
| 218 |
+
if count >= 3:
|
| 219 |
+
break
|
| 220 |
+
|
| 221 |
+
# Si aucun point n'a été trouvé, ajouter un message
|
| 222 |
+
if "### نقطة" not in markdown_map:
|
| 223 |
+
markdown_map += "### ملاحظة\n- لم يتم العثور على نقاط رئيسية كافية في النص\n\n"
|
| 224 |
+
|
| 225 |
+
return markdown_map
|
| 226 |
+
except Exception as e:
|
| 227 |
+
print(f"Erreur dans generate_mind_map: {e}")
|
| 228 |
+
return f"Erreur lors de la création de la carte mentale: {str(e)}"
|
| 229 |
|
| 230 |
# Fonction principale de traitement
|
| 231 |
def process_lesson(file_obj, progress=gr.Progress()):
|
|
|
|
| 244 |
progress(0.2, "Préparation du fichier...")
|
| 245 |
|
| 246 |
# Traitement du fichier selon son type
|
| 247 |
+
try:
|
| 248 |
+
if file_extension in ['.mp4', '.mov', '.avi', '.mkv']:
|
| 249 |
+
audio_path = extract_audio(file_path)
|
| 250 |
+
if not audio_path:
|
| 251 |
+
return "Échec de l'extraction audio.", "", "", ""
|
| 252 |
+
elif file_extension in ['.mp3', '.wav', '.ogg', '.flac', '.m4a']:
|
| 253 |
+
audio_path = file_path
|
| 254 |
+
else:
|
| 255 |
+
return f"Type de fichier non pris en charge: {file_extension}. Veuillez télécharger un fichier audio ou vidéo.", "", "", ""
|
| 256 |
+
except Exception as e:
|
| 257 |
+
print(f"Erreur lors de la préparation du fichier: {e}")
|
| 258 |
+
return f"Erreur lors de la préparation du fichier: {str(e)}", "", "", ""
|
| 259 |
|
| 260 |
# 1. Transcription
|
| 261 |
+
try:
|
| 262 |
+
transcription = transcribe_audio(audio_path, progress)
|
| 263 |
+
except Exception as e:
|
| 264 |
+
print(f"Erreur lors de la transcription: {e}")
|
| 265 |
+
transcription = f"La transcription a échoué: {str(e)}"
|
| 266 |
|
| 267 |
# Libérer la mémoire après transcription
|
| 268 |
clear_gpu_memory()
|
| 269 |
|
| 270 |
# 2. Résumé (seulement si la transcription a réussi)
|
| 271 |
+
try:
|
| 272 |
+
if isinstance(transcription, str) and "échoué" not in transcription.lower():
|
| 273 |
+
summary = summarize_text(transcription, progress)
|
| 274 |
+
else:
|
| 275 |
+
summary = "Impossible de générer un résumé car la transcription a échoué."
|
| 276 |
+
except Exception as e:
|
| 277 |
+
print(f"Erreur lors du résumé: {e}")
|
| 278 |
+
summary = f"Le résumé a échoué: {str(e)}"
|
| 279 |
|
| 280 |
# Libérer la mémoire après résumé
|
| 281 |
clear_gpu_memory()
|
| 282 |
|
| 283 |
# 3. Génération de questions (simplifiée)
|
| 284 |
+
try:
|
| 285 |
+
questions = generate_questions(transcription, progress)
|
| 286 |
+
except Exception as e:
|
| 287 |
+
print(f"Erreur lors de la génération des questions: {e}")
|
| 288 |
+
questions = f"La génération des questions a échoué: {str(e)}"
|
| 289 |
|
| 290 |
# 4. Génération de la carte mentale (simplifiée)
|
| 291 |
+
try:
|
| 292 |
+
mind_map = generate_mind_map(summary, progress)
|
| 293 |
+
except Exception as e:
|
| 294 |
+
print(f"Erreur lors de la génération de la carte mentale: {e}")
|
| 295 |
+
mind_map = f"La génération de la carte mentale a échoué: {str(e)}"
|
| 296 |
|
| 297 |
progress(1.0, "Terminé!")
|
| 298 |
return transcription, summary, questions, mind_map
|