Spaces:
Sleeping
Sleeping
| from openai import OpenAI | |
| import os | |
| from dotenv import load_dotenv | |
| from youtube_transcript_api import YouTubeTranscriptApi | |
| import random | |
| from classes import LeitnerSystem | |
| # Load environment variables from .env file | |
| load_dotenv() | |
| OpenAI.api_key = os.getenv('OPENAI_API_KEY') | |
| client = OpenAI() | |
| # Extraction et pré-traitement de l'information | |
| def extraire_qr_de_chatgpt(reponse_chat_gpt): | |
| """ | |
| Extrait les paires de questions et réponses du texte de réponse ChatGPT. | |
| :param reponse_chat_gpt: Le texte de réponse de ChatGPT contenant des Q/R. | |
| :return: Liste de tuples contenant les paires (question, réponse). | |
| """ | |
| # Séparer le texte en lignes | |
| lignes = reponse_chat_gpt.split('\n\n') # Deux sauts de ligne séparent chaque Q/R | |
| paires_qr = [] | |
| for ligne in lignes: | |
| if ligne.startswith("Q:") and "\nR:" in ligne: | |
| question, reponse = ligne.split("\nR:") | |
| paires_qr.append((question[3:], reponse)) # Supprime 'Q: ' de la question | |
| return paires_qr | |
| def obtenir_transcription(id_youtube): | |
| """ | |
| Obtient la transcription d'une vidéo YouTube à partir de son ID. | |
| """ | |
| try: | |
| result = YouTubeTranscriptApi.get_transcript(id_youtube, languages=["fr"]) | |
| texte_continu = ' '.join([segment['text'] for segment in result]) | |
| # qr = extraire_qr_de_chatgpt(texte_continu) | |
| return texte_continu | |
| except Exception as e: | |
| return str(e) | |
| def decouper_texte_en_segments(texte, longueur_max=2000): | |
| """ | |
| Découpe un texte en segments de taille spécifiée sans couper les mots en deux. | |
| :param texte: Le texte à découper. | |
| :param longueur_max: La longueur maximale de chaque segment. | |
| :return: Une liste de segments de texte. | |
| """ | |
| # Vérifie si le texte est plus court que la longueur maximale | |
| if len(texte) <= longueur_max: | |
| return [texte] | |
| segments = [] | |
| mots = texte.split() | |
| segment_actuel = [] | |
| for mot in mots: | |
| # Vérifie si l'ajout du mot courant dépasse la longueur maximale | |
| if len(' '.join(segment_actuel + [mot])) > longueur_max: | |
| # Si oui, ajoute le segment actuel à la liste des segments et commence un nouveau segment | |
| segments.append(' '.join(segment_actuel)) | |
| segment_actuel = [mot] | |
| else: | |
| # Si non, ajoute le mot au segment actuel | |
| segment_actuel.append(mot) | |
| # Ajoute le dernier segment s'il y a des mots restants | |
| if segment_actuel: | |
| segments.append(' '.join(segment_actuel)) | |
| return segments | |
| # Création de question/réponse | |
| def generer_questions_reponses(texte): | |
| """ | |
| Génère des questions et réponses à partir d'un texte donné en utilisant l'API d'OpenAI. | |
| :param texte: Le texte à partir duquel générer les Q/R. | |
| :return: Texte contenant les questions et réponses. | |
| """ | |
| client = OpenAI() | |
| response = client.chat.completions.create( | |
| model="gpt-4", | |
| messages=[ | |
| { | |
| "role": "system", | |
| "content": | |
| """ | |
| Vous êtes un assistant perspicace capable de générer du contenu éducatif sous forme de question/réponse adapté | |
| à un système de cartes de Leitner. Pour un text donné, tu es capable de générer des questions et des réponses. | |
| Tu es attentif au nombre de question demandée par l'utilisateur | |
| Utilisez un style formel en évitant les textes inutiles. | |
| Les questions commencent par Q: et les réponses sur la ligne suivante par R: | |
| Veuillez garder les réponses sous 10 mots maximum. | |
| """ | |
| }, | |
| { | |
| "role": "user", | |
| "content": f"""Pour un texte donné ci-après, extrait une information éducative pertinente et | |
| résume là sous forme d'une question et d'une réponse très courte pour alimenter | |
| une boîte de Leitner; La réponse ne doit pas dépasser 10 mots; Format de la réponse | |
| : Première ligne Q: ... et deuxième ligne R: ...; Texte à traiter : '{texte}';""" | |
| } | |
| ], | |
| temperature=0.5 # Ajustez ce paramètre selon vos besoins | |
| ) | |
| # print(response.choices[0].message.content) | |
| # paires_qr = extraire_qr_de_chatgpt(response.choices[0].message.content) | |
| # print(paires_qr) | |
| return response.choices[0].message.content | |
| def processus_complet(id_youtube): | |
| """ | |
| Combine l'obtention de la transcription YouTube et la génération de Q/R dans un seul processus. | |
| """ | |
| transcription = obtenir_transcription(id_youtube) | |
| segments = decouper_texte_en_segments(transcription, longueur_max=1000) | |
| qr = generer_questions_reponses(segments[8]) | |
| print(segments[8]) | |
| # paires_qr = extraire_qr_de_chatgpt(qr) | |
| # leitner_system_test = LeitnerSystem() | |
| # result = YouTubeTranscriptApi.get_transcript('d2lJUOv0hLA&t=65s', languages = ["fr"]) | |
| # texte_continu = ' '.join([segment['text'] for segment in result]) # Concaténation de tous les segments de texte en une seule chaîne | |
| # segments = decouper_texte_en_segments(texte_continu, longueur_max=1000) | |
| # paires_qr = extraire_qr_de_chatgpt(generer_questions_reponses(segments[8])) | |
| # for question, reponse in paires_qr: | |
| # leitner_system_test.add_card(question, reponse) | |
| return qr | |
| # Creation/edition/Configuration de la boite de Leitner | |
| def creer_boite_leitner(): | |
| global leitner_system | |
| leitner_system = LeitnerSystem() | |
| return "Boîte de Leitner créée avec succès!" | |
| def ajouter_cartes_leitner(texte_qr): | |
| """ | |
| Extrait les paires de questions-réponses du texte et les ajoute à la boîte de Leitner. | |
| :param texte_qr: Le texte contenant les questions et réponses générées. | |
| :return: Un message confirmant l'ajout des cartes. | |
| """ | |
| if leitner_system is None: | |
| return "Veuillez d'abord créer une boîte de Leitner." | |
| paires_qr = extraire_qr_de_chatgpt(texte_qr) | |
| if not paires_qr: | |
| return "Aucune paire Q/R n'a été trouvée dans le texte." | |
| for question, reponse in paires_qr: | |
| leitner_system.add_card(question, reponse) | |
| return f"{len(paires_qr)} cartes ajoutées à la boîte de Leitner." | |
| # Utilisation et mise à jour de la boite de Leitner | |
| def poser_question(): | |
| global leitner_system | |
| if leitner_system is None or not leitner_system.compartments[0]: | |
| return "Aucune carte disponible pour le quiz.", "" | |
| carte = random.choice(leitner_system.compartments[0]) | |
| leitner_system.derniere_question = carte | |
| return carte['question'], "" | |
| def valider_reponse(user_answer): | |
| global leitner_system | |
| if leitner_system.derniere_question is None: | |
| return "Veuillez d'abord poser une question.", "" | |
| correct_answer = leitner_system.derniere_question['answer'] | |
| # Utilise l'API d'OpenAI pour évaluer la similarité sémantique des réponses | |
| score = leitner_system.compare_semantic_similarity(correct_answer, user_answer) | |
| explanation = leitner_system.compare_semantic_similarity_explanation(correct_answer, user_answer) | |
| # Logique pour déplacer la carte en fonction de la réponse | |
| if float(score) > 5.0: | |
| result = f"Correct! Votre score de similarité : {score}\n{explanation}" | |
| # Déplacer la carte au prochain compartiment ou marquer comme maîtrisée | |
| # Cette partie dépend de la manière dont vous souhaitez gérer la progression dans les compartiments | |
| else: | |
| result = f"Incorrect. Votre score de similarité : {score}\n{explanation}" | |
| # Optionnellement, remettre la carte dans le premier compartiment ou gérer la répétition | |
| return result, "" | |