Spaces:
Build error
Build error
| import gradio as gr | |
| import requests | |
| import os | |
| import io | |
| from PIL import Image | |
| from dotenv import load_dotenv | |
| from groq import Groq | |
| import json | |
| from pptx import Presentation | |
| from pptx.util import Inches, Pt | |
| from pptx.enum.text import PP_ALIGN | |
| load_dotenv() | |
| #Générateur d'images | |
| FLUX1_APIKEY = os.getenv('FLUX1_APIKEY') | |
| #LLM | |
| GEMINI_APIKEY = os.getenv('GEMINI_APIKEY') | |
| def Main(audioFile, nbDiapo) -> int: | |
| initPrompt = f''' | |
| Je vais te fournir un texte, il faut faire un résumé du contenu de celui ci sous forme de {nbDiapo} points clé, qui seront utilisé pour un powerpoint (Tu génèrera le titre de la diapo, son contenu texuel, ainsi qu'un prompt pour générer une image de contexte approprié). Tu ne doit répondre uniquement en format JSON sans explications suplémentaire. | |
| Exemple de format de réponse: ''' | |
| initPrompt += ''' | |
| [ | |
| { | |
| "titre": "*Exemple de titre de la diapo 1*", | |
| "contenu": "*Exemple de contenu de la diapo 1*", | |
| "image_prompt": "*Prompt d'exemple pour générer une image de context en lien avec la diapo*" | |
| }, | |
| { | |
| *pareil pour diapo 2, ect.* | |
| } | |
| ] | |
| ** VOICI LE TEXT : ** | |
| ''' | |
| transcribedText = TranscribeAudio(audioFile) | |
| fullDiapoTxt = GenerateTextLLM(initPrompt + transcribedText) | |
| fullDiapoJson = json.loads(fullDiapoTxt) | |
| diapo = creer_presentation_multidiapo(fullDiapoJson) | |
| return diapo | |
| 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 | |
| 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 = { | |
| "contents": [ | |
| { | |
| "parts": [ | |
| { | |
| "text": inputText | |
| } | |
| ] | |
| } | |
| ] | |
| } | |
| response = requests.post(url, headers=headers, json=data) | |
| try: | |
| return response.json()['candidates'][0]['content']['parts'][0]['text'] | |
| except: | |
| raise Exception("Error :" + response.json()) | |
| def TranscribeAudio(filepath): | |
| client = Groq() | |
| with open(filepath, "rb") as file: | |
| transcription = client.audio.transcriptions.create( | |
| file=(filepath, file.read()), | |
| model="whisper-large-v3", | |
| prompt="Specify context or spelling", | |
| response_format="json", | |
| ) | |
| return transcription.text | |
| def ajouter_diapo(presentation, texte, image_pil, titre=None): | |
| diapo = presentation.slides.add_slide(presentation.slide_layouts[5]) | |
| if titre: | |
| left = Inches(0.5) | |
| top = Inches(0.5) | |
| largeur = Inches(8) | |
| hauteur = Inches(1) | |
| zone_titre = diapo.shapes.add_textbox(left, top, largeur, hauteur) | |
| cadre_titre = zone_titre.text_frame | |
| cadre_titre.text = titre | |
| cadre_titre.paragraphs[0].font.size = Pt(24) | |
| left = Inches(0.5) | |
| top = Inches(1.5) | |
| largeur = Inches(4) | |
| hauteur = Inches(4) | |
| zone_texte = diapo.shapes.add_textbox(left, top, largeur, hauteur) | |
| cadre_texte = zone_texte.text_frame | |
| cadre_texte.word_wrap = True # Retour automatique à la ligne | |
| cadre_texte.auto_size = True # Ajuste la taille du texte | |
| p = cadre_texte.add_paragraph() | |
| p.text = texte | |
| p.font.size = Pt(18) # Taille du texte | |
| p.alignment = PP_ALIGN.LEFT # Aligner le texte à gauche | |
| img_byte_arr = io.BytesIO() | |
| image_pil.save(img_byte_arr, format='PNG') | |
| img_byte_arr.seek(0) | |
| left = Inches(5.5) | |
| top = Inches(1.5) | |
| largeur_image = Inches(4) | |
| diapo.shapes.add_picture(img_byte_arr, left, top, width=largeur_image) | |
| def creer_presentation_multidiapo(fullDiapoJson): | |
| presentation = Presentation() | |
| for diapo in fullDiapoJson: | |
| print('ici') | |
| title = diapo['titre'] | |
| content = diapo['contenu'] | |
| imgPrompt = diapo['image_prompt'] | |
| image = GenerateImageFromText(imgPrompt) | |
| print('Image généré') | |
| ajouter_diapo(presentation, content, image, title) | |
| filename = 'Presentation.pptx' | |
| presentation.save(filename) | |
| return filename | |
| inputs = [ | |
| gr.Audio(sources='microphone', type='filepath', label="Enregistrer un audio"), | |
| gr.Slider(minimum=1, maximum=5, value=3, step=1, label="Nombre de diapo") | |
| ] | |
| outputs = [ | |
| gr.File(label='Fichier pptx') | |
| ] | |
| interface = gr.Interface( | |
| fn=Main, | |
| inputs=inputs, | |
| outputs=outputs, | |
| title="Projet Diapo", | |
| ) | |
| interface.launch() |