cc_nlp / app.py
NchourupouoM's picture
Create app.py
2ef7067 verified
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 <think>...</think>, y compris les balises
cleaned = re.sub(r"<think>.*?</think>", "", 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()