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.

Service1 session10 sessions50 sessions250 sessions500 sessions
livekit-server
WebRTC SFU — media plane for every active call
300 m · 532 MB · 1.0 GB750 m · 712 MB · 1.0 GB2.75 vCPU · 1.5 GB · 1.0 GB12.75 vCPU · 5.4 GB · 1.0 GB25.25 vCPU · 10.3 GB · 1.0 GB
python-worker
LiveKit voice agent (LLM/STT/TTS orchestration + ffmpeg)
650 m · 1.2 GB · 1.0 GB2.00 vCPU · 3.1 GB · 1.0 GB8.00 vCPU · 11.7 GB · 1.0 GB38.00 vCPU · 54.7 GB · 1.0 GB75.50 vCPU · 108.4 GB · 1.0 GB
egress
LiveKit recording / transcoding (optional)
1.20 vCPU · 2.1 GB · 2.1 GB3.00 vCPU · 3.0 GB · 2.6 GB11.00 vCPU · 6.9 GB · 5.0 GB51.00 vCPU · 26.4 GB · 17.0 GB101.00 vCPU · 50.8 GB · 32.0 GB
turn-detector
Remote semantic EOU classifier (ONNX, smart_turn_v3)
1.05 vCPU · 783 MB · 0.5 GB1.50 vCPU · 918 MB · 0.5 GB3.50 vCPU · 1.5 GB · 0.5 GB13.50 vCPU · 4.4 GB · 0.5 GB26.00 vCPU · 8.1 GB · 0.5 GB
df-denoise
DeepFilterNet noise suppression (optional)
350 m · 350 MB · 0.5 GB1.25 vCPU · 800 MB · 0.5 GB5.25 vCPU · 2.7 GB · 0.5 GB25.25 vCPU · 12.5 GB · 0.5 GB50.25 vCPU · 24.7 GB · 0.5 GB
media-bridge
WebSocket ↔ LiveKit audio bridge (Voximplant / Twilio inbound)
130 m · 271 MB · 0.5 GB400 m · 406 MB · 0.5 GB1.60 vCPU · 1006 MB · 0.5 GB7.60 vCPU · 3.9 GB · 0.5 GB15.10 vCPU · 7.6 GB · 0.5 GB
sip + sip-public
LiveKit SIP gateway (inbound + outbound trunks)
220 m · 522 MB · 0.5 GB400 m · 612 MB · 0.5 GB1.20 vCPU · 1012 MB · 0.5 GB5.20 vCPU · 2.9 GB · 0.5 GB10.20 vCPU · 5.4 GB · 0.5 GB
asp-net-backend
Main API (.NET 9, EF Core, SignalR)
510 m · 1.0 GB · 5.0 GB600 m · 1.0 GB · 5.0 GB1.00 vCPU · 1.2 GB · 5.0 GB3.00 vCPU · 2.2 GB · 5.0 GB5.50 vCPU · 3.4 GB · 5.0 GB
keycloak
OAuth2 / OIDC authentication
500 m · 768 MB · 2.0 GB500 m · 768 MB · 2.0 GB500 m · 768 MB · 2.0 GB500 m · 768 MB · 2.0 GB500 m · 768 MB · 2.0 GB
postgres
Main + Lago + Keycloak + Hangfire DBs
505 m · 1.5 GB · 20.0 GB550 m · 1.5 GB · 20.0 GB750 m · 1.6 GB · 20.1 GB1.75 vCPU · 2.0 GB · 20.8 GB3.00 vCPU · 2.5 GB · 21.5 GB
redis
LiveKit pubsub, backend cache, queues
105 m · 259 MB · 8.0 GB150 m · 286 MB · 8.0 GB350 m · 406 MB · 8.0 GB1.35 vCPU · 1006 MB · 8.0 GB2.60 vCPU · 1.7 GB · 8.0 GB
kafka
Event streaming (spans, webhooks, analytics)
505 m · 1.0 GB · 20.0 GB550 m · 1.0 GB · 20.1 GB750 m · 1.2 GB · 20.5 GB1.75 vCPU · 2.2 GB · 22.5 GB3.00 vCPU · 3.4 GB · 25.0 GB
webhook-receiver
Accepts inbound webhooks (Lago, LiveKit, Twilio)
200 m · 256 MB · 1.0 GB200 m · 256 MB · 1.0 GB200 m · 256 MB · 1.0 GB200 m · 256 MB · 1.0 GB200 m · 256 MB · 1.0 GB
angular-client + widget
Static frontends (nginx)
100 m · 256 MB · 0.5 GB100 m · 256 MB · 0.5 GB100 m · 256 MB · 0.5 GB100 m · 256 MB · 0.5 GB100 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 GB1.00 vCPU · 1.6 GB · 5.0 GB1.00 vCPU · 1.6 GB · 5.0 GB1.00 vCPU · 1.6 GB · 5.0 GB1.00 vCPU · 1.6 GB · 5.0 GB
object storage (S3 / MinIO)
Recordings, transcripts, debug artefacts
200 m · 256 MB · 20.1 GB200 m · 256 MB · 20.6 GB200 m · 256 MB · 23.0 GB200 m · 256 MB · 35.0 GB200 m · 256 MB · 50.0 GB
logging (ES + Kibana + Benthos + otel)
Optional observability stack
1.00 vCPU · 2.0 GB · 50.0 GB1.03 vCPU · 2.0 GB · 50.0 GB1.15 vCPU · 2.1 GB · 50.1 GB1.75 vCPU · 2.5 GB · 50.8 GB2.50 vCPU · 3.0 GB · 51.5 GB
Total8.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:

CPU
39.30 vCPU
RAM
36.0 GB
Disk
144.3 GB

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.

LLM presets
ModelTypeParamsWeights @FP16KV @8KLicense
gpt-oss-120B (MoE)MoE (5.1B active)117B234 GB0.60 GBApache 2.0
Qwen3-30B-A3B (MoE)MoE (3.3B active)30.5B61.0 GB0.81 GBApache 2.0
GLM-4.7 (Z.ai, MoE)MoE (32B active)355B710 GB3.22 GBMIT
Llama-3.3-Nemotron-Super-49B-v1.5Dense49B98.0 GB2.68 GBNVIDIA Open Model
Llama 3.3 70BDense70.6B141 GB2.68 GBLlama Community
Llama 4 Scout (MoE)MoE (17B active)109B218 GB1.61 GBLlama 4 Community
Mistral Small 3.1 24BDense24B48.0 GB1.34 GBApache 2.0
Gemma 3 27BDense27B54.0 GB4.16 GBGemma Terms
DeepSeek-R1-Distill-Qwen-32BDense32.8B65.6 GB2.15 GBMIT (distill)
DeepSeek-V4-Flash (MoE)MoE (13B active)284B568 GB1.07 GBMIT
STT presets
ModelParamsWeightsPer-sessionStreamingRULicense
NVIDIA Nemotron-3.5-ASR Streaming 0.6B (multilingual)600M1.20 GB200 MBNVIDIA Open Model
NVIDIA Parakeet-TDT 0.6B-v3 (multilingual)600M1.20 GB250 MBCC-BY-4.0
NVIDIA Canary-1B-v21000M2.00 GB450 MBCC-BY-4.0
NVIDIA Parakeet-TDT 1.1B (EN-only)1100M2.20 GB320 MBCC-BY-4.0
Whisper Large-v3-Turbo809M1.62 GB280 MBMIT
Faster-Whisper Large-v3-Turbo (INT8)809M0.81 GB220 MBMIT
Whisper Large-v31550M3.10 GB380 MBMIT
Distil-Whisper Large-v3.5750M1.50 GB250 MBMIT
TTS presets
ModelParamsWeightsPer-sessionCloneRULicense
OpenVoice v270M0.14 GB500 MBMIT
StyleTTS 2130M0.26 GB250 MBMIT
ChatTTS140M0.28 GB250 MBAGPL-3.0
Kokoro TTS (Hexgrad)82M0.16 GB200 MBApache 2.0
Piper TTS (Rhasspy)50M0.10 GB80 MBMIT
GPU catalogue
GPUVRAMClass
NVIDIA L424 GBdatacenter
NVIDIA A10G24 GBdatacenter
RTX 409024 GBconsumer
RTX 509032 GBconsumer
NVIDIA L40S48 GBdatacenter
NVIDIA A100 40GB40 GBdatacenter
NVIDIA A100 80GB80 GBdatacenter
NVIDIA H100 80GB80 GBdatacenter
NVIDIA H200141 GBdatacenter
NVIDIA B200192 GBdatacenter
GPU layer — self-hosted models (configured below)
Model weights
235 GB
loaded once
KV × 1
9.66 GB
LLM, FP16
Buffers × 1
0.68 GB
STT + TTS
Total VRAM
246 GB
Recommended GPU: 2 × NVIDIA B200 (192 GB, datacenter) — tensor-parallel, ≈ 129 GB per GPU.
LLM
117B total · 5.1B active (MoE)
Weights 234 GB · KV cache per session 9.66 GB
STT
streaming · RU ✓
Weights 1.20 GB · per session 200 MB
TTS
voice clone · RU ✓
Weights 0.14 GB · per session 500 MB

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.

LoadRecommended 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.

On this page