Spaces:
Sleeping
Sleeping
import streamlit as st | |
import PIL.Image | |
import os | |
import google.generativeai as genai | |
safety_settings = [ | |
{"category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE"}, | |
{"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE"}, | |
{"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "threshold": "BLOCK_NONE"}, | |
{"category": "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "BLOCK_NONE"}, | |
] | |
# Configuration de la page | |
st.set_page_config( | |
page_title="Mariam Anglais", | |
page_icon="🇬🇧", | |
layout="wide", | |
initial_sidebar_state="expanded" | |
) | |
# CSS personnalisé pour un design plus esthétique | |
st.markdown( | |
""" | |
<style> | |
body { | |
background-color: #f4f4f4; | |
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; /* Police plus moderne */ | |
} | |
.stButton>button { | |
background-color: #4CAF50; | |
color: white; | |
padding: 0.75rem 1.5rem; | |
border-radius: 0.5rem; | |
font-weight: bold; | |
transition: all 0.2s ease-in-out; /* Animation au survol */ | |
} | |
.stButton>button:hover { | |
background-color: #3e8e41; /* Couleur plus foncée au survol */ | |
box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.2); /* Ombre au survol */ | |
transform: translateY(-2px); /* Légère élévation au survol */ | |
} | |
.stFileUploader { | |
padding: 1rem; | |
border: 2px dashed #4CAF50; | |
border-radius: 0.5rem; | |
} | |
.stRadio>div>label { | |
font-weight: bold; | |
} | |
.st-bb { | |
border-bottom: 2px solid #4CAF50; | |
} | |
.st-el { /* Pour les messages d'avertissement et de succès */ | |
border-radius: 0.5rem; | |
padding: 0.75rem; | |
} | |
.st-ek { /* Zone de texte */ | |
border-radius: 0.5rem; | |
} | |
.st-ef { /* Titres */ | |
font-weight: bold; | |
color: #267629; | |
} | |
.stProgress>div>div>div>div { | |
background-color: #4CAF50; | |
} | |
</style> | |
""", | |
unsafe_allow_html=True | |
) | |
prompt_text = """ | |
je souhaite faire mon travail d'anglais qui consiste à de l'analyse de texte. j'aimerais que tu le phase en respectant scrupuleusement la méthodologie suivante. j'aimerais que tu fasses ce travail en anglais en donnant également la traduction française: | |
voici le plan : | |
I- INTRODUCTION | |
Title (what is the title of the text?) | |
Nature (what is it?) | |
Author (who wrote it?) | |
Origin (where was it extracted?) | |
Date of publication (when was it written?) | |
Genre (descriptive...) | |
General idea (what is it about?) | |
Writer' intention (what for?) | |
II - SUMMARY | |
The components (the structure / text subdivision) | |
(The main parts of the text and their ideas) | |
The summary itself. | |
III - COMMENTARY | |
Focus on the main points of interest from the summary | |
Discuss, explain and develop the main points of the writer's opinion, deal with them in a coherent and logical order. | |
Tone | |
Style | |
IV-EVALUATION | |
Assess the text value | |
The interest of the text | |
The lessons, you've learnt and the impact on your opinion. | |
V - BRANCHING OUT | |
Personal opinion (give one's opinion) | |
Feelings (I had mixed feeling about.........) | |
""" | |
prompt_image = """ | |
je souhaite faire mon travail d'anglais qui consiste à de l'analyse de document iconographique . j'aimerais que tu le phase en respectant scrupuleusement la méthodologie suivante. j'aimerais que tu fasses ce travail en anglais en donnant également la traduction française: | |
voici le plan : | |
1 - Présentation du document | |
Présenter le document, titre, type, date, autheur , etc... | |
2- Description générale. | |
Fais une description générale de du document en le présentant. Bref décris tout ce que tu vois sur le document | |
3- commentaire | |
Voici le texte extrait des sections 3 et 4 : | |
Commencez par l'élément principal du document. Dans votre "présentation-résumé", vous avez signalé sa présence et précisé son emplacement. À présent, faites-en une description plus détaillée, et parlez de sa fonction : pourquoi est-il là ? À quoi sert-il ? Comme pour un texte, ne séparez pas le fond de la forme : traitez globalement emplacement, forme, couleur et fonction. | |
L'étude d'un document visuel doit être aussi rigoureuse que celle d'un texte : dessins, tableaux, sculptures, publicités, photos de films, sont faits d'explicite et d'implicite. Vous devez donc chercher cet implicite. Mais, comme pour les textes : pas de délire interprétatif. Répétez cette opération avec les autres éléments. Montrez bien les liens qui existent entre ces différents éléments : tout tableau, photographie (surtout artistique), publicité est un ensemble. | |
4. La synthèse / l’évaluation et la conclusion (the evaluation) | |
Parlez de l’atmosphère qui se dégage du document : "comment" et "pourquoi" (synthèse de ce qui a été vu en 3). Cela vous amène à parler du but que s’était fixé l’auteur du document. Donnez votre point de vue en argumentant bien votre opinion, qu’elle soit favorable ou défavorable, notamment les critiques (GIVING ONE’S OPINION: LIKES, DISLIKES, APPROVAL, DISAPPROVAL; SUMMING UP ONE’S IDEAS). | |
5. Le branching-out | |
Servez vous du document étudié pour parler d'un sujet en rapport avec ce document | |
""" | |
# Configuration de l'API Google Generative AI | |
GOOGLE_API_KEY = st.secrets["GOOGLE_API_KEY"] # Définir le chemin d'accès dans les secrets de l'application | |
genai.configure(api_key=GOOGLE_API_KEY) | |
# Titre et introduction avec effet d'animation | |
st.markdown( | |
""" | |
<h1 style='text-align: center; color: #267629; font-size: 3em; font-weight: bold;'> | |
<span style='opacity: 0; animation: fadeIn 1s ease-in-out forwards;'>✨ Mariam Anglais ✨</span> | |
</h1> | |
<style> | |
@keyframes fadeIn { | |
from { opacity: 0; } | |
to { opacity: 1; } | |
} | |
</style> | |
""", | |
unsafe_allow_html=True | |
) | |
st.markdown("<br>", unsafe_allow_html=True) # Espace | |
st.write("Bienvenue ! Téléchargez vos images, choisissez votre type d'analyse, et laissez la magie opérer.") | |
# Colonnes pour une meilleure disposition | |
col1, col2 = st.columns(2, gap="large") # Ajout d'un gap plus grand | |
with col1: | |
# Section de téléchargement d'images | |
st.subheader("📷 Téléchargement d'images") | |
uploaded_files = st.file_uploader("", type=["jpg", "jpeg", "png"], accept_multiple_files=True, label_visibility="collapsed") # Label caché | |
# Aperçu des images téléchargées avec possibilité de les supprimer individuellement | |
if uploaded_files: | |
st.write("Aperçu des images :") | |
for i, uploaded_file in enumerate(uploaded_files): | |
col_img, col_del = st.columns([4, 1]) # Colonnes pour l'image et le bouton de suppression | |
with col_img: | |
st.image(uploaded_file, width=200, caption=f"Image {i+1}") | |
with col_del: | |
if st.button(f"🗑️", key=f"del_{i}"): | |
del uploaded_files[i] | |
st.experimental_rerun() | |
with col2: | |
# Section de choix du type d'analyse | |
st.subheader("🎛️ Choix du type d'analyse") | |
analysis_type = st.radio("", | |
("🔍 Type 1: Analyse de Texte", "🧠 Type 2: Document iconographique"), label_visibility="collapsed") | |
# Description des types d'analyse (cachée par défaut, visible en cliquant) | |
with st.expander("ℹ️ En savoir plus sur les types d'analyse"): | |
if analysis_type == "🔍 Type 1: Analyse de Texte": | |
st.write("il s'agit ici de l'analyse de texte avec (INTRODUCTION,SUMMARY,COMMENTARY,EVALUATION.") | |
else: | |
st.write("il s'agit ici du document iconographique.") | |
# Bouton de soumission | |
if st.button("🚀 Soumettre", key="submit"): | |
if uploaded_files: | |
st.write("Type d'analyse sélectionné :", analysis_type) | |
# Préparation des images pour l'API | |
image_parts = [] | |
for uploaded_file in uploaded_files: | |
try: | |
image = PIL.Image.open(uploaded_file) | |
image_parts.append(image) | |
except Exception as e: | |
st.error(f"Erreur lors du chargement de l'image : {e}") | |
st.stop() | |
# Définir le prompt en fonction du type d'analyse | |
if analysis_type == "🔍 Type 1: Analyse de Texte": | |
prompt = prompt_text | |
else: | |
prompt = prompt_image | |
# Appel de l'API Google Generative AI | |
try: | |
model = genai.GenerativeModel(model_name="gemini-2.0-flash-exp",safety_settings=safety_settings) | |
with st.spinner("Analyse en cours..."): | |
progress_bar = st.progress(0) | |
response = model.generate_content([prompt] + image_parts, stream=True) | |
response.resolve() | |
progress_bar.progress(100) | |
# Affichage de la réponse | |
st.subheader("📝 Résultat de l'analyse :") | |
st.write(response.text) | |
except Exception as e: | |
st.error("Erreur lors de l'analyse :") | |
else: | |
st.warning("⚠️ Veuillez télécharger au moins une image.") | |
# Pied de page | |
st.markdown("---") | |
st.write("© 2025 Mariam AI - Tous droits réservés.") |