Inspiration

Most interview-practice tools stop at a list of questions and a score. A real interviewer does something harder: they listen for the vague part of your answer and push on it. "I worked on security" gets a follow-up. "We cut triage time by 40%" gets "how did you measure that?" Candidates rarely practice for that moment, and almost no tool shows how you come across on camera either. We wanted practice that feels like the real thing, built from your resume and the job you're applying for.

What it does

You upload your resume and paste a job description. The app builds a fit brief (a match score, your strengths, and the gaps an interviewer is likely to probe) and asks tailored questions out loud. You answer on camera and microphone. After each answer you get:

  • a score and a check on whether you actually answered for this role,
  • the job-description keywords you missed,
  • a model answer that uses only facts from your own resume,
  • speech stats: pace, filler words, hedging, pauses and how long you took to start,
  • camera estimates: eye contact, posture, head movement and blink rate.

If an answer is vague, the interviewer asks an adaptive follow-up (at most two per topic) and you answer that too. Each session ends with a readiness score, your three highest-impact fixes with a five-minute drill for each, job-description coverage, and an HTML report. You can retry any question and watch your score move.

How we built it

  • Python desktop app with a Tkinter launcher and an OpenCV window for the live interview view.
  • MediaPipe face landmarks for gaze, head pose, blinks and face size.
  • faster-whisper for speech-to-text, running locally so audio never leaves the laptop.
  • Gemini API for the fit brief, question writing, per-answer feedback, the follow-up decision and the final review. A fast model handles per-answer work and a stronger one writes the final review.

Camera metrics are measured against each person's own baseline. During a short calibration, we learn what "looking at my screen" looks like for that user. Then:

$$\text{eye contact \%} = 100 \cdot \frac{t_{\text{gaze} \ge 60 \,\wedge\, \text{head} \ge 60}}{t_{\text{total}}}$$

Posture comes from the ratio of current face width to the calibrated width, $r = w / w_0$. We flag "leaning back" when $r < 0.88$ and "too close" when $r > 1.2$. Pace is $\text{wpm} = 60 \cdot \text{words} / \text{seconds}$, compared against a natural range of roughly 120 to 165.

The follow-up step runs in parallel with answer scoring, so it adds no waiting time. If it fails, practice simply moves on.

Challenges we ran into

  • Whisper deletes "um" and "uh". Filler words are exactly what we wanted to count, so we gave the model a prompt that nudges it to keep them.
  • Eye contact depends on where the camera is. A fixed threshold was wrong for different laptops and seating, which is why we added per-user calibration.
  • Keeping the AI honest. The model can only use facts from the resume or transcript for model answers, treats resume and transcript text as data and not instructions, and never asks about protected topics. Replies are strict JSON with a retry when parsing fails.
  • Not over-claiming from a webcam. We describe camera numbers as observable tendencies, never as emotions or personality.
  • Echo in live mode. When recording a real call, the interviewer's voice can leak into the microphone, so we match and remove echoed segments by overlap and text similarity.
  • Privacy. Audio stays in memory and is never written to disk, no video is saved, and only text and numbers go to the API.

What we learned

The most useful feedback was specific and quoted the candidate's own words. The follow-up question was the most memorable feature in our own test runs, because it creates a moment that generic question lists can't. We also learned how much camera and speech signals vary from person to person, which is why calibration and cautious wording matter.

What's next

A browser version so anyone can try it from a link, real-time call-audio capture beyond Windows, role-specific question banks, and a proper study checking our camera and pacing numbers against human interviewers' ratings. We haven't validated those numbers yet, so we treat them as coaching hints, not hiring signals.

Built With

  • css
  • faster-whisper
  • gemini-api
  • google-gemini
  • html
  • mediapipe
  • numpy
  • opencv
  • pypdf
  • python
  • python-docx
  • pyttsx3
  • soundcard
  • sounddevice
  • tkinter
  • whisper
Share this project:

Updates

Submission history