Realtime voice AI, without the plumbing
Voxera handles WebRTC transport, streaming speech-to-text, your language model and text-to-speech as one pipeline — so you ship a voice agent in an afternoon instead of a quarter.
No credit card. 60 free voice minutes on the Free plan.
How it works
A staged pipeline you can actually see inside
Four stages, each provider-neutral. Use the bundled OpenAI defaults, or point any stage at your own HTTP API.
WebRTC microphone audio
The caller connects over WebRTC through mediasoup. Voxera runs the SFU, the ICE negotiation and the TURN relay, so audio works from a browser, a phone or a locked-down corporate network.
Streaming transcription
Audio streams to a transcription API as the caller speaks. Partial transcripts arrive continuously rather than after the caller stops, which is what makes the response feel immediate.
Text-only model call
The transcript goes to a text model in streaming mode, with your system prompt, tools and session metadata. There is no direct audio-to-model path — every stage is inspectable, loggable and swappable.
Text-to-speech, injected live
Generated speech is converted to 48 kHz PCM frames and injected back into the WebRTC stream as the model is still producing text.
Barge-in is the ability to interrupt a voice agent mid-sentence and have it stop speaking. When the caller starts talking, Voxera halts playback and discards the partial response, so the agent never talks over the person it is meant to be listening to.
Platform
Everything around the model, already built
The model is the easy part. Transport, keys, quotas, transcripts and billing are what actually take the quarter.
One protocol, five platforms
Web, React Native, iOS, Android and Flutter share a single wire protocol. Configure an agent once and it behaves identically everywhere.
Tool calling
Give an agent HTTP tools and it can look up an order or book a slot mid-conversation.
Keys built for clients
Secret keys stay on your server and mint short-lived session tokens. Publishable keys are safe to ship inside an app bundle.
Usage you can trust
Sessions hold a lease and settle billable seconds in one transaction on disconnect, so a dropped call is never billed twice or lost.
Full transcripts
Every turn is persisted with timing, so you can audit, evaluate and replay conversations rather than guess at them.
Bring your own providers
Point transcription, model or speech at your own HTTP endpoint. Available on Growth and Scale.
SDKs
Five platforms, one wire protocol
Configure the agent once. Every SDK speaks the same protocol, so behaviour does not drift between your web app and your phone app.
WebTypeScript
Public release in progressBrowser SDK over Socket.IO, WebRTC and mediasoup-client. Exposes the VoxeraClient class with a typed event map for session state, transcripts and audio.
import { VoxeraClient } from "@voxera/sdk-web";
const client = new VoxeraClient({
appKey: process.env.VOXERA_PUBLISHABLE_KEY!,
serverUrl: "https://rtc.voxera-voice.com",
userId: "user-123",
modelConfig: { provider: "openai", model: "gpt-4.1-mini" },
ttsConfig: { provider: "openai", voiceId: "marin" },
additionalSystemPrompts: ["Keep spoken answers concise."],
});
client.on("remoteStream", (stream) => {
audioElement.srcObject = stream;
});
await client.connect();React NativeTypeScript
@voxera/sdk-react-nativeiOS and Android from one codebase. The useVoxera hook owns the client lifecycle, merges streamed chunks into one message per reply, and handles the Android microphone permission for you.
import { useVoxera } from "@voxera/sdk-react-native";
export function VoiceScreen() {
const { start, leave, isActive, messages, speakingState } = useVoxera();
return (
<View>
<Button
title={isActive ? "End call" : "Start call"}
onPress={() =>
isActive
? leave()
: start({
appKey: PUBLISHABLE_KEY,
serverUrl: "https://rtc.voxera-voice.com",
userId: "user-123",
})
}
/>
{messages.map((message) => (
<Text key={message.id}>{message.content}</Text>
))}
</View>
);
}iOSSwift
Public release in progressNative Swift SDK exposing VoxeraClient and a SwiftUI-ready VoxeraViewModel, with AVAudioSession handling built in.
import SwiftUI
import VoxeraSDK
struct VoiceView: View {
@StateObject private var voxera = VoxeraViewModel()
var body: some View {
VStack {
Text(voxera.isConnected ? "Connected" : "Idle")
Button("Start call") {
voxera.configure(
VoxeraConfig(
appKey: publishableKey,
serverUrl: "https://rtc.voxera-voice.com",
userId: "user-123"
)
)
voxera.connect()
}
}
}
}AndroidKotlin
Public release in progressNative Kotlin SDK with coroutine-based session control and Flow events.
import com.voxera.sdk.VoxeraClient
import com.voxera.sdk.VoxeraConfig
private val voxera = VoxeraClient(context)
lifecycleScope.launch {
voxera.connect(
VoxeraConfig(
appKey = PUBLISHABLE_KEY,
serverUrl = "https://rtc.voxera-voice.com",
userId = "user-123",
)
)
voxera.messages.collect { message ->
binding.transcript.append(message.content)
}
}FlutterDart
Public release in progressDart SDK over a Pigeon-generated platform channel, sharing the same native iOS and Android transports.
import 'package:voxera_flutter/voxera_flutter.dart';
final voxera = VoxeraClient();
await voxera.connect(
const VoxeraConfig(
appKey: publishableKey,
serverUrl: 'https://rtc.voxera-voice.com',
userId: 'user-123',
),
);
voxera.messages.listen((message) {
setState(() => _transcript.add(message.content));
});FAQ
Common questions
What is Voxera?
How is a voice minute counted?
Can I bring my own speech and language providers?
What happens when I run out of voice minutes?
Does Voxera support interrupting the agent mid-sentence?
Which platforms have SDKs?
Hear it before you build on it
The demo is the real pipeline, not a recording. Talk to it, interrupt it, and decide from there.