DEV Community

Rémi Henriot
Rémi Henriot

Posted on • Originally published at scenaro.io

STT, LLM, TTS: The Full Stack Behind a "Simple" Voice Assistant

STT, LLM, TTS: The Full Stack Behind a "Simple" Voice Assistant

"Plug in OpenAI and you're done" is the most expensive lie in voice AI. A voice that answers is three layers, fifteen-odd providers, and a trade-off at every link.

"Plug in OpenAI and you're done" is the most expensive lie in voice AI. A voice that answers is three layers, fifteen-odd providers, and a trade-off at every link.

A visitor asks a question out loud. They get a natural answer in under a second. From the outside, it looks like a product. From the inside, it's a chain: one layer transcribes speech (STT), one generates the answer (LLM), one speaks it back (TTS).

Three layers. Three decisions. And one unforgiving rule: a slow or wrong link degrades the whole chain.

The problem isn't that this complexity exists. It's that most teams only see it after they've made the wrong calls.

The Naive Stack

The reflex is always the same: "We're using OpenAI, right?"

One API key, one contract, one invoice. It's comfortable. And that's exactly the trap: you're not choosing a stack, you're choosing procurement convenience. Every layer inherits a default provider, not the best one for the job.

Why Each Layer Deserves Its Own Decision

Transcription first. An STT model that shines on standard English can stumble on a regional accent or domain vocabulary. And a faulty transcription in produces an absurd answer out, the user doesn't hear "the STT failed," they hear "this assistant is stupid."

Voice next. A voice is a brand asset, just like a logo. "Serviceable" isn't enough for a premium brand: some engines deliver richer prosody, others let you clone a real ambassador's voice. That's a deliberate decision, not a default setting.

The model last. Complex reasoning, long instructions, multilingual contexts: no LLM wins everywhere. The right model depends on the task, and the right LLM tells you nothing about the right STT.

How Scenaro Composes the Chain

Scenaro is built on LiveKit, a battle-tested real-time engine, with fifteen-odd provider plugins: Deepgram, ElevenLabs, Cartesia, Mistral, OpenAI, Google, and more. Each layer is chosen independently, on its own latency-cost-quality trade-off.

The decisive part: the chain is configured per scenario, in the Cockpit. Swapping the STT, the LLM, or the voice is a setting, not a rewrite of the conversational experience. Business logic, scenarios, memory: nothing moves.

This is what runs in production at Club Français du Vin, Urbansider, and Lupi. Same chain, different settings, because a travel concierge and a wine advisor don't share latency constraints or a voice.

And that's the real test of a voice architecture: not the day-one demo, but how easily you change your mind at month three. Teams that freeze their stack at launch discover in production that the default provider wasn't the right one, especially on STT. That recalibration should be routine, not a rebuild.

A voice assistant isn't a product. It's an assembly of decisions. The right architecture gives each layer the best provider for your context, and lets you change your mind without rebuilding anything.



The full article lives on Scenaro: STT, LLM, TTS: The Full Stack Behind a "Simple" Voice Assistant

If you prefer the series by email: https://scenaro.substack.com/subscribe

Top comments (0)