File size: 4,073 Bytes
3e6e3a1
65fceff
3e6e3a1
65fceff
 
 
 
3e6e3a1
 
912706a
65fceff
 
 
 
 
3e6e3a1
 
 
 
 
 
 
48482d6
 
 
 
 
3e6e3a1
 
 
65fceff
 
 
 
 
3e6e3a1
d72f5a1
65fceff
 
 
d72f5a1
65fceff
 
 
 
 
3e6e3a1
48482d6
 
 
 
 
 
 
 
 
 
e03fb29
48482d6
d72f5a1
48482d6
 
 
d72f5a1
 
48482d6
 
 
 
 
 
 
 
 
 
 
d72f5a1
 
48482d6
d72f5a1
 
48482d6
 
 
 
 
 
 
 
 
e03fb29
48482d6
 
d72f5a1
48482d6
 
d72f5a1
e03fb29
48482d6
 
d72f5a1
 
65fceff
 
3e6e3a1
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
import gradio as gr
import numpy as np
from transformers import pipeline
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import PyPDF2

# Load local models for inference
stt_model = pipeline("automatic-speech-recognition", model="openai/whisper-base")
conversation_model = pipeline("text-generation", model="facebook/blenderbot-400M-distill")

# Load a pre-trained model for vector embeddings
embedding_model = SentenceTransformer('all-MiniLM-L6-v2')

# Parse PDF and create resume content
def parse_resume(pdf):
    """Extract text from an uploaded PDF file."""
    reader = PyPDF2.PdfReader(pdf)
    text = "\n".join(page.extract_text() for page in reader.pages if page.extract_text())
    sections = {"Resume Content": text}
    return sections

# Process job description text
def process_job_description(job_desc):
    """Encode the job description for analysis."""
    return embedding_model.encode(job_desc)

# Process resume and generate embeddings
def process_resume(pdf):
    resume_content = parse_resume(pdf)
    resume_embeddings = {
        section: embedding_model.encode(content) for section, content in resume_content.items()
    }
    return resume_embeddings

# Generate question from user response
def generate_question(user_input, resume_embeddings):
    """Find the most relevant section in the resume and generate a question."""
    user_embedding = embedding_model.encode(user_input)
    similarities = {
        section: cosine_similarity([user_embedding], [embedding])[0][0]
        for section, embedding in resume_embeddings.items()
    }
    most_relevant_section = max(similarities, key=similarities.get)
    return f"Based on your experience in {most_relevant_section}, can you elaborate more?"

# Gradio interface
class MockInterview:
    def __init__(self):
        self.resume_embeddings = None
        self.job_desc_embedding = None
        self.interview_active = False

    def upload_inputs(self, resume, job_desc):
        self.resume_embeddings = process_resume(resume)
        self.job_desc_embedding = process_job_description(job_desc)
        self.interview_active = True
        return "Resume and job description processed. Interview is starting."

    def conduct_interview(self, audio_file):
        if not self.interview_active:
            return "Please upload your resume and job description first.", ""

        transcription = stt_model(audio_file)["text"]  # Transcribe audio
        question = generate_question(transcription, self.resume_embeddings)
        return transcription, question

    def end_interview(self):
        self.interview_active = False
        return "Interview ended. Thank you for participating."

mock_interview = MockInterview()

def upload_inputs(resume, job_desc):
    return mock_interview.upload_inputs(resume, job_desc)

def conduct_interview(audio_file):
    return mock_interview.conduct_interview(audio_file)

def end_interview():
    return mock_interview.end_interview()

interface = gr.Blocks()
with interface:
    gr.Markdown("""# Mock Interview AI
Upload your resume and job description, then engage in a realistic interview simulation.""")

    with gr.Row():
        resume_input = gr.File(label="Upload Resume (PDF)")
        job_desc_input = gr.Textbox(label="Paste Job Description")
        upload_button = gr.Button("Upload and Start Interview")

    with gr.Row():
        audio_input = gr.Audio(type="filepath", label="Respond with Your Answer")
        transcription_output = gr.Textbox(label="Transcription")
        question_output = gr.Textbox(label="Question")
        submit_button = gr.Button("Submit Response")
        end_button = gr.Button("End Interview")

    upload_button.click(upload_inputs, inputs=[resume_input, job_desc_input], outputs=[transcription_output])
    submit_button.click(conduct_interview, inputs=[audio_input], outputs=[transcription_output, question_output])
    end_button.click(end_interview, outputs=[transcription_output])

if __name__ == "__main__":
    interface.launch()