Spaces:
Build error
Build error
| import streamlit as st | |
| from dotenv import load_dotenv | |
| load_dotenv() | |
| import os | |
| import google.generativeai as genai | |
| import os | |
| from googletrans import Translator | |
| # import google.generativeai as genai # Commentez cette ligne si inutile pour text-to-speech | |
| from PIL import Image | |
| from gtts import gTTS # Bibliothèque pour la synthèse vocale | |
| import google.generativeai as genai | |
| import requests | |
| import base64 | |
| import io | |
| import pandas as pd | |
| st.set_page_config(layout="wide") | |
| st.sidebar.image('logo.png',width=300) | |
| st.set_option('deprecation.showPyplotGlobalUse', False) | |
| def main(): | |
| menu =['Chatbot','Text-to-speech','Zero-shot-image-classification','Image-to-text'] | |
| choice = st.sidebar.selectbox('Select Menu',menu) | |
| if choice == 'Chatbot': | |
| genai.configure(api_key=os.getenv('GOOGLE_API_KEY')) | |
| model=genai.GenerativeModel('gemini-pro') | |
| chat= model.start_chat(history=[]) | |
| st.title('Chatbot Intelligent') | |
| st.write("<hr>", unsafe_allow_html=True) | |
| def get_gemini_response(question): | |
| response=chat.send_message(question,stream=True) | |
| return response | |
| # Initialize chat history | |
| if "messages" not in st.session_state: | |
| st.session_state.messages = [] | |
| # Display chat messages from history on app rerun | |
| for message in st.session_state.messages: | |
| with st.chat_message(message["role"]): | |
| st.markdown(message["content"]) | |
| # React to user input | |
| if prompt := st.chat_input("Quoi de neuf?"): | |
| # Display user message in chat message container | |
| st.chat_message("user").markdown(prompt) | |
| # Add user message to chat history | |
| st.session_state.messages.append({"role": "user", "content": prompt}) | |
| response = get_gemini_response(prompt) | |
| # Display assistant response in chat message container | |
| with st.chat_message("assistant"): | |
| for chunk in response: | |
| st.write(chunk.text) | |
| #st.markdown(response) | |
| # Add assistant response to chat history | |
| st.session_state.messages.append({"role": "assistant", "content":chunk.text }) | |
| if choice == 'Text-to-speech': | |
| genai.configure(api_key=os.getenv('GOOGLE_API_KEY')) | |
| st.header('Transformez votre Texte en Espagnol avec Audio') | |
| st.write("<hr>", unsafe_allow_html=True) | |
| def get_text_to_speech(texte): | |
| # Traduction du texte en espagnol | |
| texte_espagnol = traduire_texte(texte) | |
| # Configuration de la langue et de la vitesse (optionnel) | |
| tts = gTTS(text=texte_espagnol, lang='es', slow=False) | |
| # Enregistrement du fichier audio | |
| tts.save("output.mp3") | |
| # Lire le fichier audio dans Streamlit (nécessite des bibliothèques supplémentaires) | |
| st.audio("output.mp3") | |
| def traduire_texte(texte): | |
| traducteur = Translator() | |
| traduction = traducteur.translate(texte, dest="es") | |
| return traduction.text | |
| # CSS personnalisé pour le bouton avec un fond vert | |
| custom_css = """ | |
| <style> | |
| .stButton>button { | |
| background-color: green; | |
| color: white; | |
| padding: 10px 30px; /* Ajuster la hauteur et la largeur du bouton */ | |
| font-size: 16px; /* Ajuster la taille de la police du texte */ | |
| border: 2px solid green; /* Ajouter une bordure verte */ | |
| border-radius: 5px; /* Ajouter des coins arrondis à la bordure */ | |
| margin-left: auto; /* Positionner le bouton à droite */ | |
| margin-right: 0; /* Positionner le bouton à droite */ | |
| } | |
| /* Style pour le survol du bouton */ | |
| .stButton>button:hover { | |
| background-color: white; | |
| color: green; | |
| border: 2px solid green; /* Ajouter une bordure verte */ | |
| border-radius: 5px; /* Ajouter des coins arrondis à la bordure */ | |
| } | |
| </style> | |
| """ | |
| # Affichage du CSS personnalisé | |
| st.markdown(custom_css, unsafe_allow_html=True) | |
| def input_text_setup(): | |
| text = st.text_area("Entrez le texte à convertir en parole :", height=200,placeholder="Veuillez entre votre text a traduire...") | |
| submit_button = st.button("Soumettre") # Ajout du bouton de soumission | |
| return text, submit_button | |
| # Section pour la conversion text-to-speech | |
| # Afficher le champ de texte et le bouton de soumission | |
| text_to_convert, submit_button = input_text_setup() | |
| if submit_button: | |
| if text_to_convert: | |
| texte_traduit = traduire_texte(text_to_convert) | |
| st.success("Texte converti en parole espagnole avec sucess.") | |
| get_text_to_speech(texte_traduit) | |
| # Section pour l'analyse d'images (peut rester commentée si non utilisée) | |
| else: | |
| st.warning("Veuillez entrer du texte avant de soumettre.") | |
| if choice == 'Zero-shot-image-classification': | |
| st.title("CLIP Image Classification") | |
| API_URL = "https://api-inference.huggingface.co/models/openai/clip-vit-large-patch14" | |
| hugging_face_token = os.getenv('API_TOKEN') | |
| def query(data): | |
| img_bytes = io.BytesIO(data["image_bytes"]) | |
| payload = { | |
| "parameters": data["parameters"], | |
| "inputs": base64.b64encode(img_bytes.read()).decode("utf-8") | |
| } | |
| headers = {"Authorization": f"Bearer {hugging_face_token}"} | |
| response = requests.post(API_URL, headers=headers, json=payload) | |
| return response.json() | |
| custom_css = """ | |
| <style> | |
| .stButton>button { | |
| background-color: green; | |
| color: white; | |
| padding: 10px 30px; /* Ajuster la hauteur et la largeur du bouton */ | |
| font-size: 16px; /* Ajuster la taille de la police du texte */ | |
| border: 2px solid green; /* Ajouter une bordure verte */ | |
| border-radius: 5px; /* Ajouter des coins arrondis à la bordure */ | |
| margin-left: auto; /* Positionner le bouton à droite */ | |
| margin-right: 0; /* Positionner le bouton à droite */ | |
| } | |
| /* Stylisation des étiquettes prédites */ | |
| .st-emotion-cache-cnbvxy { | |
| margin-top: 20px;/* Marge supérieure */ | |
| font-size: 100px !important; /* Taille de la police */ | |
| } | |
| /* Style pour chaque étiquette prédite */ | |
| .predicted-label { | |
| color: green; /* Texte vert */ | |
| margin-bottom: 5px; /* Marge inférieure */ | |
| } | |
| /* Style pour le survol du bouton */ | |
| .stButton>button:hover { | |
| background-color: white; | |
| color: green; | |
| border: 2px solid green; /* Ajouter une bordure verte */ | |
| border-radius: 5px; /* Ajouter des coins arrondis à la bordure */ | |
| } | |
| </style> | |
| """ | |
| # Affichage du CSS personnalisé | |
| st.markdown(custom_css, unsafe_allow_html=True) | |
| uploaded_image = st.file_uploader("Upload Image", type=["jpg", "jpeg", "png"]) | |
| if uploaded_image is not None: | |
| st.image(uploaded_image, caption="Uploaded Image", use_column_width=True) | |
| st.title("Entre les Labels (obligatoire)") | |
| candidate_labels = st.text_input("Entrez les étiquettes séparées par des virgules",placeholder='Veullez entrer les classes separé par des virgules. ex: chat, chien, souris ...') | |
| parameters = {"candidate_labels": candidate_labels.split(",")} | |
| if st.button("Classifier"): | |
| if candidate_labels.strip() == "": | |
| st.warning("Veuillez entrer au moins une étiquette. Au-delà de deux étiquettes, veuillez vous assurer de les séparer par des virgules et des espaces.") | |
| else: | |
| parameters = {"candidate_labels": candidate_labels.split(",")} | |
| result = query({"image_bytes": uploaded_image.read(), "parameters": parameters}) | |
| if result: | |
| # Début du tableau | |
| st.title("Predicted Labels:") | |
| # Création d'une liste pour stocker les labels et scores | |
| labels = [] | |
| scores = [] | |
| for prediction in result: | |
| label = prediction["label"] | |
| score = prediction["score"] | |
| labels.append(label) | |
| scores.append(score) | |
| # Création d'un DataFrame avec les labels et les scores | |
| df = pd.DataFrame({ | |
| 'Label': labels, | |
| 'Score': scores, | |
| }) | |
| # Affichage du DataFrame avec une largeur ajustée | |
| st.dataframe(df, width=600) | |
| else: | |
| st.write("No labels predicted.") | |
| if choice == 'Image-to-text': | |
| genai.configure(api_key=os.getenv('GOOGLE_API_KEY')) | |
| custom_css = """ | |
| <style> | |
| .stButton>button { | |
| background-color: green; | |
| color: white; | |
| padding: 10px 30px; /* Ajuster la hauteur et la largeur du bouton */ | |
| font-size: 16px; /* Ajuster la taille de la police du texte */ | |
| border: 2px solid green; /* Ajouter une bordure verte */ | |
| border-radius: 5px; /* Ajouter des coins arrondis à la bordure */ | |
| margin-left: auto; /* Positionner le bouton à droite */ | |
| margin-right: 0; /* Positionner le bouton à droite */ | |
| } | |
| /* Style pour le survol du bouton */ | |
| .stButton>button:hover { | |
| background-color: white; | |
| color: green; | |
| border: 2px solid green; /* Ajouter une bordure verte */ | |
| border-radius: 5px; /* Ajouter des coins arrondis à la bordure */ | |
| } | |
| </style> | |
| """ | |
| st.markdown(custom_css, unsafe_allow_html=True) | |
| def get_gemini_response(input_prompt,image): | |
| model=genai.GenerativeModel('gemini-pro-vision') | |
| response = model.generate_content([input_prompt,image[0]]) | |
| return response.text | |
| def input_image_setup(uploaded_file): | |
| if uploaded_file is not None: | |
| bytes_data = uploaded_file.getvalue() | |
| image_parts = [{'mime_type':uploaded_file.type, | |
| 'data':bytes_data}] | |
| return image_parts | |
| else: | |
| raise FileNotFoundError('No File Uploaded') | |
| st.header('Description d une image') | |
| st.write("<hr>", unsafe_allow_html=True) | |
| uploaded_file = st.file_uploader('Choose an image.',type=['jpg','jpeg','png']) | |
| if uploaded_file is not None: | |
| image=Image.open(uploaded_file) | |
| st.image(image,caption="uploaded_file",use_column_width=True) | |
| st.write("<hr>", unsafe_allow_html=True) | |
| submit=st.button('Decrire') | |
| input_prompt=""" | |
| Decrire l'image | |
| """ | |
| if submit: | |
| if uploaded_file is not None: | |
| image_data = input_image_setup(uploaded_file) | |
| response = get_gemini_response(input_prompt,image_data) | |
| st.subheader('La description de l\'image est : ') | |
| st.markdown( | |
| f"<div style='font-size: 18px; border-radius: 10px; border: 2px solid #777777;; padding: 20px; line-height: 1.7;'>{response}</div>", | |
| unsafe_allow_html=True ) | |
| else: | |
| st.error("Veuillez entrer une image en entrée") | |
| if __name__ == '__main__': | |
| main() | |
| #https://huggingface.co/spaces/DJONG-WANG/projet_tutore |