Spaces:
Sleeping
Sleeping
import gradio as gr | |
import requests | |
import os | |
from io import BytesIO | |
import PyPDF2 | |
from youtube_transcript_api import YouTubeTranscriptApi | |
from huggingface_hub import login, InferenceClient | |
HF_TOKEN = os.getenv("HUGGINGFACE_TOKEN") | |
login(token=HF_TOKEN) | |
client = InferenceClient(token=HF_TOKEN) | |
system_prompt_base = '''Voici le contenu d'un article ou d'une conférence scientifique. Je te demande de réaliser un résumé à destination d'experts à des fins de veille scientifique et technologique. Tu dois réaliser une analyse des principaux apports et tu dois les restituer sous la forme d'un paragraphe qui pourrait accompagner une notice sur ces documents. Tu écris en français avec des phrases courtes et précises.''' | |
def summarizer(text, system_prompt, max_length): | |
model = 'meta-llama/Llama-3.1-70B-Instruct' | |
messages = [ | |
{"role": "system", "content": system_prompt}, | |
{"role": "user", "content": text} | |
] | |
try: | |
response = client.chat_completion( | |
messages=messages, | |
model=model, | |
max_tokens=max_length, | |
) | |
return response["choices"][0]["message"]["content"] | |
except Exception as e: | |
return f"Erreur : {str(e)}" | |
# Fonction pour résumer un article arXiv | |
def summarize_arxiv(arxiv_id, system_prompt, max_length): | |
try: | |
if arxiv_id.startswith('https'): | |
url = arxiv_id | |
else: | |
url = f'https://arxiv.org/pdf/{arxiv_id}.pdf' | |
response = requests.get(url) | |
pdf_file = BytesIO(response.content) | |
reader = PyPDF2.PdfReader(pdf_file) | |
text = "" | |
for page in reader.pages: | |
text += page.extract_text() | |
summary = summarizer(text, system_prompt, max_length) | |
return summary | |
except Exception as e: | |
return f"Erreur : {str(e)}" | |
# Fonction pour résumer une vidéo YouTube | |
def summarize_youtube(video_url, system_prompt, max_length): | |
try: | |
# Extraire l'ID de la vidéo | |
if "watch?v=" in video_url: | |
video_id = video_url.split('watch?v=')[-1] | |
else: | |
video_id = video_url.split('/')[-1] | |
transcript = YouTubeTranscriptApi.get_transcript(video_id, languages=['fr', 'en']) | |
text = " ".join([t['text'] for t in transcript]) | |
summary = summarizer(text, system_prompt, max_length) | |
return summary | |
except Exception as e: | |
return f"Erreur : {str(e)}" | |
# Interface Gradio | |
with gr.Blocks() as demo: | |
gr.Markdown("# Résumé d'articles arXiv et de vidéos YouTube") | |
max_length_slider= gr.Slider( | |
minimum=50, maximum=3000, step=50, value=500, | |
label="Longueur maximale du résumé (tokens)" | |
) | |
system_prompt = gr.Textbox(label="Le prompt système", | |
value=system_prompt_base) | |
with gr.Tab("arXiv"): | |
arxiv_id = gr.Textbox(label="Entrez l'ID arXiv (par ex., 2101.00001)") | |
arxiv_summary = gr.Textbox(label="Résumé") | |
arxiv_button = gr.Button("Résumer") | |
arxiv_button.click(summarize_arxiv, inputs=[arxiv_id, system_prompt, | |
max_length_slider], outputs=arxiv_summary) | |
with gr.Tab("YouTube"): | |
youtube_url = gr.Textbox(label="Entrez l'URL de la vidéo YouTube") | |
youtube_summary = gr.Textbox(label="Résumé") | |
youtube_button = gr.Button("Résumer") | |
youtube_button.click(summarize_youtube, inputs=[youtube_url, | |
system_prompt, | |
max_length_slider], outputs=youtube_summary) | |
demo.launch() | |