Back to Case Studies
Voice AI

Building InterviewRoom: Live Voice Interviews on a Free-Tier Budget

How we built a free AI interviewer that listens, asks follow-up questions and scores the transcript, with hard cost ceilings and no stored audio.

Executive Summary

  • Challenge: A spoken interview has to feel like a conversation, but every turn pays for speech-to-text, a language model and speech synthesis. A free product needs both responsiveness and a predictable bill.
  • Solution: A streaming turn pipeline over WebSockets, speech detection in the browser, sentence-by-sentence synthesis, interruption support, and usage ceilings checked on every turn.
  • Outcome: InterviewRoom is live for candidates practising and for hiring teams sending interviews by invite link. When a budget runs out, it degrades in a planned order instead of failing.

The Challenge

Most interview practice tools are quizzes: read a question, type an answer. Real interviews are spoken, and the hard part is the follow-up question that probes what you just said. We wanted a product where you speak to an interviewer, it responds to your actual answer, and you leave with a transcript and a score.

Voice makes every weakness obvious. Silence after you finish speaking feels like a dropped call. An interviewer that keeps talking over you feels like a recording. And because the practice tier is free, every minute of usage is paid by us, so cost had to be designed in from the first commit.

Constraints & Requirements

  • •Free practice sessions with no payment details required
  • •Replies that respond to what the candidate actually said
  • •Candidates must be able to interrupt the interviewer
  • •Spending capped per session and per day, enforced on the server
  • •Audio is never stored; only the transcript and score are kept

System Considerations

What had to be true

  • — One persistent WebSocket per interview carrying audio, captions and control messages
  • — Voice activity detection on the device so only speech is uploaded
  • — A stage timeline (greeting, warm-up, role questions, optional coding, wrap-up) driven by elapsed time
  • — Scoring that runs after the session, outside the live audio path

Non-negotiables

  • — Every external call can be cancelled the moment the candidate speaks
  • — Usage is recorded at the vendor's billed amount, before the request is sent
  • — All client messages validated with Zod before they reach session logic

Architecture Approach

The browser runs the open-source Silero voice activity detection model and streams raw audio to the API only while the candidate is speaking. The API is Node.js with Express and the ws library, with Postgres through Drizzle for interviews, transcripts and daily usage. Speech-to-text is Whisper on Groq. Replies come from a gpt-4o-mini deployment on Azure OpenAI, and the voice is Azure neural text-to-speech.

Groq has no streaming transcription, so live captions work by re-transcribing the growing utterance at most once per interval, with one request in flight per session. Captions get a fixed share of the daily speech-to-text budget, so they can never starve the final transcription of an answer.

The model reply is streamed and cut into sentences, handling abbreviations such as "Dr." and "e.g.". Each sentence goes to speech synthesis as soon as it is complete, so the candidate hears the first sentence while later ones are still being written. Lines that repeat across sessions, like greetings and transitions, are served from an in-memory audio cache keyed by voice and text.

Interruptions use a generation counter. When the candidate starts talking, the session increments the counter, aborts in-flight model and synthesis requests, and tells the browser to stop playback. Any late response tagged with an old generation is discarded. The interview stage is a pure function of elapsed time and planned duration, which keeps pacing predictable and easy to test.

Trade-offs & Decisions

Prioritized

  • Time to first spoken sentence over complete, polished replies
  • Hard daily ceilings over unlimited free usage
  • Simple, testable pure functions for limits, stages and sentence splitting
  • Privacy: transcripts only, no audio retention

Intentionally Not Optimized

  • Premium voices: standard neural voices only, to keep the per-minute cost low
  • True streaming transcription: re-transcribing the utterance costs more per caption, but kept the provider choice open
  • Long free sessions: practice is capped at 10 minutes; hiring-team interviews set their own length

Outcome

InterviewRoom is live at interviewroom.mecverse.com. Candidates practise company-style interview loops for free, and hiring teams send candidates an invite link and review the transcript and score afterwards.

The cost model held up because limits were part of the design rather than added after launch. When the daily voice budget runs out, the interview continues using the browser's built-in speech synthesis. When transcription or model capacity runs out, the session ends with a clear message rather than a broken one. We wrote up the reasoning in Put a Ceiling on Every AI Feature Before You Launch and Talking to an AI Should Not Feel Like Leaving a Voicemail.

10-minute free practice sessions, no card required

4 usage ceilings checked before every turn

0 seconds of candidate audio stored

A voice product feels fast when it speaks early, stops when interrupted, and never makes the user wait in silence. Everything else is budget.