Spiny/test
0
1import gradio as gr2import requests3import os4import io5from PIL import Image6from dotenv import load_dotenv7from groq import Groq8import json9from pptx import Presentation10from pptx.util import Inches, Pt11from pptx.enum.text import PP_ALIGN12 13load_dotenv()14 15#Générateur d'images16FLUX1_APIKEY = os.getenv('FLUX1_APIKEY')17#LLM18GEMINI_APIKEY = os.getenv('GEMINI_APIKEY')19 20def Main(audioFile, nbDiapo) -> int:21 22 initPrompt = f'''23 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.24 Exemple de format de réponse: '''25 26 initPrompt += '''27 [28 {29 "titre": "*Exemple de titre de la diapo 1*",30 "contenu": "*Exemple de contenu de la diapo 1*",31 "image_prompt": "*Prompt d'exemple pour générer une image de context en lien avec la diapo*"32 },33 {34 *pareil pour diapo 2, ect.*35 }36 ]37 ** VOICI LE TEXT : **38 '''39 40 transcribedText = TranscribeAudio(audioFile)41 fullDiapoTxt = GenerateTextLLM(initPrompt + transcribedText)42 fullDiapoJson = json.loads(fullDiapoTxt)43 44 diapo = creer_presentation_multidiapo(fullDiapoJson)45 46 return diapo47 48def GenerateImageFromText(prompt):49 API_URL = "https://api-inference.huggingface.co/models/black-forest-labs/FLUX.1-dev"50 headers = {"Authorization": f"Bearer {FLUX1_APIKEY}"}51 52 def query(payload):53 response = requests.post(API_URL, headers=headers, json=payload)54 return response.content55 56 image_bytes = query({57 "inputs": prompt,58 })59 image = Image.open(io.BytesIO(image_bytes))60 61 return image62 63def GenerateTextLLM(inputText):64 65 url = f'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key={GEMINI_APIKEY}'66 headers = {67 'Content-Type': 'application/json'68 }69 data = {70 "contents": [71 {72 "parts": [73 {74 "text": inputText75 }76 ]77 }78 ]79 }80 81 response = requests.post(url, headers=headers, json=data)82 83 try:84 return response.json()['candidates'][0]['content']['parts'][0]['text']85 except:86 raise Exception("Error :" + response.json())87 88def TranscribeAudio(filepath):89 client = Groq()90 91 with open(filepath, "rb") as file:92 transcription = client.audio.transcriptions.create(93 file=(filepath, file.read()),94 model="whisper-large-v3",95 prompt="Specify context or spelling",96 response_format="json",97 )98 return transcription.text99 100 101def ajouter_diapo(presentation, texte, image_pil, titre=None):102 diapo = presentation.slides.add_slide(presentation.slide_layouts[5])103 104 if titre:105 left = Inches(0.5)106 top = Inches(0.5)107 largeur = Inches(8)108 hauteur = Inches(1)109 zone_titre = diapo.shapes.add_textbox(left, top, largeur, hauteur)110 cadre_titre = zone_titre.text_frame111 cadre_titre.text = titre112 cadre_titre.paragraphs[0].font.size = Pt(24)113 114 left = Inches(0.5)115 top = Inches(1.5)116 largeur = Inches(4)117 hauteur = Inches(4)118 zone_texte = diapo.shapes.add_textbox(left, top, largeur, hauteur)119 cadre_texte = zone_texte.text_frame120 cadre_texte.word_wrap = True # Retour automatique à la ligne121 cadre_texte.auto_size = True # Ajuste la taille du texte122 123 p = cadre_texte.add_paragraph()124 p.text = texte125 p.font.size = Pt(18) # Taille du texte126 p.alignment = PP_ALIGN.LEFT # Aligner le texte à gauche127 128 img_byte_arr = io.BytesIO()129 image_pil.save(img_byte_arr, format='PNG')130 img_byte_arr.seek(0)131 132 left = Inches(5.5)133 top = Inches(1.5)134 largeur_image = Inches(4)135 diapo.shapes.add_picture(img_byte_arr, left, top, width=largeur_image)136 137def creer_presentation_multidiapo(fullDiapoJson):138 presentation = Presentation()139 140 for diapo in fullDiapoJson:141 print('ici')142 title = diapo['titre']143 content = diapo['contenu']144 imgPrompt = diapo['image_prompt']145 146 image = GenerateImageFromText(imgPrompt)147 print('Image généré')148 149 ajouter_diapo(presentation, content, image, title)150 151 filename = 'Presentation.pptx'152 presentation.save(filename)153 154 return filename155 156 157inputs = [158 gr.Audio(sources='microphone', type='filepath', label="Enregistrer un audio"),159 gr.Slider(minimum=1, maximum=5, value=3, step=1, label="Nombre de diapo")160]161 162outputs = [163 gr.File(label='Fichier pptx')164]165 166interface = gr.Interface(167 fn=Main,168 inputs=inputs,169 outputs=outputs,170 title="Projet Diapo",171) 172 173interface.launch()