Spiny commited on
Commit
34b4cef
·
1 Parent(s): 5a387e8

projet vraiment fini

Browse files
Files changed (2) hide show
  1. app.py +70 -33
  2. 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
- initPrompt = open('prompt.txt', 'r').read()
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
- for diapo in fullDiapoJson:
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 listOfImages, finalText
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="Entrée audio"),
121
  gr.Slider(minimum=1, maximum=5, value=3, step=1, label="Nombre de diapo")
122
  ]
123
 
124
- outputs_image = [
125
- gr.Gallery(type="pil", label="Images des diapos"),
126
- gr.Textbox(label="Texte des diapos", lines=3)
127
  ]
128
 
129
- interface_image = gr.Interface(
130
  fn=Main,
131
  inputs=inputs,
132
- outputs=outputs_image,
133
  title="Projet Diapo",
134
  )
135
 
136
- interface_image.launch()
 
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