Self-Hosting a Voice AI Stack: Cost, Feasibility, and When It's a Mistake

Self-hosting a voice AI stack works in 2026. For most 30–100 person tech companies it is still the wrong first move.

It becomes right under three conditions:

Absent one of those, hosted or vendor-managed is cheaper, faster, and more reliable. The numbers here come from costing and prototyping this stack ourselves for a high-traffic e-commerce deployment.

Decide before you size anything

Self-hosting swaps a per-minute bill for a fleet of GPUs, a team to run them, and a pager.

Self-host if most hold:

Reconsider when:

One more gate: time. Hosted goes live in days. A self-hosted cascade is a months-long project: validate each layer, fine-tune the LLM until tool-calling holds, load-test the fleet. If speed to market is the constraint, the decision is already made.

Latency and escaping shared infrastructure

Response speed is a legitimate reason to move off a chained hosted pipeline, for two reasons that are easy to underrate.

You stop being a tenant on someone else's busy hour. A public API shares GPUs across every customer. At peak, your p99 rides their queue depth, their rate limits, and their regional load, none of which you control. Dedicated inference, self-hosted or in a vendor VPC, removes that variance. The median may not move much, but the tail gets predictable, and for voice the tail is what the caller hears as an awkward pause.

Colocation removes cross-provider hops. A cascade wired across three separate hosted APIs (STT, LLM, TTS in different clouds) pays a network round-trip and queueing between each layer. Placing all three in one region or VPC collapses that path.

The cheaper first step is a vendor VPC or single-region deployment, which delivers both wins without a self-owned GPU fleet. Full ownership buys the most control over the tail, at the cost of owning that tail yourself. The turn-latency breakdown lives in our latency budget guide.

Reliability cuts both ways

Availability compounds against you in a chained pipeline. Four independent hosted services at 99.9% each multiply to 0.999^4, about 99.6%; at 99% each, to about 96%. Every provider you add is another uncorrelated outage that can take the whole call down, and provider outages are events you cannot control or predict.

Consolidating the stack under one roof reduces the number of independent failure surfaces and lets you engineer fallback end to end, rather than living at the mercy of each vendor's separate SLA. The catch: a single self-hosted region is itself a single point of failure, and hosted providers give you multi-region redundancy per layer at no extra effort. Owning the stack raises effective uptime only if you actually build the redundancy, health checks, and provider fallback the SLA used to cover. Done well it beats the chained pipeline; done naively it is worse.

Four architectures hide under "self-hosted"

Pick the minimum tier that satisfies the hard constraint. A fully open-weight stack often buys nothing a vendor deployment or a BAA already delivered.

Tier Inside your boundary Best for Burden
Vendor self-host (VPC / on-prem) Vendor STT/TTS/LLM containers on your infra, vendor quality and support Data locality over model ownership Moderate
Hybrid Audio, STT, redaction on-prem; hosted frontier LLM under BAA on redacted text Frontier quality where policy permits a processor Moderate–high
Open-weight full stack STT, LLM, TTS, orchestration, logs, evals, all owned High steady volume or hard isolation High
Air-gapped No outbound model, license, or telemetry path Defense, government, contractual isolation Highest

Vendor self-host is the pragmatic regulated-enterprise option. Deepgram, AssemblyAI, Inworld, Cartesia, and ElevenLabs all ship private-deployment paths. AssemblyAI advertises self-hosted STT at "up to 48 concurrent streams," on the "same usage-based pricing as our cloud service." ElevenLabs: "VPC deployments are available now," with on-prem and on-device "in early access."

Two traps sit in the vendor path:

Media and orchestration are open at every tier. LiveKit is Apache-2.0; Pipecat is BSD 2-Clause. Neither replaces STT, LLM, TTS, evals, or compliance. Barge-in, turn-taking, retries, and tool-call timing live in this layer, and teams routinely under-budget it.

The stack, component by component

The cascade runs media into STT, STT into the LLM, the LLM into TTS, wrapped by orchestration, logging, and evals. Cascading is the only fully self-hostable option today (see real-time vs turn-based). The three models differ sharply in difficulty.

STT: the near-free win

Open-weight streaming recognition matches commercial APIs on the workload voice agents run.

Treat 7.67% as a screening ceiling. It is not a production number. Phone audio is 8 kHz narrowband, which clips the detail separating similar consonants and inflates WER. Upsampling cannot recover frequencies above 4 kHz that were never captured. The figure that matters comes from testing on your own call audio, with your accents, codecs, and noise. Full field in our STT/TTS selection guide.

TTS: deceptively hard

Tiny weights, friendly license: Kokoro has "82 million parameters," an "apache-2.0" license, and ships "8 & 54" languages and voices in v1.0. Then it gets hard.

Costing this for a high-traffic e-commerce deployment, these problems hit even on polished commercial TTS: mispronounced prices and measurements, numbers read as digit strings, punctuation causing wrong pauses, unnatural pacing. The fix was a runtime pronunciation-glossary and text-normalization layer in front of the TTS. A model swap would not have touched it. An open model without the vendor's built-in normalization needs more of that layer, not less.

Voice choice sets the hardware floor:

LLM: the real cost and the real quality gap

The best open-weight choice for real-time voice is a small-active-parameter mixture-of-experts model. NVIDIA's Nemotron 3 Nano has "3.5B active parameters and 30B total parameters," runs on vLLM, and carries an "nvidia-open-model-license." Its Mamba-2 layers hold a fixed-size recurrent state per session, so memory does not balloon with conversation length the way a dense KV cache does. That is what makes hundreds of concurrent sessions per GPU plausible.

Do not size GPUs from parameter count, because precision and runtime dominate. Lambda shows the BF16 checkpoint at "Weights-on-disk: 58GB" but "Idle VRAM usage: 120GB" on "1x B200 (180 GB SXM6)." The 4-bit NVFP4 variant is far smaller, though runtime, context length, and KV-cache mode set the real footprint. Load the exact checkpoint before budgeting.

The gap is about judgment rather than raw intelligence, and it is real. NVIDIA reports "TauBench V2 (Retail) 54.1" and "TauBench V2 (Airline) 41.5" for Nemotron 3 Nano, which leaves room for domain failures. Voice tool-calling has tighter tolerances than chat: a caller cannot inspect a reasoning trace, and a retry feels awkward.

In our production testing, a base small-MoE model's tool-calling was not production-ready out of the box. It struggled to decide when to ask a clarifying question versus proceed with a tool call, expected behavior for roughly 3.5B active parameters. Domain fine-tuning was mandatory. Larger open models improve instruction quality but run too slow and costly for real-time. The point of the small fast model is that fine-tuning closes the gap at a fraction of the inference cost. We offer that as a service. For model-versus-model depth, see choosing an LLM for voice agents and LLM selection for AI agents.

GPU capacity and cost

Peak concurrent calls size the fleet. Monthly minutes are the wrong input, because reserved capacity costs the same whether calls arrive or not.

required GPUs = ceil(peak concurrent calls / sessions per GPU) + redundancy
annual GPU cost = hourly GPU price x GPU count x 8760

Sessions per GPU is where planning breaks, and it is latency-bound rather than memory-bound. A GPU can hold hundreds of sessions in VRAM and still blow the turn budget on p95 latency before memory fills, because compute and bandwidth contention spike tail latency as sessions pile on. Google SRE guidance: a high percentile "shows you a plausible worst-case value," and "latency increases are often a leading indicator of saturation." Size against p95 and p99 turn latency under load, measured by benchmark.

Our modeled planning numbers, pending a load test on the exact stack. Every figure is a modeled estimate:

Hardware Workload Sessions per GPU
B200 homogeneous all three models 200–400
H100 LLM 40–75
A10G-class STT 100–200
A10G-class TTS 20–50

The 200-versus-400 gap per B200 changes annual cost roughly two-fold at high concurrency, which is why a one-week benchmark precedes any hardware commitment.

Two fleet shapes are viable:

GPU rates, checked in 2026 and moving monthly, so re-verify at deployment:

GPU Rate (per GPU/hr) Source
B200 SXM6 180GB $6.69 (8x) to $6.99 (1x) Lambda
B200 $5.89 RunPod
B200 (p6-b200 on-demand) ~$14.24 AWS, us-east-1
B200 (Capacity Blocks, eff. 2026-07-07) ~$10.30 AWS
H100 SXM 80GB $4.29 Lambda
A10 24GB $1.29 Lambda

Procurement carries its own risk. AWS on-demand P6-B200 lists "$113.9328 per On Demand Linux p6-b200.48xlarge Instance Hour," about $14.24 per GPU-hour, well above specialist GPU clouds. B200 is absent from GCP and the standard Azure catalog, so a homogeneous B200 fleet can mean single-provider dependence on a neo-cloud. Reserve capacity or design for an H100 fallback.

Modeled fleet sizing at three concurrency tiers:

Peak concurrent B200 homogeneous (200/GPU, N+1) H100 + A10G
10 2 B200 (redundancy dominates) 1 H100 + 1 A10G STT + 1 A10G TTS
100 2 B200 2–3 H100 + 1 A10G STT + 2–5 A10G TTS
500 4 B200 7–13 H100 + 3–5 A10G STT + 10–25 A10G TTS

One B200 running 24/7 is roughly $52,000/year (RunPod) to $58,600/year (Lambda 8x). A B200 pair looks expensive at 10 concurrent calls because redundancy dominates. It turns rational only at 100-plus steady calls per node, or when isolation is required regardless of cost.

All-in cost, and where the crossover sits

The GPU bill is the visible number. Two others decide it.

Telephony sits in every column. Twilio lists US "Local calls $0.0140 / min" outbound, "$0.0085 / min" inbound, and a "SIP interface $0.0040 / min" for bring-your-own-carrier trunking. That floor of half a cent to a cent and a half per minute applies to the managed platform, the hosted API pipeline, and the self-hosted fleet alike, unless you own SIP trunking and a session border controller.

Staffing moves the decision, and its cost depends entirely on who does the work. A self-hosted stack needs people who run GPU inference in production: vLLM or TensorRT-LLM serving, quantization, KV-cache and batching tuning, autoscaling, model-update pipelines, and the eval harness. Three ways to cover it, at very different cost:

The cost tables below assume the expensive net-new path. If an existing team absorbs the work, or a consultancy runs it, the staffing line shrinks and self-hosting turns competitive at far lower volume than the tables imply.

Our modeled all-in monthly comparison. Concurrency is minutes divided by 43,200 per always-busy line per month; peaks run 2–5x the average:

Small ~50k min (~1–2 avg) Mid ~500k min (~12 avg) Large ~3M min (~70 avg)
Managed platform (~$0.08/min + tel.) ~$4.5K ~$45K ~$270K
Self-assembled hosted API (~$0.03–0.05/min) ~$1.5–2.5K ~$15–25K ~$90–150K
Self-hosted inference + telephony GPUs $2–6K + staff $25–40K → ~$28–46K GPUs $8–20K + staff → ~$37–64K GPUs $30–70K + staff → ~$80–135K

Three conclusions follow:

Average concurrency understates the requirement. A 500k-minute month averages about 12 concurrent calls across 24/7, but about 43 if traffic compresses into business hours, before any burst headroom. You size and pay for the peak.

For a hosted anchor, OpenAI's Realtime pricing lists "gpt-realtime-2 Audio $32.00" per million audio input tokens and "$64.00" output, down from the 2024 launch "$100 per 1M tokens" input. By OpenAI's own token-duration rule, a balanced call (a minute of user speech, thirty seconds of assistant speech) works out to roughly $0.058/min before text tokens, tools, telephony, and margin. Cost also grows within a session, because "the entire conversation is sent to the model for each Response," so "turns later in the session will be more expensive." The full break-even model lives in our analysis of voice agent running costs.

The quality you give up

Quality splits by component. The answer is not uniform.

Match the decision to how open-ended the conversation is. A tight, scriptable surface such as intake, ordering, or scheduling loses little to self-hosting. Open-ended conversation loses a lot. Measure quality as business outcome, resolution rate, containment, conversion, and post-call human repair, rather than model-card WER.

When compliance actually forces it

Many buyers assume regulated data mandates on-prem inference. Usually it does not. The normal path is a BAA for HIPAA or a DPA for GDPR at each layer, far cheaper than owning GPUs.

HHS allows cloud PHI processing. A covered entity may use a cloud service for ePHI "provided the covered entity enters into a HIPAA-compliant business associate contract" and "must conduct risk analyses." The obligation survives encryption: a CSP is a business associate "even if the CSP processes or stores only encrypted ePHI" and "lacks an encryption key." So "we encrypt before sending" does not remove the contract requirement if the vendor will not sign.

Every layer vendor signs:

GDPR points the same way. Article 28 requires a "processor providing sufficient guarantees" under a relationship "governed by a contract," which a DPA and data-residency controls satisfy for many EU-data scenarios. The FTC Safeguards Rule requires that "service providers safeguard customer information," and banking regulators treat AI vendors as third-party risk to manage rather than infrastructure to forbid.

Private connectivity can substitute for ownership. AWS Bedrock supports "a private connection between your VPC and Amazon Bedrock" with no internet gateway, and states Bedrock "never shares your data with model providers." That satisfies many "data cannot traverse the public internet" clauses without self-hosting a model.

What actually forces self-hosting is narrow:

The theater trap

The most common self-hosting mistake is paying for on-prem inference while the same sensitive data leaves through another door.

If the call rides a hosted carrier, the raw audio, the PHI or PII itself, already left your building at the carrier. Twilio describes PSTN as a "worldwide network of voice-carrying telephone infrastructure," and a public phone call is not a private path. Self-hosting the models behind a hosted carrier, without the carrier BAA or an owned SIP path, buys nothing on the privacy driver that motivated it.

This inverts the intuitive design. For a privacy driver, the exposure sits in the audio-touching layers, the carrier and STT, and only secondarily in the LLM. The minimum-viable private build is frequently to own the media path, STT, and redaction, and keep the hosted LLM under a BAA if only redacted text reaches it. Map every data class (raw audio, transcripts, tool payloads, recordings, logs) against every component before choosing a tier.

What operating it takes

Self-hosting replaces vendor failover with reliability work you own. A GPU node dying mid-call is your incident, and you build the health checks, autoscaling, provider fallback, and on-call rotation that a hosted SLA covered. As the compounding-availability math above shows, that ownership can raise end-to-end uptime, but only if the redundancy is actually built. Budget for it explicitly.

A production stack needs named owners across distinct functions:

A vendor-self-hosted deployment can run with 2–3 technical owners plus existing platform support. A full open-weight stack needs 3–5 named owners. They need not all be full-time in steady state, but each function needs real ownership. A 30-person company without GPU and SRE maturity should rarely own the full stack unless voice is strategic product infrastructure.

The recurring costs beyond hardware and salary are easy to miss:

Start reversible

The decision is not all-or-nothing on day one. Design the cascade with swappable STT, LLM, and TTS behind clean interfaces, so each component can move on-prem incrementally without a rebuild. Start hosted or vendor-self-hosted, prove the product, and migrate the regulated layer later when a hard driver or validated volume justifies it.

Before committing to a GPU or vendor contract, run the one-week benchmark: the exact stack under 10, 50, 100, 200, and 500 synthetic sessions, measuring p95 and p99 turn latency, first-audio and first-token latency, GPU utilization, and error rate, under realistic 8 kHz telephony audio and barge-in rather than happy-path turns. The difference between 100 and 250 sessions per GPU is six figures a year at high concurrency. Guessing is not diligence.

If a hard data-boundary rule, steady high volume, or a strategic model-control need points you toward owning this infrastructure, we run an on-prem feasibility assessment: the data-flow matrix, the tier decision, the fleet-sizing benchmark, and the real cost premium, before you commit budget. That is the work we do at Softcery's on-premises voice infrastructure practice.