Ed_quiz / app.py
arjunanand13's picture
Update app.py
a1e5f87 verified
# import gradio as gr
# import google.generativeai as genai
# genai.configure(api_key="AIzaSyBPQF0g5EfEPzEiGRzA3iNzJZK4jDukMvE")
# model = genai.GenerativeModel('gemini-pro')
# def generate_summary_and_quiz(transcript, num_questions):
# """Generate a summary and quiz questions based on the video transcript."""
# prompt = f"""
# Based on the following video lecture transcript, please provide:
# 1. A concise summary of the main points (about 100 words)
# 2. {num_questions} multiple-choice quiz questions to test understanding of key concepts
# Transcript:
# {transcript}
# Format your response as follows:
# Summary:
# [Your summary here]
# Quiz Questions:
# 1. [Question]
# a) [Option A]
# b) [Option B]
# c) [Option C]
# d) [Option D]
# Correct Answer: [Correct option letter]
# 2. [Next question and options...]
# Ensure the questions cover different aspects of the lecture and vary in difficulty.
# """
# try:
# response = model.generate_content(prompt)
# return response.text
# except Exception as e:
# return f"Error generating summary and quiz: {str(e)}"
# def process_lecture(transcript, num_questions):
# with gr.Row():
# gr.Markdown("Generating summary and quiz...")
# result = generate_summary_and_quiz(transcript, num_questions)
# return result
# with gr.Blocks() as demo:
# gr.Markdown("# Video Lecture Summarizer and Quiz Generator")
# transcript_input = gr.Textbox(label="Video Lecture Transcript", lines=10, placeholder="Paste the video transcript or a detailed description of the lecture content here...")
# num_questions = gr.Slider(minimum=1, maximum=10, value=3, step=1, label="Number of Quiz Questions")
# generate_btn = gr.Button("Generate Summary and Quiz")
# output = gr.Textbox(label="Summary and Quiz", lines=20)
# generate_btn.click(process_lecture, inputs=[transcript_input, num_questions], outputs=output)
# if __name__ == "__main__":
# demo.launch()
import gradio as gr
import google.generativeai as genai
import speech_recognition as sr
from pydub import AudioSegment
import os
import tempfile
import moviepy.editor as mp
# Initialize Gemini API
genai.configure(api_key="AIzaSyBPQF0g5EfEPzEiGRzA3iNzJZK4jDukMvE")
# Initialize the Gemini model
model = genai.GenerativeModel('gemini-pro')
def transcribe_video(video_path):
"""Transcribe the audio from a video file."""
try:
# Extract audio from video
video = mp.VideoFileClip(video_path)
audio_path = tempfile.mktemp(suffix=".wav")
video.audio.write_audiofile(audio_path, codec='pcm_s16le')
# Load audio file
audio = AudioSegment.from_wav(audio_path)
# Initialize recognizer
r = sr.Recognizer()
# Split audio into chunks to handle long audio
chunk_length_ms = 30000 # 30 seconds
chunks = [audio[i:i+chunk_length_ms] for i in range(0, len(audio), chunk_length_ms)]
transcript = ""
for i, chunk in enumerate(chunks):
# Export chunk to a temporary file
chunk_path = tempfile.mktemp(suffix=".wav")
chunk.export(chunk_path, format="wav")
# Recognize speech in the chunk
with sr.AudioFile(chunk_path) as source:
audio_listened = r.record(source)
try:
text = r.recognize_google(audio_listened)
transcript += text + " "
except sr.UnknownValueError:
print(f"Could not understand audio in chunk {i+1}")
except sr.RequestError:
print(f"Could not request results from Google Speech Recognition service for chunk {i+1}")
# Clean up temporary chunk file
os.remove(chunk_path)
# Clean up temporary audio file
os.remove(audio_path)
return transcript.strip()
except Exception as e:
return f"Error transcribing video: {str(e)}"
def generate_summary_and_quiz(transcript, num_questions):
"""Generate a summary and quiz questions based on the video transcript."""
prompt = f"""
Based on the following video lecture transcript, please provide:
1. A concise summary of the main points (about 100 words)
2. {num_questions} multiple-choice quiz questions to test understanding of key concepts
Transcript:
{transcript}
Format your response as follows:
Summary:
[Your summary here]
Quiz Questions:
1. [Question]
a) [Option A]
b) [Option B]
c) [Option C]
d) [Option D]
Correct Answer: [Correct option letter]
2. [Next question and options...]
Ensure the questions cover different aspects of the lecture and vary in difficulty.
"""
try:
response = model.generate_content(prompt)
return response.text
except Exception as e:
return f"Error generating summary and quiz: {str(e)}"
def process_video(video, num_questions):
with gr.Row():
gr.Markdown("Processing video and generating summary and quiz...")
with tempfile.NamedTemporaryFile(delete=False, suffix=".mp4") as temp_video:
video.save(temp_video.name)
video_path = temp_video.name
transcript = transcribe_video(video_path)
result = generate_summary_and_quiz(transcript, num_questions)
os.unlink(video_path)
return transcript, result
with gr.Blocks() as demo:
gr.Markdown("# Video Lecture Summarizer and Quiz Generator")
video_input = gr.Video(label="Upload Video Lecture")
num_questions = gr.Slider(minimum=1, maximum=10, value=3, step=1, label="Number of Quiz Questions")
generate_btn = gr.Button("Process Video and Generate Summary and Quiz")
transcript_output = gr.Textbox(label="Video Transcript", lines=10)
summary_quiz_output = gr.Textbox(label="Summary and Quiz", lines=20)
generate_btn.click(
process_video,
inputs=[video_input, num_questions],
outputs=[transcript_output, summary_quiz_output]
)
if __name__ == "__main__":
demo.launch()