Requirements
System requirements and resource planning for Speaknode
Speaknode is a composable platform. Each service runs in its own container, so you can scale components independently. Before deploying, size your infrastructure according to expected concurrent sessions — everything else (backbone services) stays roughly constant.
Software dependencies
- Docker 24+ and Docker Compose v2.24+
- 64-bit Linux host (Ubuntu 22.04 LTS or equivalent). macOS works for local dev.
- Outbound internet access (registry, LLM/STT/TTS providers, STUN/TURN)
- Ports accessible from your users' browsers: frontend, backend API, Keycloak, LiveKit WebRTC (TCP 7881, UDP 50000–60000).
Per-service resource baselines
The table below shows combined CPU / RAM / Disk requirements for each service at typical concurrent session loads. Values are empirical baselines from production.
⚠ All figures on this page are preliminary estimates. Real-world load can vary significantly with traffic patterns, model choice, session length and audio characteristics — use them as a starting point and validate against your own metrics before sizing production hardware.
| Service | 1 session | 10 sessions | 50 sessions | 250 sessions | 500 sessions |
|---|---|---|---|---|---|
livekit-serverWebRTC SFU — media plane for every active call | 300 m · 532 MB · 1.0 GB | 750 m · 712 MB · 1.0 GB | 2.75 vCPU · 1.5 GB · 1.0 GB | 12.75 vCPU · 5.4 GB · 1.0 GB | 25.25 vCPU · 10.3 GB · 1.0 GB |
python-workerLiveKit voice agent (LLM/STT/TTS orchestration + ffmpeg) | 650 m · 1.2 GB · 1.0 GB | 2.00 vCPU · 3.1 GB · 1.0 GB | 8.00 vCPU · 11.7 GB · 1.0 GB | 38.00 vCPU · 54.7 GB · 1.0 GB | 75.50 vCPU · 108.4 GB · 1.0 GB |
egressLiveKit recording / transcoding (optional) | 1.20 vCPU · 2.1 GB · 2.1 GB | 3.00 vCPU · 3.0 GB · 2.6 GB | 11.00 vCPU · 6.9 GB · 5.0 GB | 51.00 vCPU · 26.4 GB · 17.0 GB | 101.00 vCPU · 50.8 GB · 32.0 GB |
turn-detectorRemote semantic EOU classifier (ONNX, smart_turn_v3) | 1.05 vCPU · 783 MB · 0.5 GB | 1.50 vCPU · 918 MB · 0.5 GB | 3.50 vCPU · 1.5 GB · 0.5 GB | 13.50 vCPU · 4.4 GB · 0.5 GB | 26.00 vCPU · 8.1 GB · 0.5 GB |
df-denoiseDeepFilterNet noise suppression (optional) | 350 m · 350 MB · 0.5 GB | 1.25 vCPU · 800 MB · 0.5 GB | 5.25 vCPU · 2.7 GB · 0.5 GB | 25.25 vCPU · 12.5 GB · 0.5 GB | 50.25 vCPU · 24.7 GB · 0.5 GB |
media-bridgeWebSocket ↔ LiveKit audio bridge (Voximplant / Twilio inbound) | 130 m · 271 MB · 0.5 GB | 400 m · 406 MB · 0.5 GB | 1.60 vCPU · 1006 MB · 0.5 GB | 7.60 vCPU · 3.9 GB · 0.5 GB | 15.10 vCPU · 7.6 GB · 0.5 GB |
sip + sip-publicLiveKit SIP gateway (inbound + outbound trunks) | 220 m · 522 MB · 0.5 GB | 400 m · 612 MB · 0.5 GB | 1.20 vCPU · 1012 MB · 0.5 GB | 5.20 vCPU · 2.9 GB · 0.5 GB | 10.20 vCPU · 5.4 GB · 0.5 GB |
asp-net-backendMain API (.NET 9, EF Core, SignalR) | 510 m · 1.0 GB · 5.0 GB | 600 m · 1.0 GB · 5.0 GB | 1.00 vCPU · 1.2 GB · 5.0 GB | 3.00 vCPU · 2.2 GB · 5.0 GB | 5.50 vCPU · 3.4 GB · 5.0 GB |
keycloakOAuth2 / OIDC authentication | 500 m · 768 MB · 2.0 GB | 500 m · 768 MB · 2.0 GB | 500 m · 768 MB · 2.0 GB | 500 m · 768 MB · 2.0 GB | 500 m · 768 MB · 2.0 GB |
postgresMain + Lago + Keycloak + Hangfire DBs | 505 m · 1.5 GB · 20.0 GB | 550 m · 1.5 GB · 20.0 GB | 750 m · 1.6 GB · 20.1 GB | 1.75 vCPU · 2.0 GB · 20.8 GB | 3.00 vCPU · 2.5 GB · 21.5 GB |
redisLiveKit pubsub, backend cache, queues | 105 m · 259 MB · 8.0 GB | 150 m · 286 MB · 8.0 GB | 350 m · 406 MB · 8.0 GB | 1.35 vCPU · 1006 MB · 8.0 GB | 2.60 vCPU · 1.7 GB · 8.0 GB |
kafkaEvent streaming (spans, webhooks, analytics) | 505 m · 1.0 GB · 20.0 GB | 550 m · 1.0 GB · 20.1 GB | 750 m · 1.2 GB · 20.5 GB | 1.75 vCPU · 2.2 GB · 22.5 GB | 3.00 vCPU · 3.4 GB · 25.0 GB |
webhook-receiverAccepts inbound webhooks (Lago, LiveKit, Twilio) | 200 m · 256 MB · 1.0 GB | 200 m · 256 MB · 1.0 GB | 200 m · 256 MB · 1.0 GB | 200 m · 256 MB · 1.0 GB | 200 m · 256 MB · 1.0 GB |
angular-client + widgetStatic frontends (nginx) | 100 m · 256 MB · 0.5 GB | 100 m · 256 MB · 0.5 GB | 100 m · 256 MB · 0.5 GB | 100 m · 256 MB · 0.5 GB | 100 m · 256 MB · 0.5 GB |
lago (api + worker + clock + front + pdf)Usage-based billing stack (5 deployments) | 1.00 vCPU · 1.6 GB · 5.0 GB | 1.00 vCPU · 1.6 GB · 5.0 GB | 1.00 vCPU · 1.6 GB · 5.0 GB | 1.00 vCPU · 1.6 GB · 5.0 GB | 1.00 vCPU · 1.6 GB · 5.0 GB |
object storage (S3 / MinIO)Recordings, transcripts, debug artefacts | 200 m · 256 MB · 20.1 GB | 200 m · 256 MB · 20.6 GB | 200 m · 256 MB · 23.0 GB | 200 m · 256 MB · 35.0 GB | 200 m · 256 MB · 50.0 GB |
logging (ES + Kibana + Benthos + otel)Optional observability stack | 1.00 vCPU · 2.0 GB · 50.0 GB | 1.03 vCPU · 2.0 GB · 50.0 GB | 1.15 vCPU · 2.1 GB · 50.1 GB | 1.75 vCPU · 2.5 GB · 50.8 GB | 2.50 vCPU · 3.0 GB · 51.5 GB |
| Total | 8.53 vCPU 14.6 GB 137.6 GB | 14.18 vCPU 18.5 GB 138.9 GB | 39.30 vCPU 36.0 GB 144.3 GB | 164.90 vCPU 123.3 GB 171.5 GB | 321.90 vCPU 232.4 GB 205.5 GB |
How to read this:
- Session-bound services (
livekit-server,python-worker,egress,websocket-media-bridge) scale linearly with the number of active calls. They are what you need to plan for. - Backbone services (Postgres, Kafka, Keycloak, Redis, MinIO, etc.) have a largely fixed footprint — you can host them once and reuse across tenants.
- Disk mostly grows in Postgres (transcripts, invoices), Kafka (event retention) and MinIO (call recordings). Plan storage with retention in mind.
Resource calculator
Use the calculator to estimate the total footprint of the application stack at your expected peak concurrency:
Total is the sum across all application services at 50 concurrent sessions. Resources for LLM / STT / TTS providers are billed separately and not included here.
Notes
- Numbers are for the application layer only. CPU/RAM/disk for LLM, STT and TTS providers (or self-hosted models) are billed separately by those vendors and are not included here — for self-hosted GPU planning see the calculator below.
- Add a safety margin of 20–30% on top of the calculator output for headroom, spikes and OS overhead.
- For high-availability production deployments you should double the backbone figures (Postgres replica, Kafka with replication factor ≥ 2, etc.).
GPU sizing for self-hosted models
If you run STT / TTS / LLM on your own hardware instead of cloud providers, size GPU VRAM separately. The matrix below shows current OSS picks (June 2026); the calculator below it lets you pick one model per role and see total VRAM under a target concurrent-session load. Pick "Custom" in any dropdown to enter your own model and the totals recalculate live.
| Model | Type | Params | Weights @FP16 | KV @8K | License |
|---|---|---|---|---|---|
gpt-oss-120B (MoE) | MoE (5.1B active) | 117B | 234 GB | 0.60 GB | Apache 2.0 |
Qwen3-30B-A3B (MoE) | MoE (3.3B active) | 30.5B | 61.0 GB | 0.81 GB | Apache 2.0 |
GLM-4.7 (Z.ai, MoE) | MoE (32B active) | 355B | 710 GB | 3.22 GB | MIT |
Llama-3.3-Nemotron-Super-49B-v1.5 | Dense | 49B | 98.0 GB | 2.68 GB | NVIDIA Open Model |
Llama 3.3 70B | Dense | 70.6B | 141 GB | 2.68 GB | Llama Community |
Llama 4 Scout (MoE) | MoE (17B active) | 109B | 218 GB | 1.61 GB | Llama 4 Community |
Mistral Small 3.1 24B | Dense | 24B | 48.0 GB | 1.34 GB | Apache 2.0 |
Gemma 3 27B | Dense | 27B | 54.0 GB | 4.16 GB | Gemma Terms |
DeepSeek-R1-Distill-Qwen-32B | Dense | 32.8B | 65.6 GB | 2.15 GB | MIT (distill) |
DeepSeek-V4-Flash (MoE) | MoE (13B active) | 284B | 568 GB | 1.07 GB | MIT |
| Model | Params | Weights | Per-session | Streaming | RU | License |
|---|---|---|---|---|---|---|
NVIDIA Nemotron-3.5-ASR Streaming 0.6B (multilingual) | 600M | 1.20 GB | 200 MB | ✓ | ✓ | NVIDIA Open Model |
NVIDIA Parakeet-TDT 0.6B-v3 (multilingual) | 600M | 1.20 GB | 250 MB | ✓ | ✓ | CC-BY-4.0 |
NVIDIA Canary-1B-v2 | 1000M | 2.00 GB | 450 MB | — | ✓ | CC-BY-4.0 |
NVIDIA Parakeet-TDT 1.1B (EN-only) | 1100M | 2.20 GB | 320 MB | ✓ | — | CC-BY-4.0 |
Whisper Large-v3-Turbo | 809M | 1.62 GB | 280 MB | — | ✓ | MIT |
Faster-Whisper Large-v3-Turbo (INT8) | 809M | 0.81 GB | 220 MB | — | ✓ | MIT |
Whisper Large-v3 | 1550M | 3.10 GB | 380 MB | — | ✓ | MIT |
Distil-Whisper Large-v3.5 | 750M | 1.50 GB | 250 MB | — | — | MIT |
| Model | Params | Weights | Per-session | Clone | RU | License |
|---|---|---|---|---|---|---|
OpenVoice v2 | 70M | 0.14 GB | 500 MB | ✓ | ✓ | MIT |
StyleTTS 2 | 130M | 0.26 GB | 250 MB | ✓ | — | MIT |
ChatTTS | 140M | 0.28 GB | 250 MB | — | — | AGPL-3.0 |
Kokoro TTS (Hexgrad) | 82M | 0.16 GB | 200 MB | — | — | Apache 2.0 |
Piper TTS (Rhasspy) | 50M | 0.10 GB | 80 MB | — | ✓ | MIT |
| GPU | VRAM | Class |
|---|---|---|
NVIDIA L4 | 24 GB | datacenter |
NVIDIA A10G | 24 GB | datacenter |
RTX 4090 | 24 GB | consumer |
RTX 5090 | 32 GB | consumer |
NVIDIA L40S | 48 GB | datacenter |
NVIDIA A100 40GB | 40 GB | datacenter |
NVIDIA A100 80GB | 80 GB | datacenter |
NVIDIA H100 80GB | 80 GB | datacenter |
NVIDIA H200 | 141 GB | datacenter |
NVIDIA B200 | 192 GB | datacenter |
Weights use fp16 / bf16 for the LLM and the precision set per STT / TTS. KV cache is held in FP16 (vLLM / TGI default) regardless of weight precision. Headroom of 10% on the picked GPU covers framework activation buffers and CUDA graph scratch — production deployments should also leave room for spikes in active context length.
How the GPU calculator works
- Model weights — held in VRAM once, regardless of session count. Quantization to INT8 halves the weight cost, INT4 (AWQ / GPTQ) quarters it.
- KV cache — the LLM stores per-token attention state for every active session.
Bytes per token =
4 × layers × kv_heads × head_dim(KV cache stays in FP16 even when weights are quantized — vLLM / TGI / SGLang default). - Session buffers — STT and TTS keep per-stream activation buffers; the size depends on the model architecture (autoregressive TTS like XTTS/Fish costs the most per session, encoder-only Whisper costs the least).
- GPU recommendation — the smallest GPU in our catalogue that fits the total VRAM with a 10% headroom margin. If nothing fits, drop precision, cut context, or split the model across GPUs with tensor parallelism.
Minimum machine sizing (at a glance)
Sized against the calculator above with backbone services enabled and the recommended 20–30% headroom included. CPU / RAM stays application-only — GPUs for self-hosted models are budgeted separately above.
| Load | Recommended VM(s) |
|---|---|
| Demo / dev (1 session) | 4 vCPU · 8 GB RAM · 50 GB SSD |
| Small (10 sessions) | 12 vCPU · 24 GB RAM · 150 GB SSD |
| Medium (50 sessions) | 32 vCPU · 48 GB RAM · 250 GB SSD |
| Large (250 sessions) | 160 vCPU · 160 GB RAM · 500 GB SSD (multi-node) |
| XL (500 sessions) | 320 vCPU · 300 GB RAM · 1 TB SSD (multi-node) |
For everything above 50 concurrent sessions we recommend splitting
livekit-server + python-worker onto their own hosts, so that media and agent
CPU load doesn't starve the backbone. Above 250 sessions the egress recording
pods and the turn-detector benefit from dedicated nodes too.