Spaces:
Build error
Build error
File size: 4,993 Bytes
44e79be 04e26ca 1e81f15 f0f9756 34b4cef 44e79be 1e81f15 8c27563 1e81f15 8c27563 1e81f15 34b4cef f0f9756 a51edbb f0f9756 34b4cef f0f9756 34b4cef 1e81f15 34b4cef 1e81f15 f0f9756 34b4cef f0f9756 34b4cef 5a387e8 f0f9756 04e26ca 34b4cef 04e26ca 1e81f15 34b4cef 1e81f15 f0f9756 34b4cef 1828e8d 8c27563 04e26ca 34b4cef |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 |
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() |