Voice agent UI feels stuck in the wiggly-waveform / glowing-orb phase. High-end avatars are exciting, but simple client-rendered characters need richer data than just amplitude to convey speech.
An RMS-driven mouth flap gets you pretty far, but believable mouths need phonetic visemes — which usually means provider-specific viseme/timestamp APIs that only some TTS services offer.
pipecat-visemes is a drop-in for Pipecat bots that works with any TTS provider: it runs lightweight formant analysis (LPC, numpy only — no ML) on the TTS audio stream itself and ships mouth keyframes to the client as standard RTVI messages. Keyframes ride the output transport's clock, so they land ~200ms ahead of the matching audio, stay in sync, and vanish on interruption. The browser just renders.
Benchmark harness (in repo) scores the analyzer against Praat reference formant tracks and a phonetically-designed corpus ("Father was calm as he walked past the palm trees…"), checking raw formant error, mouth-trajectory shape, and articulation events. Tuning runs re-score offline against a committed baseline, so every DSP tweak shows up as a number.
The formant analyzer is Tier 0 of a planned ladder: provider viseme events, timestamp+G2P, and an ONNX phoneme model can all slot in behind the same wire format — clients never change, accuracy just goes up.