Skip to content

What is Voqalize?

Voqalize is a platform for building voice agents. It runs the hard, latency-critical parts of a real-time voice stack — WebRTC media, voice activity detection, speech-to-text, text-to-speech, turn-taking, barge-in, recording — and leaves you exactly one job: the brain.

Voqalize is a voice operator that lives inside your app — it drives the UI, reads live and authenticated state, and does the actual work. You write the brain; Voqalize runs the voice.

A Voqalize app has two halves:

  • The voice runtime (ours). It answers the call, transcribes the caller, speaks your agent’s replies, and handles interruptions. It is a managed service; you don’t run it.
  • The brain (yours). A program that receives the caller’s text and streams text back. It holds your prompt, your model, your tools, and your data. Your code never touches audio — no sample rates, no codecs, no jitter buffers.

The two talk over a single WebSocket, one connection per call, carrying a small set of Vql* frames: user text in, agent text out, plus a few frames for tool calls, UI commands, and mid-call reconfiguration.

Voice is hard in the parts that have nothing to do with your agent: echo cancellation, endpointing, streaming TTS, cutting the bot off cleanly when the user starts talking. Those are the same for every agent. Your prompt, tools, and business logic are the same as any backend you already write.

So Voqalize draws the line at text. Everything below the text boundary is the platform’s problem. Everything above it — what to say — is yours, written in whatever language and framework you already use, running wherever your other backend code runs.

A brain is a short subclass with a couple of callbacks:

from voqalize.sdk import Brain, Interaction, Session, SessionStart
class EchoBrain(Brain):
async def on_session_start(self, session: Session, start: SessionStart) -> None:
async with session.say() as speech:
await speech.speak("Hi! I'm an echo bot. Say something and I'll repeat it.")
async def on_interaction(self, interaction: Interaction) -> None:
async with interaction.say() as speech:
await speech.speak(f"You said: {interaction.transcript}")

That’s a complete, running voice agent. Swap the body of on_interaction for a call to your LLM and you have a real one. See the Quickstart.

The Go SDK was removed while the platform surface is moving fast on the Python/ADK track, and will return once that surface stabilizes. The wire protocol itself stays language-neutral — see proto/ for the contract.