CoolFace
Apppublic

Spiny/test

sourceHugging Facewtfplupdated 2y agoView on Hugging Face
0likes
app.py173 linesDownload Raw Back to root
1import gradio as gr2import requests3import os4import io5from PIL import Image6from dotenv import load_dotenv7from groq import Groq8import json9from pptx import Presentation10from pptx.util import Inches, Pt11from pptx.enum.text import PP_ALIGN12 13load_dotenv()14 15#Générateur d'images16FLUX1_APIKEY = os.getenv('FLUX1_APIKEY')17#LLM18GEMINI_APIKEY = os.getenv('GEMINI_APIKEY')19 20def 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.24        Exemple de format de réponse: '''25 26    initPrompt += '''27        [28            {29                "titre": "*Exemple de titre de la diapo 1*",30                "contenu": "*Exemple de contenu de la diapo 1*",31                "image_prompt": "*Prompt d'exemple pour générer une image de context en lien avec la diapo*"32            },33            {34                *pareil pour diapo 2, ect.*35            }36        ]37        ** VOICI LE TEXT : **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 diapo47 48def GenerateImageFromText(prompt):49    API_URL = "https://api-inference.huggingface.co/models/black-forest-labs/FLUX.1-dev"50    headers = {"Authorization": f"Bearer {FLUX1_APIKEY}"}51 52    def query(payload):53        response = requests.post(API_URL, headers=headers, json=payload)54        return response.content55 56    image_bytes = query({57        "inputs": prompt,58    })59    image = Image.open(io.BytesIO(image_bytes))60 61    return image62 63def GenerateTextLLM(inputText):64    65    url = f'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key={GEMINI_APIKEY}'66    headers = {67        'Content-Type': 'application/json'68    }69    data = {70        "contents": [71            {72                "parts": [73                    {74                        "text": inputText75                    }76                ]77            }78        ]79    }80 81    response = requests.post(url, headers=headers, json=data)82 83    try:84        return response.json()['candidates'][0]['content']['parts'][0]['text']85    except:86        raise Exception("Error :" + response.json())87 88def 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        )98        return transcription.text99 100 101def 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_frame111        cadre_titre.text = titre112        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_frame120    cadre_texte.word_wrap = True  # Retour automatique à la ligne121    cadre_texte.auto_size = True  # Ajuste la taille du texte122 123    p = cadre_texte.add_paragraph()124    p.text = texte125    p.font.size = Pt(18)  # Taille du texte126    p.alignment = PP_ALIGN.LEFT  # Aligner le texte à gauche127 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 137def 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 filename155 156 157inputs = [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 162outputs = [163    gr.File(label='Fichier pptx')164]165 166interface = gr.Interface(167    fn=Main,168    inputs=inputs,169    outputs=outputs,170    title="Projet Diapo",171) 172 173interface.launch()