import streamlit as st import requests import re # --- Configuration regex pour le token Hugging Face --- TOKEN_REGEX = r"^hf_[a-zA-Z0-9]{32,}$" def is_token_valid(token): return re.match(TOKEN_REGEX, token) is not None, token # --- Page de login --- def login(): st.title("🔐 Authentification par Token Hugging Face") token = st.text_input("Entrez votre token Hugging Face", type="password") if st.button("Se connecter"): if is_token_valid(token): st.session_state["auth"] = True st.session_state["token"] = token st.success("Connexion rĂ©ussie ✅") st.rerun() else: st.error("Token Hugging Face invalide ❌") # --- Application principale --- def run_app(): st.set_page_config(page_title="nlp", layout="wide") st.title("CC NATURAL LANGUAGE PROCESSING") st.markdown("Une application d'IA qui vous permet d'effectuer les taches comme la traduction, la generation de text et \n la generation de l'audio a partir d'un texte saisir par l'utilisateur, testez les en navigant sur les boutons ci-dessous.") image_path = "keyce_logo.jpeg" # Affichage dans la sidebar st.sidebar.image(image_path, caption="Keyce informatique et intelligence artificielle", use_container_width=True) # --- Variables dynamiques avec token utilisateur --- token = st.session_state["token"] headers = {"Authorization": f"Bearer {token}"} # client = InferenceClient( # provider="fireworks-ai", # api_key=headers, # ) TTS_API_URL = "https://api-inference.huggingface.co/models/facebook/mms-tts-fra" API_URL_HELSINKI = "https://api-inference.huggingface.co/models/Helsinki-NLP/opus-mt-de-es" # --- Fonctions --- def generer_audio(api_url, texte): payload = {"inputs": texte} response = requests.post(api_url, headers=headers, json=payload) if response.status_code == 200: return response.content else: return None def traduire_libretranslate(texte, source="de", cible="es"): url = "https://libretranslate.de/translate" payload = { "q": texte, "source": source, "target": cible, "format": "text" } headers_local = { "Content-Type": "application/json" } try: response = requests.post(url, json=payload, headers=headers_local, timeout=10) response.raise_for_status() return response.json() except requests.exceptions.ConnectTimeout: return {"error": "Connexion Ă  l'API expirĂ©e."} except requests.exceptions.RequestException as e: return {"error": str(e)} def generer_texte_deepseek(prompt): try: response = client.chat.completions.create( model="deepseek-ai/DeepSeek-R1", messages=[{"role": "user", "content": prompt}], max_tokens=512, ) # AccĂ©der au texte gĂ©nĂ©rĂ© dans la structure de rĂ©ponse # generated_text = response return response.choices[0].message except Exception as e: st.error(f"Erreur lors de la gĂ©nĂ©ration du texte : {e}") return None import re def nettoyer_reponse(text): # Supprimer tout ce qui est entre ..., y compris les balises cleaned = re.sub(r".*?", "", text, flags=re.DOTALL) return cleaned.strip() # --- Interface principale avec tabs --- tab1, tab2, tab3 = st.tabs(["ModĂšle texte to audio 🔊", "ModĂšle de traduction 🌐 `Allemand -> Espagnole`", "ModĂšle de gĂ©nĂ©ration de texte 📝 `Avec deepSeek`"]) with tab1: st.subheader("ModĂšle Text-to-Audio") texte_fr = st.text_area("Entrez votre texte en français :", key="texte_fr") if st.button("Lire audio"): if not texte_fr.strip(): st.warning("Veuillez entrer un texte.") else: audio_fr = generer_audio(TTS_API_URL, texte_fr) if audio_fr: st.audio(audio_fr, format="audio/wav") else: st.error("Erreur lors de la gĂ©nĂ©ration audio.") with tab2: st.subheader("ModĂšle de traduction") texte_to_tr = st.text_area("Entrez votre texte Ă  traduire :", key="texte_to_tr") if st.button("Traduire"): if not texte_to_tr.strip(): st.warning("Veuillez entrer un texte Ă  traduire.") else: with st.spinner("Traduction en cours..."): from huggingface_hub import InferenceClient client2 = InferenceClient( provider="hf-inference", api_key=token, ) result = client2.translation( text= texte_to_tr, src_lang= 'de_DE', tgt_lang='es_XX', model="facebook/mbart-large-50-many-to-many-mmt", ) if "error" in result: st.error(result['error']) else: translated_text = result["translation_text"] st.success("Traduction espagnole :") st.write(f"📝 {translated_text}") with tab3: st.subheader("ModĂšle de GĂ©nĂ©rateur de texte (DeepSeek) 📝") prompt = st.text_area("Entrez votre prompt :", key="prompt") if st.button("GĂ©nĂ©rer", key="gen"): if prompt.strip(): with st.spinner("GĂ©nĂ©ration..."): try: from huggingface_hub import InferenceClient client = InferenceClient( provider="fireworks-ai", api_key=token, ) completion = client.chat.completions.create( model="deepseek-ai/DeepSeek-R1", messages=[ { "role": "user", "content": prompt } ], max_tokens=512, ) output = nettoyer_reponse(completion.choices[0].message.content) st.success("Texte gĂ©nĂ©rĂ© :") st.write(output) except Exception as e: st.error(f"Erreur : {e}") else: st.warning("Veuillez entrer un prompt.") st.markdown("---") st.sidebar.markdown("---") st.sidebar.markdown(" ") st.sidebar.markdown(" ") st.sidebar.text("Cliquez sur ce bouton pour vous deconnecter") if st.sidebar.button("Se dĂ©connecter"): st.session_state.clear() st.rerun() # --- Lancement logique --- if "auth" not in st.session_state: st.session_state["auth"] = False if not st.session_state["auth"]: login() else: run_app()