Spaces:
Running
Running
File size: 4,596 Bytes
5144ac6 e51d2b2 c5639ef 5144ac6 5dc2718 e51d2b2 5dc2718 e51d2b2 c5639ef 5dc2718 5144ac6 e51d2b2 5144ac6 e51d2b2 5144ac6 e51d2b2 5144ac6 e51d2b2 5144ac6 c5639ef 5144ac6 e51d2b2 5dc2718 e51d2b2 5dc2718 5144ac6 e51d2b2 5144ac6 e51d2b2 5144ac6 e51d2b2 5144ac6 e51d2b2 5144ac6 e51d2b2 5144ac6 e51d2b2 5144ac6 e51d2b2 5144ac6 c5639ef e51d2b2 5144ac6 e51d2b2 5144ac6 e51d2b2 5144ac6 e51d2b2 5144ac6 e51d2b2 5144ac6 e51d2b2 5144ac6 f0af5b0 e51d2b2 c5639ef 336b334 c5639ef e51d2b2 5144ac6 5dc2718 c5639ef |
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 |
import gradio as gr
import time
from transformers import pipeline
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")
embedding_model = SentenceTransformer("all-MiniLM-L6-v2")
conversation_model = pipeline("text-generation", model="deepseek/deepsense-open") # Using DeepSeek for question generation
tts_model = TTS(model_name="tts_models/en/ljspeech/tacotron2-DDC", progress_bar=False, gpu=False)
# 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
def generate_question(response, resume_embeddings):
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)
question_prompt = f"You are interviewing a candidate. Based on their resume and experience in {most_relevant_section}, ask a follow-up question."
question = conversation_model(question_prompt, max_length=50, num_return_sequences=1)[0]['generated_text']
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)
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()
# Gradio Interface
def start_interview(resume, job_desc):
return mock_interview.start_interview(resume, job_desc)
def next_interaction(user_audio):
return mock_interview.next_interaction(user_audio)
def end_interview():
return mock_interview.end_interview()
interface = gr.Blocks()
with interface:
gr.Markdown("### Mock Interview AI\nUpload your resume and job description, and engage in a realistic audio-based mock interview simulation.")
with gr.Row():
resume_input = gr.File(label="Upload Resume (PDF)")
job_desc_input = gr.Textbox(label="Paste Job Description")
audio_input = gr.Audio(type="filepath", label="Your Response")
question_audio_output = gr.Audio(label="Question Audio")
transcription_output = gr.Textbox(label="Transcription")
interaction_button = gr.Button("Next Interaction")
end_button = gr.Button("End Interview")
resume_uploaded = resume_input.change(start_interview, inputs=[resume_input, job_desc_input], outputs=[transcription_output, question_audio_output])
interaction_button.click(next_interaction, inputs=[audio_input], outputs=[transcription_output, question_audio_output])
end_button.click(end_interview, outputs=[transcription_output, question_audio_output])
if __name__ == "__main__":
interface.launch()
|