Press and hold the scope (or Space while it's focused) to talk. Let go, and watch it decide your turn is over.
Emitrr — speech pipeline & LLM systems
AI intern · Apr 2025 – Jan 2026 · remote
Cut a live voice pipeline from 500 to 350 ms end to end, largely by retuning when it decides you've stopped talking.
500 → 350 msend-to-end latency on live calls (−30%)
Open the case study
Endpoint tuner
SIMA simulated three-turn call with thinking pauses. Drag the threshold: short values interrupt people mid-thought, long values make every reply late.
Sub-patch: stutter markers
SIMIllustrative output of the wav2vec + BERT detector on a simulated sentence: where it flags disfluency, and what kind.
Emitrr runs live voice conversations for other businesses, which means the pipeline gets exactly one chance to get a sentence right before the moment it was said has already passed. I spent my internship inside that pipeline, mostly in the few hundred milliseconds between someone talking and the system understanding them.
Endpointing
The transcription layer was the first target. I migrated the real-time pipeline off GCP Speech-to-Text and onto Deepgram, then spent most of the tuning time on endpoint detection and audio buffering — the unglamorous knobs that decide whether a pause means “the sentence is over” or “they’re still thinking.” Set the threshold too short and the system talks over people mid-thought; too long and every reply arrives late. Together with the rest of the pipeline work, it took end-to-end latency on live calls from 500 ms to 350 ms — a 30% cut.
The voice on the other end
On the output side, I integrated ElevenLabs for text-to-speech and optimized the streaming path, so the voice on the other end sounds like it’s keeping up rather than catching up.
When calls fall apart
I built a multi-threaded state manager that correlates five concurrent call states in real time, which made isolating pipeline failures far faster. Then I replaced the hard-coded fallback rules for incomplete calls with a reward-driven agent that learns what the next best action should be.
Sub-patch: stutter detection
Before Emitrr, I built a stutter detector that fuses two views of the same speech: wav2vec embeddings of the audio and BERT embeddings of its transcript, concatenated into one vector for a binary classifier. When it flags stuttering, it reports how much, which signs, and the exact seconds where they occur.
- 500 → 350 msend-to-end latency on live calls (−30%)
- 5concurrent call states correlated by the state manager