PhoneLLM Alpha 1: A Deep Dive into Self-Hosted Voice AI

Back to blog
Mehran Mozaffari·

What PhoneLLM Actually Is

PhoneLLM is not what a lot of people assume it is when they hear "voice model." It is not an end-to-end speech-to-speech model. It does not consume audio. It does not produce audio. It is a text-based LLM, fine-tuned specifically to serve as the conversational brain in a cascaded voice pipeline, sitting between a speech-to-text engine and a text-to-speech engine.

The base model is Nemotron-3-Nano-30B-A3B, and the architecture is what makes it interesting. It's a hybrid Mamba-2 (State Space Model) + Transformer Mixture-of-Experts (MoE) design. Total parameters sit at roughly 30 billion, but only about 3.5 billion are active per token. That active-parameter count is what you pay in compute on every token generated. The context window is massive — up to 262,144 tokens — which matters for long calls where you want the full conversation history available without truncation.

The critical distinction to internalize: this model has zero acoustic awareness. It never hears your tone, your breathing, or the fact that you started laughing mid-sentence. When you speak, the STT engine transcribes your audio into text. That text goes to PhoneLLM. The model generates a text response. That text goes to a TTS engine, which synthesizes speech. If the STT mishears a word or mangles a name, PhoneLLM has no access to the original audio to correct course. It only sees the transcript.

That's not a flaw — it's a design choice. The trade-off is that you get modularity, inspectability, and control over each stage of the pipeline. You can swap STT providers, log transcripts for compliance, redact sensitive data before it ever reaches the model, and enforce structured tool-calling behavior with deterministic guardrails. You lose the paralinguistic richness that native audio models handle naturally, but you gain the operational control that regulated enterprises need.

If you're expecting GPT-4o Realtime or Gemini Live behavior — fluid interruptions, prosody modulation, natural backchanneling — PhoneLLM will not deliver that. It delivers something else: a sub-second, self-hostable, voice-specialized text model that slots into your existing cascaded architecture.

The Cascaded Pipeline: Where PhoneLLM Fits and Why

The pipeline is the thing to understand. PhoneLLM does nothing in isolation—it's one component in a chain, and the chain's latency is only as good as its slowest link.

flowchart LR
    A[Audio Input] --> B[STT<br/>e.g., Deepgram<br/>~100-250ms]
    B --> C[PhoneLLM<br/>Nemotron-3-Nano-30B-A3B<br/>~150-300ms TTFT]
    C --> D[TTS<br/>e.g., Cartesia<br/>~50-150ms first chunk]
    D --> E[Audio Output]
    
    C -- generates text tokens<br/>streamed directly into TTS --> D
    
    style C fill:#fff3cd,stroke:#d4a017,stroke-width:2px
    style B fill:#e8f4fd,stroke:#4a90d9,stroke-width:1px
    style D fill:#e8f4fd,stroke:#4a90d9,stroke-width:1px

Let me break down what each hop contributes. STT on telephony audio (8kHz, G.711 codec, background noise) typically adds 100–250ms to get a usable transcript. PhoneLLM's time-to-first-token is the next chunk — the model needs to process the transcript and generate the first output token, which lands in the 150–300ms range on properly configured hardware. TTS then takes a further 50–150ms to synthesize the first audio chunk. Sum those up and you're looking at roughly 300–700ms end-to-end before the caller hears anything, which is why the reported P95 of ~600ms makes sense.

Now compare that against native S2S models. GPT-4o Realtime and Gemini Live consume audio directly, so they skip the STT and TTS hops entirely. That's how they get to sub-300ms turn-taking. Moshi, Kyutai's open-weights alternative, does the same with dual-stream audio architectures and hits sub-200ms on dedicated GPUs.

But here's what the S2S models don't give you: control. When you use GPT-4o Realtime, your audio streams leave your infrastructure and land on OpenAI's servers, subject to their data retention policies. For a healthcare provider handling PHI, or a bank dealing with account details over the phone, that's often a non-starter. Even if the vendor offers HIPAA compliance, you're still trusting a third party with regulated data and paying per-minute rates that scale with your call volume.

PhoneLLM's answer is that you run the entire pipeline yourself — STT, model, TTS — inside your VPC or on-prem cluster. Your audio stays in your network. Your transcripts stay in your logs. Your compliance posture is a function of your own engineering rather than a vendor's terms of service.

The cost is the modularity you've signed up for. You're responsible for every hop's latency, for the STT engine's accuracy on telephony audio, for the TTS engine's chunking behavior, and for the orchestration layer that strings it all together. That's why the pipeline diagram above matters — it's not just a nice visual; it's the actual architecture you'll be debugging in production when a call feels sluggish.

Architecture Deep Dive: Mamba-2 + MoE and Why It Matters for Voice

The reason PhoneLLM can claim sub-second latencies while carrying a 30B parameter footprint is the hybrid Mamba-2 + MoE design. This isn't marketing fluff — it's a concrete engineering answer to two specific constraints in voice pipelines.

sequenceDiagram
    participant User as User Audio
    participant STT as STT Engine
    participant PhoneLLM as PhoneLLM
    participant Mamba as Mamba-2 SSM Layers
    participant MoE as MoE Transformer Blocks
    participant TTS as TTS Engine
    participant API as External API

    User->>STT: Utterance (audio)
    STT->>PhoneLLM: Transcript (text)
    
    activate PhoneLLM
    PhoneLLM->>Mamba: Process context sequence (linear scaling)
    Mamba-->>PhoneLLM: Context representation
    PhoneLLM->>MoE: Activate ~3.5B params per token
    MoE-->>PhoneLLM: Token generated
    
    Note over PhoneLLM,TTS: First token streamed immediately
    PhoneLLM->>TTS: Token(s) streamed for synthesis
    TTS-->>User: Audio response (first chunk)
    
    Note over PhoneLLM: Tool call path
    PhoneLLM->>MoE: Emit function call token
    MoE-->>PhoneLLM: Function call generated
    PhoneLLM->>API: Execute external tool (CRM lookup, etc.)
    
    Note right of API: ~800ms external I/O
    API-->>PhoneLLM: Tool result
    
    PhoneLLM->>MoE: Continue generation (token 2, 3, ...)
    MoE-->>PhoneLLM: Filler text generated ("Let me check that...")
    PhoneLLM->>TTS: Filler tokens streamed
    TTS-->>User: Filler speech ("Let me check that for you...")
    
    deactivate PhoneLLM
    PhoneLLM->>MoE: Final response tokens
    MoE-->>PhoneLLM: Response completed
    PhoneLLM->>TTS: Final response streamed
    TTS-->>User: Audio response (complete)

Let me unpack what's happening here.

On the Mamba-2 side: State Space Models process sequences with linear complexity, meaning the state doesn't grow as a function of context length. In a standard dense transformer, every token attends to every previous token — the KV cache grows linearly, and the attention matrix is quadratic in compute for a full sequence. For a voice call that's stretched across 20 minutes of conversation, the context is huge, and dense transformer KV caches balloon in memory, which directly inflates prefill time on subsequent turns. Mamba-2's recurrent structure means the context representation is a fixed-size state vector, scaled sub-linearly. Long conversations don't blow up your memory or your prefill.

On the MoE side: Mixture-of-Experts means the model doesn't activate all its parameters for every token. It routes each token through a learned gate to select which expert blocks process it. With ~30B total parameters but only ~3.5B active per token, you're executing roughly 12% of the weights' worth of compute on each generation step. That's the difference between needing a multi-GPU setup for a dense 30B model and running this on a single high-end GPU with tensor parallelism across 2–4 cards.

Compare that to Llama-8B, which is the most common general-purpose alternative for local voice pipelines. Llama-8B has a dense transformer architecture. Its KV cache grows linearly with context, so on long calls you hit prefill latency spikes. It's not fine-tuned for conversational brevity, so without heavy prompt engineering it generates paragraph-length responses that balloon generation time. You can constrain it with system prompts, but those prompts themselves burn TTFT on every request. PhoneLLM's supervised fine-tuning directly penalizes verbosity — it's trained to produce concise, spoken-style responses that don't ramble.

The implications for TTFT and ITL are real. PhoneLLM's Mamba-2 layers process the context fast because state is fixed-size. The MoE routing keeps per-token compute low. And the fine-tuning ensures the model doesn't generate 300 tokens when 40 would do.

There's a caveat worth calling out: the full 30B weight footprint still has to live in GPU VRAM. Even though only 3.5B parameters are active per token, you need ~60–80GB of VRAM for unquantized weights plus activation states, SSM state buffers, and KV caches. That means an A100/H100 with 80GB or a multi-GPU setup — not the 16GB card that runs an 8B dense model comfortably. The compute per token is low, but the memory footprint is not small. If someone tells you this model fits on a consumer GPU, they're talking about quantized versions, and quantization of hybrid SSM/MoE architectures can destabilize the Mamba-2 state representations and degrade MoE gating routing. I'd benchmark degradation before trusting a quantized deployment in production.

Latency: The Real Numbers and What They Mean

The reported ~600ms P95 end-to-end latency is the number that gets quoted, but it's worth unpacking what that actually comprises, because it's not a single measurement—it's the sum of four independent stages, each with its own failure modes. When I look at this for a production deployment, I think in terms of the worst-case path, not the happy path.

For a single conversational turn, here's what you're typically looking at:

Latency Component PhoneLLM (cascaded) General Open LLM (Llama-3.1-8B) Native S2S Cloud (GPT-4o Realtime)
STT / Audio Input 100–200ms (telephony transcription) 100–200ms (same STT dependency) ~0ms (audio consumed natively)
LLM First Token 50–150ms (TTFT with Mamba-2 SSM) 100–250ms (TTFT with dense KV cache prefill) ~0ms (no text intermediary)
Token Generation ~20–40ms per token (3.5B active) ~30–60ms per token (8B dense) ~10–30ms per acoustic token
TTS / Audio Output 50–100ms (first chunk synthesis) 50–100ms (same TTS dependency) ~0ms (audio generated natively)
Total P95 Turnaround ~300–700ms ~400–900ms ~200–300ms

The gap between PhoneLLM and native S2S is roughly 300–400ms. That's not nothing—it's perceptible as a slight hesitancy before the agent starts speaking. But here's what that gap buys you: every hop in the cascade is individually inspectable. You can see exactly what the STT transcribed. You can log the LLM's raw text response. You can redact sensitive data before it hits the TTS engine. If a call goes wrong, you have an auditable trail of exactly what each stage did.

What the table doesn't show is what happens when you add complexity. Barge-in cancellation, for instance, can add 100–300ms of recovery time depending on how quickly your orchestrator aborts the LLM generation. Tool calls introduce external I/O that can be 800ms or more. And context length—even though PhoneLLM supports 262k tokens—blows up prefill time on long calls if you let the history grow unbounded. A 20-minute call at a 4k-token context is fine. The same call at 20k tokens can double your TTFT.

The real engineering question isn't "can PhoneLLM hit 600ms?"—it can. The question is "can your pipeline hit 600ms with barge-in enabled, tool calls firing, and a 30-minute conversation history?" That's where the cascaded architecture's weaknesses surface. Your orchestration layer—Pipecat, LiveKit, or whatever you're using—has to handle cancellation, filler generation, and context management simultaneously, because the model itself won't do it for you.

Tool Calling and Telephony Integration

PhoneLLM's tool-calling behavior is where its voice-specialized fine-tuning shows the most tangible benefit. The model was tuned on PhoneBench specifically for telephony intent extraction, conversational flow management, and tool execution—which means it's not just "a model that can call functions." It's a model trained to recognize that a caller asking to cancel an appointment is a specific intent that maps to a specific API call, and that it should invoke that call with minimal preamble.

The custom tool format uses a Jinja template with <tools>, <function>, <name>, and <description> blocks rather than the standard JSON schema function-calling format used by OpenAI and Anthropic. That's deliberate—the structured XML-like format is easier for a smaller active-parameter model to parse reliably than deeply nested JSON schemas. But it also means you're locked into a specific format that your orchestration layer must generate correctly, and the model must emit correctly.

The failure mode I'd watch for is schema overload. With ~3.5B active parameters, the model's capacity for reasoning about complex tool definitions is limited. When you supply more than 5–10 tool schemas simultaneously, especially ones with deeply nested parameters, the model starts generating malformed tool payloads or hallucinating parameters that don't exist. I've seen this pattern with other small MoE models—it's a capacity ceiling, not a prompt-engineering problem. The mitigation is to keep your tool set lean and active-intent-scoped: only expose the tools relevant to the current conversational context, not every API you have.

The dead-air problem during tool execution is the other gotcha. When PhoneLLM invokes a CRM lookup and the API takes 800ms, the caller hears silence unless your orchestration layer generates filler speech before the tool call completes. The model is tuned to generate brief acknowledgments ("Let me check that for you...") as part of its conversational fine-tuning, but it can't do that if your pipeline blocks on the tool call before streaming anything. Your orchestrator needs to either pre-emptively generate a filler phrase, or run the tool call in parallel with the model continuing its response generation.

stateDiagram-v2
    [*] --> Idle
    Idle --> User_Speaking: Caller starts talking (VAD triggers)
    User_Speaking --> STT: Utterance complete (endpointing, 100-200ms)
    STT --> LLM_Thinking: Transcript ready (50-150ms TTFT)
    
    LLM_Thinking --> Tool_Executing: Model emits function call
    LLM_Thinking --> LLM_Generating: Model generates text response
    
    Tool_Executing: External I/O (800ms+)<br/>Optional filler streamed concurrently
    Tool_Executing --> LLM_Generating: Tool result returns (200-300ms)
    
    LLM_Generating: Token generation (20-40ms/token)
    LLM_Generating --> TTS_Speaking: First token streamed (50-100ms)
    
    TTS_Speaking --> User_Speaking: Barge-in detected (VAD, 50ms)<br/>Cancels LLM generation
    TTS_Speaking --> Idle: Response complete (silence)
    
    User_Speaking --> Idle: Call ends

The barge-in path is where the sequence diagram gets interesting. When a caller interrupts, your VAD detects the onset of speech and needs to cancel the LLM's generation immediately. That requires your inference engine to support request preemption or stream abortion—if your serving layer doesn't handle that, the GPU keeps generating tokens in the background, wasting compute and delaying the next turn when the caller's interruption is processed.

Failure Modes in Production: What I'd Watch For

The first thing I'd check with any new hybrid architecture deployment is kernel support drift. vLLM and SGLang are heavily optimized for standard dense transformers and conventional MoE architectures, but the Mamba-2 + MoE hybrid needs specialized CUDA kernels—Triton-based causal SSM kernels, custom MoE routing kernels, and the integration between them. If your specific version of vLLM or SGLang doesn't have these kernels compiled or supported, the engine silently falls back to unoptimized paths. The symptom is a TTFT that spikes from <100ms to >1500ms under load, or runtime kernel panics during high concurrency. The mitigation is to pin your inference engine version and validate kernel support at deployment time, not discover it mid-production.

VRAM sizing is the second traps. The "3.5B active parameters" number gets quoted a lot, but the full 30B weight footprint has to reside in GPU memory regardless of how many are active per token. Unquantized in FP16/BF16, that's 60GB+ just for weights, and you need additional headroom for activation states, SSM state buffers, and KV caches. You're looking at an 80GB GPU at minimum (A100/H100) or tensor parallelism across multiple cards. If someone claims you can run this on a 24GB consumer card, they're either using aggressive quantization or they haven't benchmarked it properly.

Quantization degradation is subtle and dangerous. The hybrid Mamba-2 + MoE architecture has two components that quantization can destabilize: the SSM recurrent state representations and the MoE gating routers. Post-training quantization with AWQ, GPTQ, or FP8 can degrade these in ways that manifest as conversational degeneration, repetitive loops, or loss of tool-calling precision. The model might still produce coherent text, but its ability to select the right expert block for a given token—or to maintain a coherent recurrent state across long contexts—gets compromised. I'd benchmark quantization degradation thoroughly before trusting a compressed deployment with real callers.

STT error cascades are the architectural Achilles' heel. Since PhoneLLM operates purely on text transcripts, it has no acoustic context to correct phonetic misinterpretations. When a telephony STT engine mishears "cancel my appointment on Tuesday" as "cancel my appointment on Thursday," the model has no way to recover. It may hallucinate a conversational repair ("I see you want to cancel your Thursday appointment") that confirms the wrong intent, or worse, trigger a destructive tool call based on the misheard input. Native S2S models have access to the raw audio and can catch these mismatches. The only mitigation in a cascaded pipeline is STT confidence scoring and intent confirmation loops for high-stakes actions.

Markdown clutter is a mundane but infuriating failure. Even with fine-tuning aimed at conversational output, models sometimes emit **bold**, # headers, or bullet points. Your TTS engine will read those literally: "asterisk asterisk bold asterisk asterisk." The fix is twofold—strict system prompt constraints to discourage formatting, plus an output regex sanitizer that strips markdown before tokens reach the TTS stream. This is the kind of thing you'll only catch in production when a caller reports hearing "asterisk asterisk" mid-conversation.

Zombie inference during barge-in is the compute-waste problem. When a caller interrupts, your orchestration layer sends a cancellation, but if your serving stack doesn't support stream preemption, the GPU continues generating tokens for a response the caller will never hear. Those tokens waste compute, and worse, they queue up in the request slot and delay subsequent turns. The mitigation is an inference engine that supports request abort, and your orchestrator needs to invoke it promptly—not just drop the stream but actively terminate the generation job.

Comparing PhoneLLM with the Alternatives

The tradeoff matrix below is the cleanest way to see where PhoneLLM sits in the landscape. It's not the best model in any single dimension—it's the best model for a specific configuration of constraints.

Tradeoff Dimension PhoneLLM Alpha 1 General Open LLMs (Llama-3.1-8B) Native S2S Cloud (GPT-4o Realtime)
Data Governance & Compliance Full Control: Deployable on private VPC / air-gapped clusters via SGLang/vLLM. Full Control: Standard deployment on any inference engine. Zero Host Control: Audio streams sent to proprietary vendor endpoints; subject to cloud data retention policies.
Hardware Footprint (VRAM) Moderate-High: Despite 3.5B active params, storing the ~30B total weights requires ~60GB–80GB VRAM (unquantized) or ~20GB–24GB (INT4/FP8). Low-Moderate: 8B dense model fits comfortably in ~16GB VRAM (FP16) or 8GB (INT8). Zero: Fully offloaded to provider infrastructure.
Inference Latency Profile High efficiency: ~3.5B active params per token + Mamba-2 SSM reduces KV-cache latency on long calls. Moderate: Standard Dense Transformer attention; KV cache grows linearly with context. Fastest: Single network hop, no STT/TTS serialization overhead.
Conversational Dynamics Text-mediated: Turn-taking governed by external VAD/endpointing in orchestration frameworks (e.g., Pipecat). Text-mediated: Governed by prompt instructions and external VAD. Acoustic-native: Model naturally hears user breathing/interruptions and dynamically modulates prosody.
Tool / Telephony Reliability High (Fine-tuned): Tuned on PhoneBench for telephony actions (call transfer, CRM lookups, digit collection). Variable: Dependent on prompt format and model's general tool-calling capability. Moderate-High: Cloud function calling supported, but S2S can occasionally struggle with structured schema compliance.
Ecosystem Lock-In Open (BSD-2/Nvidia Open): Interoperable with any telephony stack (Asterisk, FreeSWITCH, Twilio, Daily, LiveKit). Open: Universal model support across all runtimes. High: Proprietary WebRTC/WebSocket protocols and vendor-bound pricing per minute.

Where PhoneLLM wins decisively is the combination of control and tool reliability. You keep the audio on your infrastructure, and you get a model that's actually tuned for the kind of structured telephony actions—transfers, CRM lookups, digit collection—that general-purpose LLMs handle inconsistently without heavy prompt engineering. The PhoneBench tuning is the difference between a model that can call functions and one that reliably emits the right tool call for "cancel my appointment" without hallucinating a parameter that doesn't exist.

Where it loses is paralinguistic understanding. It has zero awareness of tone, emotion, or the fact that you were mid-laugh when you said "no, actually, keep the appointment." That's a real limitation for customer-facing interactions where sentiment matters. And the hardware footprint is genuinely significant—30B weights is not a 24GB-card deployment, and you'll need A100/H100-class hardware to do this properly.

The ecosystem story is where PhoneLLM's open licensing matters most. Pipecat handles the WebRTC/SIP orchestration, VAD, and endpointing. LiveKit is the alternative if you're already embedded in that stack. On the telephony side, Twilio, Asterisk, and FreeSWITCH all work because the model is just text in/text out—there's no proprietary protocol lock-in. You're not paying per-minute for the model itself, which matters a lot at enterprise call volumes.

Project Application Ideas for the Reader

The most natural fit for PhoneLLM is a self-hosted appointment booking agent for a healthcare clinic. The architecture is straightforward: Pipecat for orchestration and VAD, Deepgram for STT on 8kHz telephony audio, PhoneLLM served on vLLM or SGLang on an A100, a fast TTS like Cartesia, and a tool that hits your calendar API for availability lookup and booking. You'd want the tool schemas kept deliberately simple—only expose the relevant calendar operations for the current context, not your entire reservation system. The gotchas I'd watch for: STT accuracy on medical terms ("dermatology" vs. "dermatologist" is a real problem at 8kHz with line noise), barge-in during the confirmation step (if the caller interrupts mid-confirmation, you need clean cancellation and a re-prompt), and the dead-air gap during the availability lookup. That CRM query might take 500ms, and the caller hears silence unless you stream filler speech ("Let me check the schedule for you...") while the tool executes. Test heavily with callers who interrupt, with noisy lines, with long names, with medication names.

The second project that makes sense is a voice-based CRM updater for sales teams. Instead of the agent being the caller-facing bot, you're the bot that listens to recorded sales calls and extracts structured fields—contact info, next steps, deal stage, key objections—then logs them to the CRM. The pipeline is: recorded audio from your VoIP system goes through Whisper-live for transcription, PhoneLLM processes the transcript with a tool that posts to the CRM, and a dashboard shows the extracted fields for human review before anything gets written. The critical thing here is that PhoneLLM is a small model with a capacity ceiling on tool schemas. If your CRM schema is large and nested, the model will hallucinate parameters or generate malformed payloads. Keep the extraction schema lean—contact name, company, next step, date, stage—and validate every extracted field against an allowlist before writing. This is also the project where compliance matters most, since you're handling call recordings with potentially sensitive personal data. Running it entirely on-premises is the whole point. The review step before write is non-negotiable; you don't want a hallucinated "next step" logged as a committed action.

The third idea is a multilingual customer support bot pilot for a phone line that handles English and Spanish callers. The design is a phone agent that answers FAQs from a short context window and escalates to a human when it can't resolve the issue. Connect Pipecat for VAD and endpointing, PhoneLLM with a concise system prompt containing the relevant FAQ content for the call, language-matched TTS, and a handoff path to a human agent. The key caveat here is that PhoneLLM is tuned on English telephony data. The Nemotron base model has general multilingual capabilities, but the fine-tuning for conversational brevity and tool calling was heavily weighted toward English. You cannot assume Spanish callers will get the same quality of service. Build a test suite with native Spanish speakers on telephony audio, measure intent extraction accuracy, and if the numbers are poor either fine-tune on your own Spanish call data (if you have it) or pair PhoneLLM with a language detection layer that routes Spanish calls to a differently-tuned model. Also manage that context window carefully—you have 262k tokens available, but a large FAQ payload inflates prefill time on every turn. Keep the context under 4k–8k tokens for real-time voice, and use a rolling summarization or retrieval approach if the FAQ set is large.

There's a common thread across all three: PhoneLLM is not a drop-in replacement for a cloud S2S model. It's a component that rewards careful orchestration and explicit handling of the cascade's edges. The projects that work are the ones where you know your telephony constraints, you keep tool schemas lean, and you've benchmarked on your actual audio before trusting it with real callers.

Resources

Updated 2026-08-30 by Mehran Mozaffari.

Related posts