Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import time | |
| from transformers import pipeline, AutoModelForSeq2SeqLM, AutoTokenizer | |
| from sentence_transformers import SentenceTransformer | |
| from sklearn.metrics.pairwise import cosine_similarity | |
| from TTS.api import TTS # Coqui TTS library | |
| import PyPDF2 | |
| # Initialize Models | |
| stt_model = pipeline("automatic-speech-recognition", model="openai/whisper-tiny") # Fast STT model | |
| embedding_model = SentenceTransformer("paraphrase-MiniLM-L6-v2") # Optimized embedding model | |
| gpt_model_name = "google/flan-t5-small" # Lightweight question generation model | |
| gpt_tokenizer = AutoTokenizer.from_pretrained(gpt_model_name) | |
| gpt_model = AutoModelForSeq2SeqLM.from_pretrained(gpt_model_name) | |
| tts_model = TTS(model_name="tts_models/en/ljspeech/glow-tts", progress_bar=False, gpu=False) # Efficient TTS model | |
| # Parse PDF and create resume content | |
| def parse_resume(pdf): | |
| reader = PyPDF2.PdfReader(pdf) | |
| text = "\n".join(page.extract_text() for page in reader.pages if page.extract_text()) | |
| return {"Resume Content": text} | |
| # Process inputs | |
| def process_inputs(resume, job_desc): | |
| resume_embeddings = { | |
| section: embedding_model.encode(content) | |
| for section, content in parse_resume(resume).items() | |
| } | |
| job_desc_embedding = embedding_model.encode(job_desc) | |
| return resume_embeddings, job_desc_embedding | |
| # Generate a follow-up question using Flan-T5 | |
| def generate_question(response, resume_embeddings, job_desc): | |
| user_embedding = embedding_model.encode(response) | |
| similarities = { | |
| section: cosine_similarity([user_embedding], [embedding])[0][0] | |
| for section, embedding in resume_embeddings.items() | |
| } | |
| most_relevant_section = max(similarities, key=similarities.get) | |
| prompt = f"You are a hiring manager. Based on the candidate's experience in {most_relevant_section} and the job description, ask a follow-up question." | |
| inputs = gpt_tokenizer(prompt, return_tensors="pt", truncation=True) | |
| outputs = gpt_model.generate(**inputs, max_length=50, num_beams=3, early_stopping=True) | |
| question = gpt_tokenizer.decode(outputs[0], skip_special_tokens=True) | |
| return question | |
| # Generate TTS audio for a question | |
| def generate_audio(question): | |
| audio_path = "output.wav" | |
| tts_model.tts_to_file(text=question, file_path=audio_path) | |
| return audio_path | |
| # Conduct a mock interview | |
| class MockInterview: | |
| def __init__(self): | |
| self.resume_embeddings = None | |
| self.job_desc_embedding = None | |
| self.interview_active = False | |
| self.current_question = None | |
| def start_interview(self, resume, job_desc): | |
| self.resume_embeddings, self.job_desc_embedding = process_inputs(resume, job_desc) | |
| self.interview_active = True | |
| self.current_question = "Tell me about yourself." | |
| return self.current_question, generate_audio(self.current_question) | |
| def next_interaction(self, user_audio): | |
| if not self.interview_active: | |
| return "Interview not started.", None | |
| # Transcribe user's response | |
| transcription = stt_model(user_audio)["text"] | |
| if not transcription.strip(): | |
| return "No response detected. Please try again.", None | |
| # Generate the next question | |
| self.current_question = generate_question(transcription, self.resume_embeddings, self.job_desc_embedding) | |
| return transcription, generate_audio(self.current_question) | |
| def end_interview(self): | |
| self.interview_active = False | |
| return "Thank you for participating in the interview.", generate_audio("Thank you for participating in the interview. Goodbye!") | |
| mock_interview = MockInterview() | |
| def start_interview(resume, job_desc): | |
| question, audio = mock_interview.start_interview(resume, job_desc) | |
| return audio | |
| def process_response(user_audio): | |
| transcription, audio = mock_interview.next_interaction(user_audio) | |
| return transcription, audio | |
| def finalize_interview(): | |
| message, audio = mock_interview.end_interview() | |
| return audio | |
| # Gradio Interface | |
| interface = gr.Blocks() | |
| with interface: | |
| gr.Markdown(""" | |
| ## π§βπΌ Mock Interview AI | |
| Welcome to the Mock Interview simulator! Follow these steps: | |
| 1. Upload your resume (PDF format). | |
| 2. Paste the job description. | |
| 3. Press "Submit" to start the interview. | |
| The system will ask questions and listen to your responses automatically. Good luck! | |
| """) | |
| with gr.Row(): | |
| with gr.Column(scale=2): | |
| gr.Markdown("### Upload Details") | |
| resume_input = gr.File(label="π Upload Resume (PDF)") | |
| job_desc_input = gr.Textbox( | |
| label="π Paste Job Description", | |
| placeholder="Paste the job description here...", | |
| lines=5, | |
| ) | |
| submit_button = gr.Button("π Submit & Start Interview") | |
| with gr.Column(scale=1): | |
| gr.Markdown("### Interview Progress") | |
| question_audio_output = gr.Audio(label="π€ Question Audio") | |
| transcription_output = gr.Textbox(label="ποΈ Your Transcription", lines=3) | |
| gr.Markdown("### Respond to Questions") | |
| audio_input = gr.Audio(type="filepath", label="ποΈ Speak Your Answer") # Fixed Gradio audio input | |
| submit_button.click( | |
| start_interview, inputs=[resume_input, job_desc_input], outputs=[question_audio_output] | |
| ) | |
| audio_input.change( | |
| process_response, inputs=[audio_input], outputs=[transcription_output, question_audio_output] | |
| ) | |
| if __name__ == "__main__": | |
| interface.launch() | |