Repository navigation
An interview now runs with no LLM, speech-to-text or text-to-speech key at all.
LLM_PROVIDER=ollama STT_PROVIDER=whisper TTS_PROVIDER=kokoroNo new dependency was added — this reuses the already-installed
livekit-plugins-openai with a base_url override. Provider values name a
contract ("an OpenAI-compatible server at a base URL"), not a vendor, so the
stack is genuinely swappable:
| Stage | Endpoint | Accepted values |
|---|---|---|
| LLM | /v1/chat/completions |
ollama · vllm · llamacpp · lmstudio · local |
| STT | /v1/audio/transcriptions |
whisper · faster-whisper · qwen3-asr · speaches · local |
| TTS | /v1/audio/speech |
kokoro · local |
Also ships deepinterview init → "100% local models", a
docker compose --profile local stack, and docs/LOCAL_MODELS.md.
Verified
Apple M5 Pro (24 GB), qwen3:8b + Speaches + kokoro-fastapi:
- A live microphone interview, end to end — the agent spoke in Kokoro's
voice, the local Whisper server transcribed real speech, and the report
renderedcomplete, with zero recognition failures and no stage falling back
to a cloud provider. - Prep → question plan in ~2 minutes, CV-grounded with difficulty ramping
1→5 and no degraded stages. - 216 pytest + 26 vitest, lint, schema parity, compose (all profiles) and the
agent image build, all green.
Not verified, so not claimed
- Turn latency is not benchmarked. Optimizing it is follow-up work.
- Kokoro has no Vietnamese voice —
visessions honestly fall back to a
cloud voice rather than mispronouncing it. - LiveKit remains the transport. The claim is "no cloud model keys", never
"no cloud";livekit-server --devis documented for a fully offline stack. - CI has no models, so the local path is maintainer-verified only.
- Small local models lean on the shutdown-time answer recovery more than cloud
models do —qwen3:8bdid not reliably callsave_answerduring the live run.
Two defaults worth knowing
WHISPER_MODEL=Systran/faster-whisper-base, notsmall. The OpenAI plugin
hard-codes a 30s per-request ceiling no setting can raise, so an oversized
model doesn't degrade — the turn dies.smallneeds ~3.4 GB resident and, in a
memory-tight Docker VM, took 32s on a 3.6s clip;baseneeds ~220 MB and was
just as accurate.KOKORO_MODEL=tts-1is load-bearing: any other id routes synthesis down an
SSE branch that yields no audio and no error. A wrong value is coerced with a
warning.
🤖 Generated with Claude Code