Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -53,11 +53,14 @@ from dotenv import load_dotenv
|
|
| 53 |
|
| 54 |
load_dotenv()
|
| 55 |
|
|
|
|
|
|
|
|
|
|
| 56 |
class Config:
|
| 57 |
"""Centralisation de la configuration"""
|
| 58 |
-
GROQ_API_KEY = "
|
| 59 |
-
SENDER_EMAIL = "
|
| 60 |
-
SENDER_PASSWORD = "
|
| 61 |
FASTTEXT_MODEL_PATH = "lid.176.bin"
|
| 62 |
import urllib.request
|
| 63 |
urllib.request.urlretrieve('https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.bin', 'lid.176.bin')
|
|
@@ -101,8 +104,8 @@ class PDFGenerator:
|
|
| 101 |
|
| 102 |
class EmailSender:
|
| 103 |
def __init__(self, sender_email: str, sender_password: str):
|
| 104 |
-
self.sender_email = Config.SENDER_EMAIL
|
| 105 |
-
self.sender_password = Config.SENDER_PASSWORD
|
| 106 |
|
| 107 |
def send_email(self, recipient_email: str, subject: str, body: str, pdf_path: str) -> bool:
|
| 108 |
try:
|
|
@@ -130,11 +133,11 @@ class EmailSender:
|
|
| 130 |
class AudioProcessor:
|
| 131 |
def __init__(self, model_name: str, prompt: str = None, chunk_length_ms: int = 300000):
|
| 132 |
self.chunk_length_ms = chunk_length_ms
|
| 133 |
-
self.groq_client = Groq(api_key=Config.GROQ_API_KEY
|
| 134 |
self.llm = ChatGroq(
|
| 135 |
model=model_name,
|
| 136 |
temperature=0,
|
| 137 |
-
api_key=Config.GROQ_API_KEY
|
| 138 |
)
|
| 139 |
self.custom_prompt = prompt
|
| 140 |
self.language_detector = fasttext.load_model(Config.FASTTEXT_MODEL_PATH)
|
|
@@ -158,7 +161,7 @@ class AudioProcessor:
|
|
| 158 |
"""Traduit le texte en français si nécessaire"""
|
| 159 |
try:
|
| 160 |
messages = [
|
| 161 |
-
SystemMessage(content="Vous êtes un traducteur professionnel. Traduisez le texte suivant en français en conservant le format et la structure:"),
|
| 162 |
HumanMessage(content=text)
|
| 163 |
]
|
| 164 |
result = self._make_api_call(messages)
|
|
@@ -211,7 +214,7 @@ class AudioProcessor:
|
|
| 211 |
return ""
|
| 212 |
|
| 213 |
|
| 214 |
-
# Dans la classe AudioProcessor, ajoutez cette méthode :
|
| 215 |
def split_text(self, text: str, max_tokens: int = 4000) -> List[str]:
|
| 216 |
text_splitter = RecursiveCharacterTextSplitter(
|
| 217 |
chunk_size=max_tokens * 4, # Estimation approximative tokens -> caractères
|
|
@@ -819,6 +822,54 @@ def is_valid_email(email: str) -> bool:
|
|
| 819 |
def enhance_main():
|
| 820 |
"""Fonction principale avec gestion des états et des erreurs améliorée"""
|
| 821 |
st.set_page_config(page_title="Multimodal Content Summarizer", page_icon="📝")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 822 |
|
| 823 |
if "audio_processor" not in st.session_state:
|
| 824 |
model_name, custom_prompt = model_selection_sidebar()
|
|
|
|
| 53 |
|
| 54 |
load_dotenv()
|
| 55 |
|
| 56 |
+
SENDER_EMAIL = os.environ.get('SENDER_EMAIL')
|
| 57 |
+
SENDER_PASSWORD = os.environ.get('SENDER_PASSWORD')
|
| 58 |
+
|
| 59 |
class Config:
|
| 60 |
"""Centralisation de la configuration"""
|
| 61 |
+
#GROQ_API_KEY = ""
|
| 62 |
+
#SENDER_EMAIL = ""
|
| 63 |
+
#SENDER_PASSWORD = ""
|
| 64 |
FASTTEXT_MODEL_PATH = "lid.176.bin"
|
| 65 |
import urllib.request
|
| 66 |
urllib.request.urlretrieve('https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.bin', 'lid.176.bin')
|
|
|
|
| 104 |
|
| 105 |
class EmailSender:
|
| 106 |
def __init__(self, sender_email: str, sender_password: str):
|
| 107 |
+
self.sender_email = SENDER_EMAIL # or Config.SENDER_EMAIL
|
| 108 |
+
self.sender_password = SENDER_PASSWORD # or Config.SENDER_PASSWORD
|
| 109 |
|
| 110 |
def send_email(self, recipient_email: str, subject: str, body: str, pdf_path: str) -> bool:
|
| 111 |
try:
|
|
|
|
| 133 |
class AudioProcessor:
|
| 134 |
def __init__(self, model_name: str, prompt: str = None, chunk_length_ms: int = 300000):
|
| 135 |
self.chunk_length_ms = chunk_length_ms
|
| 136 |
+
self.groq_client = Groq() #api_key=Config.GROQ_API_KEY
|
| 137 |
self.llm = ChatGroq(
|
| 138 |
model=model_name,
|
| 139 |
temperature=0,
|
| 140 |
+
#api_key=Config.GROQ_API_KEY
|
| 141 |
)
|
| 142 |
self.custom_prompt = prompt
|
| 143 |
self.language_detector = fasttext.load_model(Config.FASTTEXT_MODEL_PATH)
|
|
|
|
| 161 |
"""Traduit le texte en français si nécessaire"""
|
| 162 |
try:
|
| 163 |
messages = [
|
| 164 |
+
SystemMessage(content="Vous êtes un traducteur professionnel agréé en Français. Traduisez le texte suivant en français en conservant le format et la structure:"),
|
| 165 |
HumanMessage(content=text)
|
| 166 |
]
|
| 167 |
result = self._make_api_call(messages)
|
|
|
|
| 214 |
return ""
|
| 215 |
|
| 216 |
|
| 217 |
+
# Dans la classe AudioProcessor, ajoutez cette méthode :
|
| 218 |
def split_text(self, text: str, max_tokens: int = 4000) -> List[str]:
|
| 219 |
text_splitter = RecursiveCharacterTextSplitter(
|
| 220 |
chunk_size=max_tokens * 4, # Estimation approximative tokens -> caractères
|
|
|
|
| 822 |
def enhance_main():
|
| 823 |
"""Fonction principale avec gestion des états et des erreurs améliorée"""
|
| 824 |
st.set_page_config(page_title="Multimodal Content Summarizer", page_icon="📝")
|
| 825 |
+
|
| 826 |
+
# Titre de l'application
|
| 827 |
+
st.title("🧠 **MultiModal Genius - Résumé Intelligent de Contenus Multimédias**")
|
| 828 |
+
st.subheader("Transformez vidéos, audios, textes, pages webs et plus en résumés clairs et percutants grâce à la puissance de l'IA")
|
| 829 |
+
|
| 830 |
+
with st.expander("Notice d'utilisation 📜"):
|
| 831 |
+
st.markdown("""
|
| 832 |
+
## **Bienvenue dans l'application MultiModal Genius !** 🎉
|
| 833 |
+
Cette application exploite la puissance de l'IA pour résumer des contenus multimédias variés, tels que des **documents**, **vidéos YouTube**, **audios**, **pages web**, et bien plus encore ! 🧠✨
|
| 834 |
+
|
| 835 |
+
### **Comment utiliser l'application ?**
|
| 836 |
+
1. **Documents** 📄 :
|
| 837 |
+
- **Formats supportés** : `.pdf`, `.docx`, `.pptx`
|
| 838 |
+
- Chargez un document via le bouton **"Télécharger un fichier"**.
|
| 839 |
+
- ⚠️ **Remarque** : Les documents contenant plus de **10 pages** peuvent entraîner des résultats imprécis en raison des limitations des modèles d'IA.
|
| 840 |
+
|
| 841 |
+
2. **Vidéos YouTube** 📹 :
|
| 842 |
+
- Collez simplement l'URL de la vidéo.
|
| 843 |
+
- La vidéo est automatiquement découpée en segments pour une analyse et un résumé précis.
|
| 844 |
+
- **Durée du traitement** : Plus la vidéo est longue, plus le traitement peut prendre du temps.
|
| 845 |
+
|
| 846 |
+
3. **Audios** 🎵 :
|
| 847 |
+
- Téléchargez un fichier audio au format `.mp3`.
|
| 848 |
+
- L'audio sera transcrit par blocs (chunks) avant d'être résumé.
|
| 849 |
+
- ⚠️ **Remarque** : Les fichiers audio de grande taille peuvent rallonger le processus.
|
| 850 |
+
|
| 851 |
+
4. **Pages Web** 🌐 :
|
| 852 |
+
- Fournissez l'URL de la page.
|
| 853 |
+
- Le contenu textuel sera extrait, découpé en blocs, puis résumé.
|
| 854 |
+
|
| 855 |
+
### **Pourquoi le résumé peut être long ?**
|
| 856 |
+
- **Traitement volumineux** : Les contenus trop longs ou complexes nécessitent un découpage en plusieurs blocs (chunks). Ces blocs sont analysés et traduits avant d'être rassemblés pour un résumé final.
|
| 857 |
+
- **Limites des modèles IA** : Certains contenus trop volumineux peuvent provoquer des hallucinations du modèle (résultats incohérents ou incorrects).
|
| 858 |
+
|
| 859 |
+
### **Fonctionnalités à venir 🚀**
|
| 860 |
+
- **Description d'images** 🖼️ : Transformez vos images en descriptions riches et détaillées.
|
| 861 |
+
- **Extraction de données** 📊 : Convertissez vos contenus en **format JSON** structuré.
|
| 862 |
+
- **Amélioration des résumés longs** : Réduction des hallucinations grâce à des optimisations.
|
| 863 |
+
- Et bien plus encore ! 🎯
|
| 864 |
+
|
| 865 |
+
### **Astuce pour une meilleure expérience**
|
| 866 |
+
- **Préférez des contenus courts ou moyennement volumineux** pour des résultats optimaux.
|
| 867 |
+
- En cas de traitement long, un indicateur de progression vous tiendra informé. ⏳
|
| 868 |
+
|
| 869 |
+
### **Nous sommes là pour vous aider !**
|
| 870 |
+
Si vous rencontrez un problème ou avez une suggestion pour améliorer l'application, n'hésitez pas à nous contacter. 🙌
|
| 871 |
+
""")
|
| 872 |
+
|
| 873 |
|
| 874 |
if "audio_processor" not in st.session_state:
|
| 875 |
model_name, custom_prompt = model_selection_sidebar()
|