Spaces:
Build error
Build error
App finale probablement
Browse files- app.py +48 -9
- prompt.txt +14 -0
- requirements.txt +2 -1
app.py
CHANGED
|
@@ -4,6 +4,8 @@ import os
|
|
| 4 |
import io
|
| 5 |
from PIL import Image
|
| 6 |
from dotenv import load_dotenv
|
|
|
|
|
|
|
| 7 |
|
| 8 |
load_dotenv()
|
| 9 |
|
|
@@ -12,14 +14,36 @@ FLUX1_APIKEY = os.getenv('FLUX1_APIKEY')
|
|
| 12 |
#LLM
|
| 13 |
GEMINI_APIKEY = os.getenv('GEMINI_APIKEY')
|
| 14 |
|
|
|
|
|
|
|
| 15 |
# TODO :
|
| 16 |
# - Prendre en entrée soit un texte, soit un fichier audio (empecher saisie de l'un si l'autre est rempli)
|
| 17 |
# - Le LLM résume cette entrée en plusieurs axes avec des mots clés par axes
|
| 18 |
# - Flux génère une diapo par axé généré par le LLM précédemment
|
| 19 |
# - On se retrouve en sortie avec plusieurs diapo et des mots clés les accompagnants
|
| 20 |
|
| 21 |
-
def Main(prompt, inputText):
|
| 22 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
|
| 24 |
def GenerateImageFromText(prompt):
|
| 25 |
API_URL = "https://api-inference.huggingface.co/models/black-forest-labs/FLUX.1-dev"
|
|
@@ -34,7 +58,7 @@ def GenerateImageFromText(prompt):
|
|
| 34 |
})
|
| 35 |
image = Image.open(io.BytesIO(image_bytes))
|
| 36 |
|
| 37 |
-
return
|
| 38 |
|
| 39 |
def GenerateTextLLM(inputText):
|
| 40 |
|
|
@@ -59,20 +83,35 @@ def GenerateTextLLM(inputText):
|
|
| 59 |
try:
|
| 60 |
return response.json()['candidates'][0]['content']['parts'][0]['text']
|
| 61 |
except:
|
| 62 |
-
|
| 63 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 64 |
|
| 65 |
outputs_image = [
|
| 66 |
-
gr.
|
| 67 |
"text"
|
| 68 |
]
|
| 69 |
|
| 70 |
interface_image = gr.Interface(
|
| 71 |
fn=Main,
|
| 72 |
-
inputs=
|
| 73 |
outputs=outputs_image,
|
| 74 |
title="Feur",
|
| 75 |
)
|
| 76 |
|
| 77 |
-
interface_image.launch()
|
| 78 |
-
|
|
|
|
| 4 |
import io
|
| 5 |
from PIL import Image
|
| 6 |
from dotenv import load_dotenv
|
| 7 |
+
from groq import Groq
|
| 8 |
+
import json
|
| 9 |
|
| 10 |
load_dotenv()
|
| 11 |
|
|
|
|
| 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(prompt, inputText, audioFile):
|
| 26 |
+
finalText = ''
|
| 27 |
+
listOfImages = []
|
| 28 |
+
|
| 29 |
+
import json
|
| 30 |
+
|
| 31 |
+
transcribedText = TranscribeAudio(audioFile)
|
| 32 |
+
print(transcribedText)
|
| 33 |
+
fullDiapoTxt = GenerateTextLLM(initPrompt + transcribedText)
|
| 34 |
+
print(fullDiapoTxt)
|
| 35 |
+
fullDiapoJson = json.loads(fullDiapoTxt)
|
| 36 |
+
|
| 37 |
+
for diapo in fullDiapoJson:
|
| 38 |
+
title = diapo['titre']
|
| 39 |
+
content = diapo['contenu']
|
| 40 |
+
imgPrompt = diapo['image_prompt']
|
| 41 |
+
|
| 42 |
+
finalText += 'Titre : ' + title + '\nContenu : ' + content + '\n\n'
|
| 43 |
+
|
| 44 |
+
listOfImages.append(GenerateImageFromText(imgPrompt))
|
| 45 |
+
|
| 46 |
+
return listOfImages, finalText
|
| 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 |
|
|
|
|
| 83 |
try:
|
| 84 |
return response.json()['candidates'][0]['content']['parts'][0]['text']
|
| 85 |
except:
|
| 86 |
+
raise Exception("Error :" + response.json())
|
| 87 |
+
|
| 88 |
+
def 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 |
+
language="fr",
|
| 98 |
+
)
|
| 99 |
+
return transcription.text
|
| 100 |
+
|
| 101 |
+
inputs = [
|
| 102 |
+
gr.Audio(sources='microphone', type='filepath', label="Fichier audio")
|
| 103 |
+
]
|
| 104 |
|
| 105 |
outputs_image = [
|
| 106 |
+
gr.Gallery(type="pil", label="Output Image"),
|
| 107 |
"text"
|
| 108 |
]
|
| 109 |
|
| 110 |
interface_image = gr.Interface(
|
| 111 |
fn=Main,
|
| 112 |
+
inputs=inputs,
|
| 113 |
outputs=outputs_image,
|
| 114 |
title="Feur",
|
| 115 |
)
|
| 116 |
|
| 117 |
+
interface_image.launch()
|
|
|
prompt.txt
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Je vais te fournir un texte, il faut faire un résumé du contenu de celui ci sous forme de 3 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.
|
| 2 |
+
Exemple de format de réponse:
|
| 3 |
+
[
|
| 4 |
+
{
|
| 5 |
+
"titre": "*Exemple de titre de la diapo 1*",
|
| 6 |
+
"contenu": "*Exemple de contenu de la diapo 1*",
|
| 7 |
+
"image_prompt": "*Prompt d'exemple pour générer une image de context en lien avec la diapo*"
|
| 8 |
+
},
|
| 9 |
+
{
|
| 10 |
+
*pareil pour diapo 2, ect.*
|
| 11 |
+
}
|
| 12 |
+
]
|
| 13 |
+
** VOICI LE TEXT : **
|
| 14 |
+
|
requirements.txt
CHANGED
|
@@ -46,4 +46,5 @@ thop>=0.1.1 # FLOPs computation
|
|
| 46 |
# HUB -----------------------------------------
|
| 47 |
GitPython>=3.1.24
|
| 48 |
|
| 49 |
-
python-dotenv
|
|
|
|
|
|
| 46 |
# HUB -----------------------------------------
|
| 47 |
GitPython>=3.1.24
|
| 48 |
|
| 49 |
+
python-dotenv
|
| 50 |
+
groq
|