Voice Engine · Alebex
Canada’s #1 streaming speech-to-text model. Alebex STT recorded a 3.96% word error rate for final transcription on September 21, 2026
Models / Voice Engine

The end-to-end voice engine. Built for streaming.

Speech-to-text, turn detection, the model and synthesis, running as one streaming pipeline over one WebSocket.

$25 of free credit on every new developer account. Sign up, take your token, start talking.

The pipeline

What the engine does to one sentence.

Transcription runs while the caller is still talking. Synthesis does not wait for a finished sentence: the first clause with a few words behind it goes to the voice. And when the caller cuts in, the agent stops on the word they actually heard, not the word it had written.

Caller

 

Agent

 

One turn, in real time 0.0 s

 

Illustrative playback. Struck words were generated but never reached the caller. Telephony arrives as 8 kHz mulaw and the browser as 16 kHz PCM, on the same pipeline, and the browser hears 24 kHz PCM back.

Barge-in

“Uh-huh” is not an interruption.

Voice activity detection only says there is sound on the line. A fine-tuned WavLM reads the raw waveform and returns the probability that the caller means to take the floor. That number decides, in about fifteen milliseconds. Not the detector, and not loudness.

Both streams, and every score the model returns 0.0 s

 

Illustrative scores. The threshold, the window length and how many windows must agree are all set per call.

And when it does stop, it stops on the word the caller actually heard. The client echoes playback marks, so the reply is cut there rather than where the model happened to be writing.

Intent

You write the question. It answers from the audio.

A multimodal language model for intent classification. It takes the caller's audio and an instruction you write in plain language, then decodes the answer as text instead of picking from a fixed set of classes.

One recording, three different questions
Audio in

“sure, i guess”

1.9 s pause firstfalling pitch2.1 s long

A transcript of this reads as a yes. The recording does not.

Instruction you write

 

Plain language. Nothing is trained, and no label list is compiled in.

What comes back
 

Structured output your tools can branch on.

Illustrative instructions and answers. The three above run against the same recording, with no change to the model.

* In alpha.

Guardrail

Nothing you forbid reaches the caller.

You name the topics the agent must not engage. Every sentence it writes passes two checks on the way out, and one that fails them is aborted before the caller hears it.

Two checks, on the way out pricing · medical advice · legal
01
The sphereEvery sentence lands somewhere on it. The topics you named are regions.
02
The shellA second model asks whether the sentence is engaging the topic, or declining it.
Illustrative geometry. The topics, and how strictly each one is held, are set per agent.
Human-speed

Two models, one voice.

A conversation feels live under about a second of silence. Most systems wait for the whole answer before they open their mouth. Here a small model opens the reply while the large model writes the rest, so the first word lands at about half a second and the full answer follows in the same voice.

Human benchmark
200 ms
Typical voice AI
1,500 ms
Alebex
sub-800ms
Alebex bar: the sub-800ms response target in solid, sub-400ms perceived with the dual-model system, in development, in outline. Typical single-model systems wait for the full generation before speaking. * In alpha.
Integration
Call from the browser client · JavaScript
const ws = new WebSocket(
  "wss://api.voice.alebex.ai/public/ws/call",
  ["alebex.token.wt_1a2b3c4d5e6f..."]
);

ws.onopen = () => ws.send(JSON.stringify({
  type: "start_call", agent: { id: "agent-123" }
}));

// PCM 16-bit mono 16 kHz, as binary frames
recorder.ondata = (chunk) => ws.send(chunk);

ws.onmessage = (e) => {
  const msg = JSON.parse(e.data);
  if (msg.type === "audio")       play24k(msg.data);
  if (msg.type === "clear_audio") dropQueuedAudio();
  if (msg.type === "mark")        onPlayed(() => ws.send(e.data));
  if (msg.type === "transcript")  draft(msg.text, msg.is_final);
  if (msg.type === "conversation_message") commit(msg);
};

ws.send(JSON.stringify({ type: "end_call" }));

Agent audio comes back as 24 kHz PCM. Echo every mark once playback reaches it: that is how the engine knows what the caller heard.

Put it on the phone REST · webhook
POST /public/call/phone
{
  "agentId": "agent-123",
  "to": "+14155552671",
  "twilio": {
    "accountSid": "AC…",
    "authToken": "…",
    "phoneNumber": "+14155550200"
  }
}

The call is dialled on your own Twilio number, so it shows on your bill and your console. When it ends, the engine posts one end-of-call report to the agent’s endOfCallUrl: transcript, duration, why it ended, and a signed recording link good for an hour.

endedReason · customer-ended-call
assistant-ended-call · voicemail
customer-did-not-answer · customer-busy
Get access

Put an agent on the line today.

A developer account, a token from the dashboard, one WebSocket. You are talking to your agent in minutes, and the first $25 is on us.