Make your voice agent answer at human speed.

Rabel Labs builds AI that cuts the wait before a voice agent answers. Four models, one for each step of the answer, all running beside the speech-to-text, reply model and voice you already use.

The caller says

Did anything come in from the landlord this morning?

Without Bell

1.5 s

With Bell

500 ms

The caller speaks The reply is written Written before the caller finished The agent speaks
The wait runs from the caller’s last word to the agent’s first. With Bell, the median wait falls from 1.5 s to 500 ms.

Bell

Hear the difference.

The same conversation twice: as a voice agent answers today, and with Bell. Listen for the pause after the caller stops.

Without Bell

1.5 s

With Bell

500 ms

Caller Wait Agent
The same conversation, before Bell and after. With Bell, the median wait falls from 1.5 s to 500 ms.

Each model starts one step of the answer before the caller has finished.

An answer has four steps: hearing the words, calling a tool, writing the reply, speaking it. Whistle, Hum, Bell and Sing each cut the wait at one step, beside the speech-to-text, reply model and voice that do the work. Use one or all four.

  1. Whistle

    Gets your agent the words before the transcript has them.

    480 ms sooner to each word, on the words Whistle has first
    Get Whistle
  2. Hum

    Starts your agent’s tool calls while the caller is still asking.

    300 ms saved a turn on the tool call
    Get Hum
  3. Bell

    Gets your agent’s reply written while the caller is still talking.

    365 ms saved a turn on the reply
    Get Bell
  4. Sing

    Gets your agent talking the moment its first words are ready.

    100 ms sooner to the first word, when Sing is ready first
    Get Sing

Whistle

Whistle gets your agent the words sooner.

Whistle hands your agent the caller’s words while the speech-to-text is still printing them, so everything the agent does next starts sooner. It runs beside the speech-to-text you already use.

Measured

480 ms

sooner to each word, on the words Whistle has first.

Version1
ReleaseOct 26, 2026

Hum v2

Hum gets your agent’s tool calls done sooner.

When an answer needs a tool call, a lookup in your systems, Hum starts it while the caller is still speaking, so the answer is ready sooner. Your tools and data stay where they are.

Measured

300 ms

saved a turn on the tool call.

Version2
ReleaseNov 2, 2026

Bell v2

Bell gets your agent’s reply ready sooner.

Bell lets your reply model start writing while the caller is still talking, so the agent answers the way a person does. It runs beside the reply model you already use.

Measured

365 ms

saved a turn on the reply.

Version2
ReleaseNov 1, 2026

Sing

Sing gets your agent talking sooner.

Sing starts the agent’s voice on the first words of the reply instead of waiting for the whole of it, so the first word comes sooner. It runs beside the voice you already use.

Measured

100 ms

sooner to the first word, when Sing is ready first.

Version1
ReleaseOct 31, 2026

Rabel APIBeta

Add Bell to the voice agent you already run.

Bell takes the words from your speech-to-text. Sign up with your email for an API key and 60 free minutes.

const bell = new WebSocket("wss://api.rabellabs.com/v1/conversation");
bell.onopen = () =>
  bell.send(JSON.stringify({ key: process.env.RABEL_API_KEY }));

// your speech-to-text's words so far, each time it has new ones
stt.on("words", (text) =>
  bell.send(JSON.stringify({ type: "heard", text })));
// its final words, when it ends the turn
stt.on("endOfTurn", (text) =>
  bell.send(JSON.stringify({ type: "end_of_turn", text })));

bell.onmessage = (e) => {
  const m = JSON.parse(e.data);
  if (m.type === "ready") stt.start();
  // start your reply on Bell's guess
  if (m.type === "guess") reply.start(m.text);
  // the guess that matched, or null
  if (m.type === "end_of_turn") reply.keep(m.guess_id);
};
URL = "wss://api.rabellabs.com/v1/conversation"

async with websockets.connect(URL) as bell:
    await bell.send(json.dumps({"key": os.environ["RABEL_API_KEY"]}))

    # your speech-to-text's words so far, each time it has new ones
    async def on_words(text):
        await bell.send(json.dumps({"type": "heard", "text": text}))

    # its final words, when it ends the turn
    async def on_end_of_turn(text):
        await bell.send(json.dumps({"type": "end_of_turn", "text": text}))

    async for msg in bell:
        m = json.loads(msg)
        if m["type"] == "ready":
            stt.start(on_words, on_end_of_turn)
        elif m["type"] == "guess":
            reply.start(m["text"])  # start your reply on Bell's guess
        elif m["type"] == "end_of_turn":
            reply.keep(m["guess_id"])  # the guess that matched, or None

Free to start

60 min

free with every account, then $0.005 a minute.

Sign upWith your email
BilledBy the second

Works with the stack you already run.

Rabel APIBeta

Bell, at $0.005 a minute, billed by the second while a conversation is open. Every account starts with 60 free minutes.

Contact us

Leave your email and we’ll set you up.