Two capture edges, two cleanup stories
- Browser / app (WebRTC capture)
- Telephony (SIP / PSTN)
When you capture a mic with the SDK’s
captureMicrophone(), the browser’s
own audio pipeline runs a full AEC + AGC + noise-suppression chain
ahead of the Opus encoder. The SDK drives that pipeline through a loopback
capture graph purely to run the browser’s encoder. It then diverts the
encoded Opus frames onto the media-over-QUIC track. You inherit the
device’s processing, and you do not pay for a WebRTC media transport.The defaults enable all three. Override them per capture when you have a
reason. For example, a studio caller on a headset can want raw audio:captureMicrophone() refuses to run unless the browser exposes the
standard encoded-frame transform. Thus cleanup and the encoded path stay
consistent for the whole session. See
/modalities/voice/transport-web/browser-audio-capture
and
/modalities/voice/transport-web/rtcrtpscripttransform.Why the media plane has no APM
The server media plane is a shard-per-core, zero-copy path built for throughput and low, predictable latency. It decodes and encodes codecs, resamples between clock rates, paces RTP, and bridges legs. It is intentionally not a DSP stage. An inline per-frame audio-processing module (AEC/AGC/denoise) would add per-hop latency and CPU to a plane that pushes more than a million packets per second per NIC. It would also duplicate work that the capture edge already does for free on the browser/app path. The one place this shows up in behavior is barge-in on telephony:”Who is speaking?” — channel separation vs. voice printing
Two different questions hide under speaker identity. ClutchCall Voice answers only the first one today.Channel separation (built in, structural)
You almost never need acoustic diarization to tell the caller from the agent. The two legs are already separate streams end to end. They arrive as distinct RTP sessions / distinct media-over-QUIC tracks. Call recordings are written stereo: caller on the left channel, agent on the right. Per-speaker transcription, per-side talk-time, and turn attribution come from the transport, not from a voice model. If your goal is “transcribe each party separately” or “measure agent vs. caller talk ratio,” you already have it. See /modalities/voice/observability/call-traces and /modalities/voice/transport-telephony/codecs.Voice printing / speaker ID (not built)
Aspirational, not shipped. ClutchCall Voice has no speaker-ID,
voiceprint/biometric, or acoustic-diarization feature in the media path
today. There is no enrollment step, no per-speaker embedding, and no
“verify the caller by their voice” API. Voiceprint appears only as a
possible future authentication factor on the contact-center roadmap. It
is not a shipped capability.
What you can rely on today
Turn detection & barge-in
Learn how the no-echo-cancellation media plane shapes the barge-in gate.
Browser audio capture
See where AEC/AGC/NS actually run for browser and app callers.
Codecs
Learn about G.711 on the wire, PCM16 in the runtime, and the resampling
between them.
Troubleshooting: isolation
Diagnose noisy input, echo, and self-triggered barge-in.

