test / app.py
Spiny's picture
projet vraiment fini
34b4cef
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()