Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import requests | |
| import os | |
| import io | |
| from PIL import Image | |
| from dotenv import load_dotenv | |
| from pydub import AudioSegment | |
| from huggingface_hub import InferenceClient | |
| import json | |
| # Charger les variables d'environnement | |
| load_dotenv() | |
| # Générateur d'images | |
| FLUX1_APIKEY = os.getenv('FLUX1_APIKEY') | |
| # LLM | |
| GEMINI_APIKEY = os.getenv('GEMINI_APIKEY') | |
| # Modèle Whisper pour la transcription audio | |
| WHISPER_APIKEY = os.getenv('WHISPER_APIKEY') | |
| def TranscribeAudio(inputAudio): | |
| API_URL = "https://api-inference.huggingface.co/models/openai/whisper-large-v3" | |
| headers = {"Authorization": f"Bearer {WHISPER_APIKEY}"} | |
| def query(filename): | |
| with open(filename, "rb") as f: | |
| data = f.read() | |
| response = requests.post(API_URL, headers=headers, data=data) | |
| return response.json() | |
| output = query(inputAudio) | |
| def GenerateTextLLM(inputText): | |
| url = f'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key={GEMINI_APIKEY}' | |
| headers = { | |
| 'Content-Type': 'application/json' | |
| } | |
| data = { | |
| "prompt": inputText, | |
| "model": "gemini-1.5-flash-latest" | |
| } | |
| try: | |
| response = requests.post(url, headers=headers, json=data) | |
| response.raise_for_status() # Va lancer une exception si la réponse a un statut d'erreur | |
| result = json.loads(response.text) | |
| return result['candidates'][0]['content']['parts'][0]['text'] | |
| except requests.exceptions.RequestException as e: | |
| return f'Error in LLM processing: {e}' | |
| except (KeyError, json.JSONDecodeError) as e: | |
| return f'Error parsing response: {e}' | |
| def GenerateImageFromText(prompt): | |
| API_URL = "https://api-inference.huggingface.co/models/black-forest-labs/FLUX.1-dev" | |
| headers = {"Authorization": f"Bearer {FLUX1_APIKEY}"} | |
| def query(payload): | |
| response = requests.post(API_URL, headers=headers, json=payload) | |
| return response.content | |
| image_bytes = query({"inputs": prompt}) | |
| image = Image.open(io.BytesIO(image_bytes)) | |
| return image | |
| # Fonction principale qui traite soit le texte soit l'audio | |
| def Main(text_input, audio_input): | |
| if text_input: | |
| input_data = text_input | |
| elif audio_input: | |
| input_data = TranscribeAudio(audio_input) | |
| else: | |
| return "Veuillez fournir un texte ou un fichier audio", None | |
| # Générer le résumé du LLM en plusieurs axes | |
| summarized_text = GenerateTextLLM(input_data) | |
| axes = summarized_text.split("\n") # Supposons que le LLM renvoie un texte structuré | |
| # Générer une image pour chaque axe | |
| images = [GenerateImageFromText(axis) for axis in axes if axis] | |
| return images, summarized_text, input_data | |
| # Interface Gradio | |
| inputs = [ | |
| gr.Textbox(label="Texte (laisser vide si audio fourni)", lines=5, placeholder="Entrez votre texte ici..."), | |
| gr.Audio(sources="upload", type="filepath", label="Fichier audio (laisser vide si texte fourni)") | |
| ] | |
| outputs = [ | |
| gr.Gallery(label="Diapositives générées"), | |
| gr.Textbox(label="Résumé en axes"), | |
| "text" | |
| ] | |
| interface = gr.Interface( | |
| fn=Main, | |
| inputs=inputs, | |
| outputs=outputs, | |
| title="Résumé et Génération de Diapositives", | |
| description="Entrez un texte ou un fichier audio, le modèle LLM résumera l'entrée en plusieurs axes avec des mots-clés, et des diapositives seront générées pour chaque axe." | |
| ) | |
| if __name__ == "__main__": | |
| interface.launch() |