Muhawir
A bilingual real-time voice agent that runs mock interviews end to end, and scores them without slowing the conversation down.
The problem
Interview practice tools either give scripted feedback after a text exchange, or run a live call with no evaluation at all. Neither gets someone ready for a real bilingual technical interview, where the pressure is in the timing as much as the content.
The constraint that shaped everything
Scoring an answer takes time — parsing structure, checking for evidence, weighing hedging language. Running that inside the live turn adds exactly the kind of pause a real interviewer never gives.
Scoring inside the conversation loop kills the conversation.
So scoring was moved out of the turn entirely: the agent replies at full speed, and the evaluation happens against the recorded turn afterward, surfaced in a report rather than a mid-call interruption.
How it works
- Capture — microphone audio streamed over WebRTC to the media server.
- Understand — streaming transcription starts on partial audio, not the final utterance.
- Respond — the LLM turn begins as soon as endpointing fires, kept to a short system prompt to protect first-token time.
- Evaluate — the completed turn is scored after the fact, off the latency-critical path.
- Report — a session summary aggregates turn-level scores into feedback the user reads after the call.
The hard parts
Hosting real-time media honestly. WebRTC through NAT needs a TURN fallback, and testing locally does not surface that failure mode — it only shows up once you deploy.
Measuring latency honestly. Client-side timers that start on button press overstate performance; the number that matters is endpoint-detected-to-first-audible-token, measured server-side.
Bilingual, not translated. Arabic and English have different endpointing behaviour — pause lengths and sentence rhythm differ enough that a single silence threshold under-serves one language.
Billing that cannot double-charge. Any payment webhook can be delivered more than once; the handler has to be idempotent by design, not by hope.
Outcome
The result is a working end-to-end voice loop with turn latency tracked and reported, not asserted — see the live demo for the actual instrumented numbers rather than a claimed average.