|
|
import os
|
|
|
import re
|
|
|
import time
|
|
|
from dotenv import load_dotenv
|
|
|
import streamlit as st
|
|
|
from gtts import gTTS
|
|
|
import PyPDF2
|
|
|
import google.generativeai as genai
|
|
|
import speech_recognition as sr
|
|
|
|
|
|
|
|
|
load_dotenv()
|
|
|
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
|
|
|
|
|
|
|
|
|
if "generated_questions" not in st.session_state:
|
|
|
st.session_state["generated_questions"] = []
|
|
|
if "current_question_index" not in st.session_state:
|
|
|
st.session_state["current_question_index"] = 0
|
|
|
if "answers" not in st.session_state:
|
|
|
st.session_state["answers"] = []
|
|
|
if "evaluation_feedback" not in st.session_state:
|
|
|
st.session_state["evaluation_feedback"] = ""
|
|
|
if "overall_score" not in st.session_state:
|
|
|
st.session_state["overall_score"] = 0
|
|
|
if "percentage_score" not in st.session_state:
|
|
|
st.session_state["percentage_score"] = 0
|
|
|
if "is_recording" not in st.session_state:
|
|
|
st.session_state["is_recording"] = False
|
|
|
if "question_played" not in st.session_state:
|
|
|
st.session_state["question_played"] = False
|
|
|
|
|
|
|
|
|
def extract_pdf_text(uploaded_file):
|
|
|
pdf_reader = PyPDF2.PdfReader(uploaded_file)
|
|
|
text = ''.join(page.extract_text() or "" for page in pdf_reader.pages)
|
|
|
return text.strip()
|
|
|
|
|
|
|
|
|
def get_questions(prompt, input_text, num_questions=3):
|
|
|
model = genai.GenerativeModel('gemini-1.5-pro-latest')
|
|
|
response = model.generate_content([prompt, input_text])
|
|
|
questions = [q.strip("* ") for q in response.text.strip().split("\n") if q.strip() and "question" not in q.lower()]
|
|
|
return questions[:num_questions]
|
|
|
|
|
|
|
|
|
def evaluate_answers():
|
|
|
model = genai.GenerativeModel('gemini-1.5-pro-latest')
|
|
|
|
|
|
prompt = """
|
|
|
You are an expert interview evaluator. Assess the responses based on:
|
|
|
- Conceptual Understanding
|
|
|
- Communication Skills
|
|
|
- Clarity & Depth of Explanation
|
|
|
- Use of Real-World Examples
|
|
|
- Logical Flow
|
|
|
|
|
|
Provide an evaluation summary with a score out of 10.
|
|
|
|
|
|
Format:
|
|
|
**Overall Score:** x/10
|
|
|
**Evaluation Summary:**
|
|
|
- Concept Understanding: ...
|
|
|
- Communication: ...
|
|
|
- Depth of Explanation: ...
|
|
|
- Examples: ...
|
|
|
- Logical Flow: ...
|
|
|
"""
|
|
|
|
|
|
candidate_responses = "\n\n".join(
|
|
|
[f"Q: {entry['question']}\nA: {entry['response']}" for entry in st.session_state["answers"]]
|
|
|
)
|
|
|
|
|
|
full_prompt = f"{prompt}\n\nCandidate Responses:\n{candidate_responses}"
|
|
|
response = model.generate_content(full_prompt)
|
|
|
|
|
|
st.session_state["evaluation_feedback"] = response.text.strip()
|
|
|
|
|
|
score_match = re.search(r"\*\*Overall Score:\*\* (\d+)/10", response.text)
|
|
|
if score_match:
|
|
|
st.session_state["overall_score"] = int(score_match.group(1))
|
|
|
st.session_state["percentage_score"] = st.session_state["overall_score"] * 10
|
|
|
else:
|
|
|
st.session_state["overall_score"] = 0
|
|
|
st.session_state["percentage_score"] = 0
|
|
|
|
|
|
|
|
|
def speak_question(question):
|
|
|
if not st.session_state["question_played"]:
|
|
|
tts = gTTS(text=question, lang="en")
|
|
|
tts.save("question.mp3")
|
|
|
st.audio("question.mp3", format="audio/mp3", autoplay=True)
|
|
|
st.session_state["question_played"] = True
|
|
|
|
|
|
|
|
|
st.set_page_config(page_title="🔥🎯 GrillMaster", layout="wide")
|
|
|
st.sidebar.header("🔥🎯 Imarticus GrillMaster")
|
|
|
|
|
|
num_questions = st.sidebar.slider("Number of Questions:", 1, 10, 3)
|
|
|
difficulty_level = st.sidebar.selectbox("Select Difficulty Level:", ["Beginner", "Intermediate", "Advance"])
|
|
|
section_choice = st.sidebar.radio("Choose Input Type:", ("Resume", "Job Description", "Skills"))
|
|
|
|
|
|
input_text = ""
|
|
|
if section_choice == "Resume":
|
|
|
uploaded_file = st.sidebar.file_uploader("Upload Resume:", type=["pdf", "txt"])
|
|
|
if uploaded_file:
|
|
|
input_text = extract_pdf_text(uploaded_file)
|
|
|
elif section_choice == "Job Description":
|
|
|
input_text = st.sidebar.text_area("Paste Job Description:")
|
|
|
elif section_choice == "Skills":
|
|
|
input_text = st.sidebar.selectbox("Select a Skill:", ["Python", "SQL", "Machine Learning", "Statistics", "Business Analytics"])
|
|
|
|
|
|
if st.sidebar.button("Generate Questions"):
|
|
|
prompt =f"""
|
|
|
You are a trainer conducting a beginner-level mock interview.
|
|
|
Ask {num_questions} direct and fundamental questions related to {input_text}.
|
|
|
Keep them concise and focused on key concepts, similar to:
|
|
|
- Difference between DDL and DML
|
|
|
- Types of Joins in SQL
|
|
|
- Primary Key vs Foreign Key
|
|
|
- Loops in Python
|
|
|
|
|
|
Ensure the questions are clear, to the point, and suitable for a {difficulty_level} level interview.
|
|
|
"""
|
|
|
|
|
|
st.session_state["generated_questions"] = get_questions(prompt, input_text, num_questions)
|
|
|
st.session_state["current_question_index"] = 0
|
|
|
st.session_state["answers"] = []
|
|
|
st.session_state["evaluation_feedback"] = ""
|
|
|
st.session_state["question_played"] = False
|
|
|
st.rerun()
|
|
|
|
|
|
|
|
|
if st.session_state["generated_questions"]:
|
|
|
q_index = st.session_state["current_question_index"]
|
|
|
|
|
|
if q_index < len(st.session_state["generated_questions"]):
|
|
|
question = st.session_state["generated_questions"][q_index]
|
|
|
|
|
|
|
|
|
st.write(f"**{question}**", unsafe_allow_html=True)
|
|
|
|
|
|
speak_question(question)
|
|
|
|
|
|
recognizer = sr.Recognizer()
|
|
|
|
|
|
if st.button("Start Recording"):
|
|
|
st.session_state["is_recording"] = True
|
|
|
with sr.Microphone() as source:
|
|
|
st.write("🎤 Listening... Speak your answer.")
|
|
|
try:
|
|
|
audio = recognizer.listen(source, timeout=60)
|
|
|
response_text = recognizer.recognize_google(audio)
|
|
|
st.session_state["answers"].append({"question": question, "response": response_text})
|
|
|
st.session_state["is_recording"] = False
|
|
|
except sr.UnknownValueError:
|
|
|
st.write("Could not understand the audio. Try again.")
|
|
|
|
|
|
if st.button("Stop Recording"):
|
|
|
st.session_state["is_recording"] = False
|
|
|
|
|
|
if st.button("➡️ Next Question"):
|
|
|
st.session_state["current_question_index"] += 1
|
|
|
st.session_state["question_played"] = False
|
|
|
st.rerun()
|
|
|
else:
|
|
|
evaluate_answers()
|
|
|
|
|
|
st.subheader("📊 Complete Mock Interview Summary")
|
|
|
st.write(f"**Overall Score:** {st.session_state['overall_score']} / 10")
|
|
|
st.write(f"**Percentage Score:** {st.session_state['percentage_score']:.2f}%")
|
|
|
st.progress(st.session_state["percentage_score"] / 100)
|
|
|
st.write(st.session_state["evaluation_feedback"], unsafe_allow_html=True)
|
|
|
|