CPU-only DeepFilterNet 3 noise-suppression pod for Vocence voice agents.
The dashboard opens a per-voice-session WebSocket, streams raw 16 kHz PCM in, and reads denoised 16 kHz PCM back. The cleaned signal is then teed to the STT and UltraVAD pods, so both inference layers see the same noise-free audio.
Follows the standard Vocence pod shape (/healthz, /metrics, X-API-Key
auth, baked model weights) — same as vocence/stt-streaming and
vocence/turn-detection.
See denoiser_streaming_pod_spec.md for the
full contract.
| Endpoint | Auth | Purpose |
|---|---|---|
GET /healthz |
none | liveness + model/license info |
GET /metrics |
none | Prometheus metrics |
WS /v1/stream |
X-API-Key |
streaming denoise |
POST /v1/denoise/batch |
X-API-Key |
one-shot denoise (testing) |
DENOISER_API_KEY=dev uvicorn server.main:app --host 0.0.0.0 --port 8122| Var | Default | Effect |
|---|---|---|
DENOISER_API_KEY |
(required) | shared bearer; pod refuses to start without it |
DENOISER_PORT |
8122 |
TCP port |
DENOISER_MAX_STREAMS |
16 |
concurrent WS cap (over → close 4429) |
DENOISER_DEFAULT_BLOCK_MS |
200 |
block size when start frame omits it |
DENOISER_ONNX_THREADS |
1 |
torch intra-op threads |
DENOISER_LOG_LEVEL |
INFO |
logging level |
The spec asks for a torch-free ONNX image (<800 MB). DeepFilterNet's df
package requires torch for its multi-stage DNN, and libdf (the Rust lib)
only exposes the DSP primitives, not the model. So this pod ships torch
(CPU-only, no CUDA). The WS/REST contract is unchanged — only the image
is larger than the 800 MB target. /healthz reports "runtime": "torch-cpu"
so the dashboard can see this.
All §12 checks verified locally: auth-free /healthz, WS 4401 on bad key,
1003 on bad start-frame, clean round-trip preserves audio, noisy input
denoised (noise-floor ~275× lower), batch endpoint + 401 without key.