Skip to content
EE
All work

AI Interviewer

A real-time interview assistant that screen-share can't see

AI Interviewer — A real-time interview assistant that screen-share can't see
Role
Personal project
Year
2026
Status
Shipped

The problem

A Windows desktop application that listens to a live interview, transcribes the interviewer with Whisper, works out which question was actually asked, and drafts a spoken-style answer from your CV and tone guide — in a window excluded from screen capture at the OS level.

Live transcription is the easy half. The hard part is that interviewers don't ask clean questions: they ramble, self-correct, stack three questions into one breath, and trail off. A naive pipeline that treats every sentence as a prompt produces a wall of answers to things nobody asked, arriving too late to be read.

Diagram of the AI Interviewer pipeline from audio capture through Whisper and question detection to answer generation
The pipeline. Question detection sitting between transcription and generation is what makes the output usable.

How I built it

01

Question detection as its own stage

Transcription and answering are separated by a detection stage that decides what the last genuinely unanswered question was — which is not the last sentence, and often not phrased as a question at all. That stage is the difference between a useful assistant and a live transcript with noise attached. There's also a manual override box, because the honest design assumption is that detection will sometimes be wrong.

02

Invisible to screen capture, by the OS not by a trick

The window calls Windows' `SetWindowDisplayAffinity` with `WDA_EXCLUDEFROMCAPTURE`, so the compositor itself omits it from any capture stream. On Meet, Zoom, Teams or OBS it renders as a black rectangle while staying fully visible on the physical display. This is an OS-level guarantee rather than a heuristic that breaks when the conferencing app updates.

03

Local transcription, remote generation

Whisper runs locally on the GPU — audio never leaves the machine, and local inference removes the network round-trip that would make transcription lag unusable. Only the detected question text goes out, to OpenRouter, which keeps the model swappable between Gemini Flash, Claude and GPT without touching the pipeline.

04

Answers in your voice, not the model's

Generation is conditioned on three things: your parsed CV, a `tone.md` voice guide, and the pasted job description. Without the tone guide the output is recognisably model-shaped — balanced, hedged, slightly too fluent to be speech. The guide is what makes an answer sound like something a person would actually say out loud.

Built with

  • Python 3.11
  • PyQt6
  • faster-whisper
  • CUDA
  • OpenRouter
  • Gemini Flash
  • pdfplumber
  • ReportLab
  • Win32 API

Outcome

  • Live pipeline: audio capture → local Whisper → question detection → LLM → segmented answer panel
  • OS-level capture exclusion verified against Meet, Zoom and Teams
  • CV parsed from PDF; sessions exportable to text or PDF afterwards
  • Model-agnostic through OpenRouter — Gemini, Claude, GPT and Llama all swap in by config