Spaces:
Build error
Build error
projet vraiment fini
Browse files- app.py +70 -33
- requirements.txt +2 -1
app.py
CHANGED
|
@@ -6,6 +6,9 @@ from PIL import Image
|
|
| 6 |
from dotenv import load_dotenv
|
| 7 |
from groq import Groq
|
| 8 |
import json
|
|
|
|
|
|
|
|
|
|
| 9 |
|
| 10 |
load_dotenv()
|
| 11 |
|
|
@@ -14,17 +17,7 @@ FLUX1_APIKEY = os.getenv('FLUX1_APIKEY')
|
|
| 14 |
#LLM
|
| 15 |
GEMINI_APIKEY = os.getenv('GEMINI_APIKEY')
|
| 16 |
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
# TODO :
|
| 20 |
-
# - Prendre en entrée soit un texte, soit un fichier audio (empecher saisie de l'un si l'autre est rempli)
|
| 21 |
-
# - Le LLM résume cette entrée en plusieurs axes avec des mots clés par axes
|
| 22 |
-
# - Flux génère une diapo par axé généré par le LLM précédemment
|
| 23 |
-
# - On se retrouve en sortie avec plusieurs diapo et des mots clés les accompagnants
|
| 24 |
-
|
| 25 |
-
def Main(audioFile, nbDiapo):
|
| 26 |
-
finalText = ''
|
| 27 |
-
listOfImages = []
|
| 28 |
|
| 29 |
initPrompt = f'''
|
| 30 |
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.
|
|
@@ -45,21 +38,12 @@ def Main(audioFile, nbDiapo):
|
|
| 45 |
'''
|
| 46 |
|
| 47 |
transcribedText = TranscribeAudio(audioFile)
|
| 48 |
-
print(transcribedText)
|
| 49 |
fullDiapoTxt = GenerateTextLLM(initPrompt + transcribedText)
|
| 50 |
-
print(fullDiapoTxt)
|
| 51 |
fullDiapoJson = json.loads(fullDiapoTxt)
|
| 52 |
|
| 53 |
-
|
| 54 |
-
title = diapo['titre']
|
| 55 |
-
content = diapo['contenu']
|
| 56 |
-
imgPrompt = diapo['image_prompt']
|
| 57 |
-
|
| 58 |
-
finalText += 'Titre : ' + title + '\nContenu : ' + content + '\n\n'
|
| 59 |
-
|
| 60 |
-
listOfImages.append(GenerateImageFromText(imgPrompt))
|
| 61 |
|
| 62 |
-
return
|
| 63 |
|
| 64 |
def GenerateImageFromText(prompt):
|
| 65 |
API_URL = "https://api-inference.huggingface.co/models/black-forest-labs/FLUX.1-dev"
|
|
@@ -74,7 +58,7 @@ def GenerateImageFromText(prompt):
|
|
| 74 |
})
|
| 75 |
image = Image.open(io.BytesIO(image_bytes))
|
| 76 |
|
| 77 |
-
return image
|
| 78 |
|
| 79 |
def GenerateTextLLM(inputText):
|
| 80 |
|
|
@@ -103,8 +87,6 @@ def GenerateTextLLM(inputText):
|
|
| 103 |
|
| 104 |
def TranscribeAudio(filepath):
|
| 105 |
client = Groq()
|
| 106 |
-
print(type(filepath))
|
| 107 |
-
print(filepath)
|
| 108 |
|
| 109 |
with open(filepath, "rb") as file:
|
| 110 |
transcription = client.audio.transcriptions.create(
|
|
@@ -112,25 +94,80 @@ def TranscribeAudio(filepath):
|
|
| 112 |
model="whisper-large-v3",
|
| 113 |
prompt="Specify context or spelling",
|
| 114 |
response_format="json",
|
| 115 |
-
language="fr",
|
| 116 |
)
|
| 117 |
return transcription.text
|
| 118 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 119 |
inputs = [
|
| 120 |
-
gr.Audio(sources='microphone', type='filepath', label="
|
| 121 |
gr.Slider(minimum=1, maximum=5, value=3, step=1, label="Nombre de diapo")
|
| 122 |
]
|
| 123 |
|
| 124 |
-
|
| 125 |
-
gr.
|
| 126 |
-
gr.Textbox(label="Texte des diapos", lines=3)
|
| 127 |
]
|
| 128 |
|
| 129 |
-
|
| 130 |
fn=Main,
|
| 131 |
inputs=inputs,
|
| 132 |
-
outputs=
|
| 133 |
title="Projet Diapo",
|
| 134 |
)
|
| 135 |
|
| 136 |
-
|
|
|
|
| 6 |
from dotenv import load_dotenv
|
| 7 |
from groq import Groq
|
| 8 |
import json
|
| 9 |
+
from pptx import Presentation
|
| 10 |
+
from pptx.util import Inches, Pt
|
| 11 |
+
from pptx.enum.text import PP_ALIGN
|
| 12 |
|
| 13 |
load_dotenv()
|
| 14 |
|
|
|
|
| 17 |
#LLM
|
| 18 |
GEMINI_APIKEY = os.getenv('GEMINI_APIKEY')
|
| 19 |
|
| 20 |
+
def 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.
|
|
|
|
| 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 diapo
|
| 47 |
|
| 48 |
def GenerateImageFromText(prompt):
|
| 49 |
API_URL = "https://api-inference.huggingface.co/models/black-forest-labs/FLUX.1-dev"
|
|
|
|
| 58 |
})
|
| 59 |
image = Image.open(io.BytesIO(image_bytes))
|
| 60 |
|
| 61 |
+
return image
|
| 62 |
|
| 63 |
def GenerateTextLLM(inputText):
|
| 64 |
|
|
|
|
| 87 |
|
| 88 |
def TranscribeAudio(filepath):
|
| 89 |
client = Groq()
|
|
|
|
|
|
|
| 90 |
|
| 91 |
with open(filepath, "rb") as file:
|
| 92 |
transcription = client.audio.transcriptions.create(
|
|
|
|
| 94 |
model="whisper-large-v3",
|
| 95 |
prompt="Specify context or spelling",
|
| 96 |
response_format="json",
|
|
|
|
| 97 |
)
|
| 98 |
return transcription.text
|
| 99 |
|
| 100 |
+
|
| 101 |
+
def 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_frame
|
| 111 |
+
cadre_titre.text = titre
|
| 112 |
+
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_frame
|
| 120 |
+
cadre_texte.word_wrap = True # Retour automatique à la ligne
|
| 121 |
+
cadre_texte.auto_size = True # Ajuste la taille du texte
|
| 122 |
+
|
| 123 |
+
p = cadre_texte.add_paragraph()
|
| 124 |
+
p.text = texte
|
| 125 |
+
p.font.size = Pt(18) # Taille du texte
|
| 126 |
+
p.alignment = PP_ALIGN.LEFT # Aligner le texte à gauche
|
| 127 |
+
|
| 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 |
+
|
| 137 |
+
def 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 filename
|
| 155 |
+
|
| 156 |
+
|
| 157 |
inputs = [
|
| 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 |
|
| 162 |
+
outputs = [
|
| 163 |
+
gr.File(label='Fichier pptx')
|
|
|
|
| 164 |
]
|
| 165 |
|
| 166 |
+
interface = gr.Interface(
|
| 167 |
fn=Main,
|
| 168 |
inputs=inputs,
|
| 169 |
+
outputs=outputs,
|
| 170 |
title="Projet Diapo",
|
| 171 |
)
|
| 172 |
|
| 173 |
+
interface.launch()
|
requirements.txt
CHANGED
|
@@ -2,4 +2,5 @@ pillow
|
|
| 2 |
requests
|
| 3 |
python-dotenv
|
| 4 |
groq
|
| 5 |
-
gradio
|
|
|
|
|
|
| 2 |
requests
|
| 3 |
python-dotenv
|
| 4 |
groq
|
| 5 |
+
gradio
|
| 6 |
+
python-pptx
|