File size: 5,919 Bytes
e16e12e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
import gradio as gr
from gtts import gTTS
import tempfile
import os
import pandas as pd
import numpy as np
import faiss
from sentence_transformers import SentenceTransformer
from transformers import pipeline
import whisper
from groq import Groq
# Load data and models
questions = pd.read_csv('non_technical_interview_questions.csv', encoding='unicode_escape')[['Question']]
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
question_embeddings = np.vstack([model.encode(q) for q in questions['Question']])
dimension = question_embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(question_embeddings)
generation_model = pipeline("text2text-generation", model="google/flan-t5-large", num_beams=1)
client = Groq(api_key="GROQ_API_KEY")
# Helper functions
def get_questions(job_title, job_description, top_k=5):
text = f'{job_title}: {job_description}'
text_embedding = model.encode(text).reshape(1, -1)
_, indices = index.search(text_embedding, top_k)
similar_questions = questions.iloc[indices[0]]
return similar_questions['Question'].tolist()
def text_to_speech(question_text):
tts = gTTS(text=question_text, lang='en')
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".mp3")
tts.save(temp_file.name)
return temp_file.name
def audio_to_text(audio_file):
whisper_model = whisper.load_model("base")
result = whisper_model.transcribe(audio_file)
return result['text']
def generate_feedback_from_llm(question, user_answer):
response = client.chat.completions.create(
messages=[
{
"role": "system",
"content": (
"You are an experienced interview coach specializing in preparing candidates for real-world job interviews. "
"Your goal is to provide concise, actionable feedback that helps the user improve their answers quickly. "
"Please focus on the following points: \n"
"1. Strengths: Highlight key strengths in the candidate's answer. Focus on one or two positive aspects (e.g., problem-solving, clear communication). \n"
"2. Areas for Improvement: Mention one or two quick improvements, like being more concise, adding specific examples, or avoiding jargon. \n"
"3. What a Best Answer Looks Like: Provide a brief example of an ideal answer that addresses the same question with clarity and impact. \n"
"4. English Proficiency: Check for major grammar or sentence structure issues and provide quick tips for improvement. \n"
"5. Interview Readines: In one sentence, assess if the answer is ready for a real interview or if it needs a little more refinement. \n"
"6. Quick Tips: Offer practical, quick tips on how to improve the candidate’s overall interview performance. These could include advice on body language, confidence, tone, or other interview techniques.\n"
"Keep your feedback clear and to the point, focusing on the most impactful changes the user can make to improve their interview performance."
"Your feedback should always be respectful, professional, and constructive, focused on preparing the candidate to perform confidently and concisely in real-world job interviews."
)
},
{"role": "user", "content": f"Question: {question}\nAnswer: {user_answer}\n\nProvide feedback on the quality of the answer, noting strengths and suggestions for improvement."}
],
model="llama3-8b-8192",
)
return response.choices[0].message.content
# Gradio app logic
def start_interview(job_title, job_description):
question_queue = get_questions(job_title, job_description)
current_question_index = 0
question_audio = text_to_speech(question_queue[current_question_index])
return question_queue, current_question_index, question_audio
def next_question(question_queue, current_question_index):
current_question_index += 1
if current_question_index < len(question_queue):
question_audio = text_to_speech(question_queue[current_question_index])
else:
question_audio = None
return current_question_index, question_audio
def transcribe_and_feedback(answer_audio, question_audio):
question_text = audio_to_text(question_audio)
user_answer = audio_to_text(answer_audio)
feedback = generate_feedback_from_llm(question_text, user_answer)
return user_answer, feedback
# Gradio UI components
with gr.Blocks() as demo:
gr.Markdown("### Job Interview Practice App")
with gr.Row():
job_title = gr.Textbox(label="Job Title", placeholder="e.g., Data Scientist")
job_description = gr.Textbox(label="Job Description", lines=5, placeholder="Describe the role requirements.")
start_button = gr.Button("Start Interview")
with gr.Row():
question_audio = gr.Audio(label="Question", type="filepath", interactive=False)
next_button = gr.Button("Next Question")
with gr.Row():
answer_audio = gr.Audio(label="Your Answer", type="filepath")
with gr.Row():
response_text = gr.Textbox(label="Transcription of Your Answer", interactive=False)
feedback_text = gr.Textbox(label="Feedback", interactive=False)
# Define workflow logic
question_queue = gr.State()
current_question_index = gr.State()
start_button.click(start_interview, [job_title, job_description], [question_queue, current_question_index, question_audio])
next_button.click(next_question, [question_queue, current_question_index], [current_question_index, question_audio])
# Answer transcription and feedback generation
answer_audio.change(transcribe_and_feedback, [answer_audio, question_audio], [response_text, feedback_text])
demo.launch()
|