import gradio as gr
import os
import tempfile
from datetime import datetime
import logging
import json
from ai_enhance import AIEnhance
from presentation_generator import PresentationGenerator
# Configuration logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Initialisation des services
ai_service = AIEnhance()
presentation_generator = PresentationGenerator()
# Code secret
CODE_SECRET = "32015" # code à cinq chiffres
def verifier_code(code):
"""Vérifie si le code entré est correct"""
if code == CODE_SECRET:
return True, "🔓 Accès autorisé !"
else:
return False, "❌ Code incorrect. Veuillez réessayer."
def create_presentation_structure(texte):
"""Crée la structure de présentation avec analyse IA"""
try:
# ESSAYER DIFFÉRENTES MÉTHODES POUR TROUVER CELLE QUI FONCTIONNE
if hasattr(ai_service, '_basic_analysis'):
analysis = ai_service._basic_analysis(texte)
elif hasattr(ai_service, 'analyze_text_advanced'):
analysis = ai_service.analyze_text_advanced(texte)
else:
# Créer une analyse de base manuellement
analysis = {
"statistics": {"word_count": len(texte.split()), "sentence_count": texte.count('.')},
"keywords": ["texte", "analyse", "présentation"],
"recommended_structure": {
"slides": [
{"title": "Introduction", "content": "Présentation du sujet"},
{"title": "Développement", "content": "Points principaux"},
{"title": "Conclusion", "content": "Synthèse"}
]
},
"content_analysis": "général"
}
summary = ai_service.smart_summarize(texte)
structure = {
"title": f"Présentation: {analysis['content_analysis'].capitalize()}",
"slides": analysis["recommended_structure"]["slides"],
"key_points": analysis["keywords"][:8],
"style_recommendation": analysis["recommended_structure"]["recommended_style"],
"analysis_metadata": analysis
}
return structure, summary
except Exception as e:
logger.error(f"Erreur dans create_presentation_structure: {e}")
# Retourner une structure par défaut en cas d'erreur
default_structure = {
"title": "Présentation Générée par IA",
"slides": [
{"title": "Introduction", "content": "Votre texte a été analysé avec succès"},
{"title": "Points Principaux", "content": "Les insights clés ont été extraits"},
{"title": "Conclusion", "content": "Synthèse des éléments importants"}
],
"key_points": ["analyse", "texte", "présentation"],
"analysis_metadata": {"statistics": {"word_count": len(texte.split())}}
}
return default_structure, texte[:200] + "..."
def generate_presentation_gradio(texte, style="professionnel"):
"""Version Gradio améliorée avec prévisualisation"""
try:
if not texte or len(texte.strip()) < 50:
return None, None, "❌ Veuillez entrer au moins 50 caractères."
logger.info(f"🚀 Génération IA pour {len(texte)} caractères")
# Générer la structure
structure, summary = create_presentation_structure(texte)
filename = presentation_generator.generate_presentation(structure, style)
# Créer une belle prévisualisation
preview_html = create_preview_html(structure, summary)
logger.info("✅ Présentation générée avec succès!")
return filename, preview_html, f"🎉 Présentation générée! ({len(structure['slides'])} slides)"
except Exception as e:
logger.error(f"❌ Erreur lors de la génération: {e}")
return None, None, f"❌ Erreur: {str(e)}"
def create_preview_html(structure, summary):
"""Crée une belle prévisualisation HTML des slides"""
html_content = f"""
📊 Aperçu de votre Présentation
🎯 Titre Principal
{structure['title']}
🔄 Structure des Slides
"""
# Ajouter chaque slide
for i, slide in enumerate(structure['slides']):
html_content += f"""
{i+1}
{slide['title']}
{slide['content']}
"""
# Ajouter les points clés
html_content += f"""
🎯 Points Clés Identifiés
"""
for point in structure['key_points']:
html_content += f'{point}'
html_content += """
"""
return html_content
def analyze_text_gradio(texte):
"""Version Gradio de votre api_analyze()"""
try:
if not texte or len(texte.strip()) < 10:
return "❌ Texte trop court. Minimum 10 caractères."
structure, summary = create_presentation_structure(texte)
# Formatage pour l'interface Gradio
result = f"""
## 📊 Analyse IA du Texte
**Statistiques:**
- {structure['analysis_metadata']['statistics']['word_count']} mots
- {structure['analysis_metadata']['statistics']['sentence_count']} phrases
- {structure['analysis_metadata']['statistics']['paragraph_count']} paragraphes
**🎯 Thèmes identifiés:**
{', '.join(structure['key_points'][:8])}
**📝 Résumé:**
{summary}
**🏗️ Structure proposée:**
"""
for i, slide in enumerate(structure['slides']):
result += f"\n{i+1}. **{slide['title']}** - {slide['content'][:100]}..."
return result
except Exception as e:
return f"❌ Erreur d'analyse: {str(e)}"
# INTERFACE PRINCIPALE AVEC AUTHENTIFICATION
with gr.Blocks(theme=gr.themes.Soft(), title="Générateur de Présentation IA") as demo:
# Écran d'authentification
with gr.Column(visible=True) as auth_screen:
gr.Markdown("# 🔒 Accès Sécurisé")
gr.Markdown("Veuillez entrer le code d'accès à 5 chiffres")
with gr.Row():
code_input = gr.Textbox(
label="Code d'accès",
type="text",
max_lines=1,
placeholder="Entrez les 5 chiffres...",
elem_id="code_input"
)
verifier_btn = gr.Button("Vérifier", variant="primary")
message_sortie = gr.Textbox(label="Statut", interactive=False)
# Application principale (cachée au début)
with gr.Column(visible=False) as app_screen:
gr.Markdown("""
# 🧠 Générateur de Présentation IA Intelligente
**Powered by Lab_Math_and Labhp & CIE Label_Bertoua**
Transformez votre texte en présentation PowerPoint professionnelle en quelques secondes !
""")
with gr.Tab("🚀 Générer Présentation"):
with gr.Row():
with gr.Column():
text_input = gr.Textbox(
label="📝 Collez votre texte ici",
placeholder="Collez ou tapez votre texte, article, rapport... (minimum 50 caractères)",
lines=12,
max_lines=20
)
style_dropdown = gr.Dropdown(
choices=["professionnel", "moderne", "creatif"],
label="🎨 Style de présentation",
value="professionnel",
info="Choisissez le style visuel de votre présentation"
)
generate_btn = gr.Button("🚀 Générer la Présentation", variant="primary", size="lg")
with gr.Column():
output_file = gr.File(label="📥 Télécharger la Présentation", file_types=[".pptx"])
preview_output = gr.HTML(label="👁️ Aperçu de la Structure")
output_message = gr.Textbox(label="📋 Statut", interactive=False)
generate_btn.click(
fn=generate_presentation_gradio,
inputs=[text_input, style_dropdown],
outputs=[output_file, preview_output, output_message]
)
with gr.Tab("🔍 Analyser le Texte"):
with gr.Row():
with gr.Column():
analyze_text_input = gr.Textbox(
label="📝 Texte à analyser",
placeholder="Collez votre texte pour l'analyse IA...",
lines=8
)
analyze_btn = gr.Button("🔍 Analyser avec IA", variant="secondary")
with gr.Column():
analysis_output = gr.Markdown(label="📊 Résultats de l'analyse")
analyze_btn.click(
fn=analyze_text_gradio,
inputs=[analyze_text_input],
outputs=[analysis_output]
)
def gerer_acces(code):
"""Gère l'authentification et affiche l'application si le code est correct"""
est_valide, message = verifier_code(code)
return (
message,
gr.update(visible=not est_valide), # Cacher l'écran d'auth
gr.update(visible=est_valide) # Afficher l'application
)
# Lier le bouton de vérification
verifier_btn.click(
fn=gerer_acces,
inputs=[code_input],
outputs=[message_sortie, auth_screen, app_screen]
)
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860)