-
LLM-Based Turn Detection in Voice Agents: Three Failure Modes from Production
Knowing when a caller is done talking is the hardest continuous decision in a voice pipeline. Audio-only endpointers can't judge semantic completeness, so we let the LLM decide. It worked, until three failure modes showed up in production. All of them were races between asynchronous components.
-
Streaming STT Has No Wall Clock
A caller's sentence vanished from a production voice call with no error anywhere. The hunt for it went through Deepgram endpointing internals, a mobile-network theory that died on the standards, Twilio's undocumented silence behavior, and four-day-old logs. What it found applies to anyone building real-time voice.
-
Moving Our Voice AI to Pipecat: The Parts Nobody Warns You About
Notes from migrating a phone-based voice assistant from a managed platform to Pipecat. Asyncio traps, rebuilding call logs with observers, turn-taking tuning, voicemail detection, and why long-lived WebSockets fight every hosting default.
-
DeepFilterNet vs RNNoise: Choosing a Noise Suppressor for a Real-Time Voice AI Pipeline
The two best free, CPU-only noise suppressors for a pipecat voice pipeline. RNNoise is one line to enable but hurts speech signal quality. DeepFilterNet3 is better at everything except integration and STT risk.
-
Profiling Python Memory in Production on Heroku (and What We Found)
We profiled two FastAPI services hitting Heroku memory limits. memray showed a HuggingFace tokenizer loading 152MB per worker, three times over. The fix was switching from uvicorn's spawn to gunicorn's fork with --preload.