An AI-powered browser extension designed to help users practice technical and non-technical interviews, analyze resumes against job descriptions, generate interview questions, evaluate answers, provide voice interaction, and detect potential cheating indicators using the webcam.
AI Interview Assistant combines a browser extension frontend with a Python/Flask backend and machine-learning components to create an interactive interview-practice environment.
The system allows a candidate to:
- π Upload and extract text from resumes
- πΌ Enter a target job description
- π€ Analyze resumeβjob-description compatibility
- π Generate a match score and identify missing skills
- β Generate technical and non-technical interview questions
- β±οΈ Answer questions under a timed interview environment
- ποΈ Use speech recognition for voice-based answers
- π Hear questions through text-to-speech
- π· Use webcam-based monitoring during interviews
- ποΈ Run cheating-detection functionality
- π§ Evaluate candidate answers using NLP
- π Track interview scores and history
- π Visualize performance through a dashboard
- π³ Run the backend inside Docker
AI Interview Assistant β Dashboard, Interview, Results, History & Settings
π Demo: The video demonstrates resume analysis, AI-generated interview questions, camera monitoring, voice input, answer evaluation, scoring, and interview history.
Upload a candidate's resume in supported document formats and extract its text through the backend.
Resume
β
Text Extraction
β
NLP Analysis
β
Job Description Comparison
β
Match Score + Missing Skills
The system analyzes the relationship between:
- Candidate resume
- Target job description
- Relevant keywords
- Skills
After resume analysis, the backend generates interview questions relevant to the candidate.
Questions are divided into:
ROUND 1
Technical
ROUND 2
Non-Technical
Each question has a 2-minute timer.
Time Left: 1:59
The extension supports browser speech recognition and converts spoken responses into text.
Interview questions can be read aloud using:
SpeechSynthesisUtteranceThe extension requests webcam access when an interview starts.
The camera system:
- Requests video independently from microphone access
- Displays a live camera preview
- Handles camera permission errors
- Detects unavailable cameras
- Handles cameras already being used by another application
- Attempts to avoid known virtual/Phone Link cameras
- Releases camera tracks when the interview ends
Camera and microphone access are intentionally handled separately.
The application includes webcam-based cheating-detection functionality intended to identify suspicious interview behavior.
Detected incidents are tracked during the interview and displayed in interview history.
The extension maintains interview history using browser extension storage.
The dashboard tracks:
- Total interviews
- Average score
- Previous interview scores
- Cheating alerts
A Chart.js-based visualization displays recent performance.
Previous interviews are stored locally and displayed with:
Date
Score
Cheating Alerts
AI INTERVIEW ASSISTANT
β
ββββββββββββββ΄βββββββββββββ
β β
βΌ βΌ
Browser Extension Flask Backend
β β
ββββββββββΌβββββββββ βββββββΌβββββββββββββββ
β β β β β β
βΌ βΌ βΌ βΌ βΌ βΌ
Resume Interview Camera NLP ML Models External APIs
Upload Interface + Audio β
β β β βββ KeyBERT
β β β βββ Sentence Transformers
β β β βββ Scikit-learn
β β β βββ Ultralytics
β β β
ββββββββββ΄βββββββββ
β
βΌ
Browser Storage
- HTML5
- CSS3
- JavaScript
- Chrome/Edge Extension Manifest V3
- Chrome Storage API
- Web Speech API
- MediaDevices API
- Chart.js
- Python 3.12
- Flask
- Flask-CORS
- Waitress
- python-dotenv
- PyTorch
- Sentence Transformers
- KeyBERT
- Scikit-learn
- NumPy
- Ultralytics
- OpenCV
python-docxpypdf
- RapidAPI
- Hugging Face
- Docker
- Docker Desktop
- Python virtual environment
- Linux-based Python Docker image
A typical project structure is:
AI_INTERVIEW_ASSISTANT/
β
βββ backend/
β βββ Dockerfile
β βββ requirements.txt
β βββ main.py
β βββ nlp_engine.py
β βββ cheating_detection.py
β βββ question_generator.py
β βββ scoring.py
β βββ model/
β βββ data/
β βββ .env
β
βββ assets/
β βββ image.png
β
βββ popup.html
βββ popup.js
βββ style.css
βββ background.js
βββ manifest.json
β
βββ README.md
The exact project structure may vary depending on the current version of the project.
git clone <YOUR_REPOSITORY_URL>
cd AI_INTERVIEW_ASSISTANTcd backendpython -m venv .venvActivate it:
.venv\Scripts\activatepython3 -m venv .venv
source .venv/bin/activatepip install -r requirements.txtCreate:
backend/.env
Add the required API credentials:
RAPID_API_KEY=your_rapidapi_key
HF_TOKEN=your_huggingface_tokenNever commit .env to GitHub.
Add:
.envto .gitignore.
Also make sure .env is excluded from the Docker build context using .dockerignore.
From the backend directory:
python main.pyThe backend is configured around:
http://localhost:5000
The browser extension communicates with backend endpoints such as:
POST /extract-text
POST /analyze
POST /evaluate
From the backend/ directory:
docker build -t interview-assistant:v1 .docker imagesYou should see:
interview-assistant v1
Pass environment variables at runtime:
docker run --rm --env-file .env -p 5000:5000 interview-assistant:v1The application will then be accessible through:
http://localhost:5000
API credentials should not be embedded inside the Docker image.
.env
β
βΌ
docker run --env-file .env
β
βΌ
Docker Container
β
βββ RAPID_API_KEY
βββ HF_TOKEN
To verify that Docker itself is functioning:
docker run hello-worldA successful installation produces:
Hello from Docker!
Inspect the project image with:
docker image inspect interview-assistant:v1Open:
edge://extensions/
Enable:
Developer mode
Select:
Load unpacked
and choose the project directory containing manifest.json.
Open:
chrome://extensions/
Enable:
Developer mode
Click:
Load unpacked
and select the extension directory.
The extension uses Manifest V3.
Relevant permissions include:
{
"permissions": [
"storage",
"notifications",
"tabs",
"activeTab",
"scripting"
]
}The local backend is permitted through:
"host_permissions": [
"http://localhost:5000/*"
]along with the project's configured external services.
Launch Extension
β
βΌ
Enter Job Description
β
βΌ
Upload Resume
β
βΌ
Extract Resume Text
β
βΌ
Save Candidate Profile
β
βΌ
Start Interview
β
βΌ
Camera Permission
β
βΌ
Resume + JD Analysis
β
βΌ
Match Score
β
βΌ
Missing Skills
β
βΌ
Generate Questions
β
βΌ
Technical Round
β
βΌ
Non-Technical Round
β
βΌ
Voice / Text Answer
β
βΌ
Answer Evaluation
β
βΌ
Score Calculation
β
βΌ
Cheating Detection
β
βΌ
Final Score
β
βΌ
Save Interview History
β
βΌ
Dashboard
POST /extract-textUsed to extract text from uploaded resume documents.
POST /analyzeExample request:
{
"resume": "Candidate resume text...",
"job_description": "Job description..."
}Example response structure:
{
"score": 85,
"missing_skills": [],
"questions": []
}POST /evaluateExample request:
{
"candidate_answer": "Candidate's answer...",
"reference_answer": "Expected/reference answer..."
}The resulting score contributes to the candidate's final interview score.
The application maintains:
interviewState.totalScoreand accumulates scores obtained from individual answers.
At the end:
Final Score: XX/100
is displayed and stored in interview history.
This project handles potentially sensitive information including:
- Resume data
- Job descriptions
- API credentials
- Camera access
- Microphone access
- Interview performance data
.env
API keys
HF tokens
private credentials
const HF_TOKEN = "...";
const RAPID_API_KEY = "...";docker run --env-file .env ...for local Docker execution.
The camera and microphone are intentionally handled independently.
navigator.mediaDevices.getUserMedia({
video: true,
audio: false
});navigator.mediaDevices.getUserMedia({
audio: true
});This prevents microphone permission failure from incorrectly appearing as a camera failure.
The camera implementation handles common errors such as:
NotAllowedError
NotFoundError
NotReadableError
OverconstrainedError
SecurityError
AbortError
If you see:
failed to connect to the docker API
start Docker Desktop and verify:
docker infoThe project uses a CPU-oriented PyTorch installation for the Docker environment.
Rebuild with:
docker build --no-cache -t interview-assistant:v1 .Check:
- Browser camera permissions
- Windows camera permissions
- Whether another application is using the webcam
- Extension permissions
- Extension reload after modifying
manifest.json
Inspect the extension console for the actual DOMException:
NotAllowedError
NotFoundError
NotReadableError
rather than relying on a generic camera error.
The extension expects JSON responses from the backend.
If you see:
Server returned HTML
verify that:
http://localhost:5000
is reachable and that the backend is running.
For Docker:
docker psThe backend Docker image uses:
FROM python:3.12-slimand exposes:
EXPOSE 5000The container starts with:
CMD ["python", "-u", "main.py"]The Docker environment installs CPU-oriented PyTorch rather than unnecessarily pulling the CUDA dependency stack.
Potential future enhancements include:
- π₯ Dedicated interview tab instead of relying entirely on the extension popup
- π§ Improved LLM-based answer evaluation
- π€ Face detection and multi-person detection
- π Advanced gaze/posture analysis
- π More detailed interview analytics
- π Skill-wise performance tracking
- βοΈ Cloud-based interview history
- π Improved secret management for production
- β‘ Docker image size optimization
- π§ͺ Automated backend and extension tests
- π Production deployment of the Flask backend
- π± Responsive interview interface
- π£οΈ Improved multilingual speech recognition
The project aims to provide an accessible environment where students and job seekers can practice interviews independently, receive AI-assisted feedback, and improve their technical and communication skills through repeated practice.
Barsharani Gochhayat
B.Tech β Computer Science & Engineering
Raajdhani Engineering College, Bhubaneswar Biju Patnaik University of Technology (BPUT), Odisha
Manas Ranjan Das
B.Tech β Electrical & Computer Engineering
Ajay Binay Institute of Technology (ABIT), Cuttack Biju Patnaik University of Technology (BPUT), Odisha
MIT License
If this is an academic/project submission, you can instead specify the institutional or project-specific licensing terms.
Contributions, suggestions, bug reports, and feature requests are welcome.
Fork Repository
β
Create Feature Branch
β
Implement Changes
β
Test Locally
β
Commit Changes
β
Push Branch
β
Create Pull Request
If you find this project useful, consider giving the repository a β and contributing improvements, bug fixes, and new interview features.
