Voice agents for phone and web

An AI that answers your phone. Every call measured.

Build an agent, talk to it from your browser, then connect it to your numbers. Every call is recorded with a transcript, a cost breakdown and a measurement of how the audio actually reached the other side.

Median response time
1.45 s
Packet loss
0.07%
Time to the greeting
1.89 s

30 conversation languages · 4 engines · DIDWW, Twilio or your own SIP trunk

Four engines. Pick one per agent.

Each engine sounds different, responds at a different speed and costs a different amount per minute. Keep the same instructions, switch engines, and compare the calls side by side.

GPT-Live 1

gpt-live-1 + gpt-5.6-luna

OpenAI's full-duplex voice model. It listens while it speaks and handles interruptions naturally. Detailed instructions run on a background model.

Voices
14
Speed
Fixed

Gemini Live

gemini-3.8-live

Google's speech-to-speech model with a wide range of voices. Tone is part of the instructions.

Voices
30
Speed
Fixed
Languages
30

OpenAI Realtime

gpt-realtime-2.1-mini

Speech-to-speech with adjustable speaking speed. Billed by audio tokens.

Voices
10
Speed
0.25–1.5

Classic

Nova-3 → gpt-4.1-mini → gpt-4o-mini-tts

Deepgram transcribes, an OpenAI LLM replies, OpenAI TTS speaks. Every stage can be tuned on its own.

Voices
10
Speed
0.25–4
Languages
30

Measured on our server · 5 November 2026

Numbers from test calls, not from a brochure.

Four engines, ten scripted web-call scenarios each (browser connection), run against the production server. It is a single run, so read the values as a snapshot rather than a guarantee.

  • 1.45 s Median response time Gemini Live: from the end of the caller's sentence to the agent's first audio
  • 2.1% Caller transcription errors (WER) GPT-Live 1, Turkish test scenarios
  • 0.07% Packet loss First live call on the server: 57.7 s, UDP end to end, round trip 127 ms
  • 1.89 s Time to the greeting Same call: from connecting to the agent's first audio

Response time by engine

Seconds from the end of the caller's turn to the agent's first audio, measured on the caller's side.

Response time by engine
EngineResponse time by engineMedian90th percentile
Gemini Live 1.45 s 2.28 s
GPT-Live 1 1.76 s 2.56 s
OpenAI Realtime 2.08 s 4.14 s
Classic 3.23 s 4.02 s

Source: 4 engines × 10 scenarios × 1 run on hubvocal.com, 5 November 2026. Every call record carries the same measurements, see audio quality.

Capabilities

What the agent does besides talking

Some of these are live, some are in development. The ones marked coming soon are not yet available in accounts.

  • Call quality score

    A score from 1.0 to 4.5 for every call, with the reason when it drops: network, model stream or delay.

    Details →
  • Dates, numbers and names

    Turkish date expressions worked out in code, numbers read back in groups, names spelled letter by letter.

    Details →
  • CRM and team chat

    HubSpot, Pipedrive, monday.com, Slack, Telegram, and n8n work today. Coming soon: Zapier and Make.

    Integrations →
  • Transfer to a person

    Coming soon

    A cold or warm transfer to a colleague on phone calls, with a short summary first.

    Details →
  • Outbound campaigns

    Coming soon

    Call a contact list within set hours, with retries and a do-not-call list.

    Details →

Integrations

Works with the tools you already use

Recognises callers in your CRM by their number, logs each call on the contact with its summary, and sends the messages your agent takes to your team's channel.

Coming soon: Zapier and Make.

Until the Zapier and Make connectors are ready, send the call.ended webhook to a webhook trigger there.

All integrations

Call quality measurement

See how the audio actually arrived.

When a call sounds bad, the model is often not the problem; the path is. The browser measures the agent's audio in 2-second windows, and the agent records every moment its own audio fell behind real time. Both land on the same timeline.

  • Packet loss< 0.5% goodAudio packets lost on the network.
  • Speech gaps< 1% goodHow much of the speech the browser had to fill in because audio arrived too late.
  • Jitter and buffer< 30 ms · < 120 msHow unevenly packets arrive, and how large the playout buffer grows.
  • UDP / TCPTCP: watchFalling back to TCP adds delay. Tracked for the whole call.
  • Agent source gaps[second, ms]Moments where the model's audio stream stalled. Independent of the network.
  • Good
  • Watch
  • Poor
  • Agent source gap (ms)
Illustration. Each column is a 2-second window. Loss is zero, yet there is a speech gap at 16 s, and the agent reports a 141 ms source gap at the same moment: the audio was late at the source, not lost on the network.

Loss means the network.

No loss but gaps means the audio arrived late. If the agent saw a gap too, it was the source; if not, it was the transport.

Call quality score

One number per call for how it sounded.

Every call gets a score from 1.0 to 4.5 on the MOS scale that telephone networks use for perceived voice quality. It is calculated from what was measured during the call, not from a survey, and it comes with the reasons.

What lowers the score

  • NetworkAudio packets lost between the caller and us.
  • Late audioAudio that arrived too late to be played, although nothing was lost.
  • Model streamMoments when the engine's audio stalled before it left the agent.
  • DelayRound trip plus buffering. It only counts once the one-way delay goes above about 180 ms.

The calculation follows the ITU-T G.107 E-model. Scores are worked out when a call is read, so if the formula improves, older calls are shown with the new one too.

Examples

  1. 4.3 ExcellentOur first live call on the production server: 0.07% packet loss, 0.21% speech gaps, 127 ms round trip.
  2. 3.8 Fair2% speech gaps, all of them from the engine's audio stream.
  3. 3.5 Poor3% packet loss on the network.
  4. 3.3 PoorNo packet loss, but 4% of the audio arrived late.
  5. 1.7 Bad15% packet loss.

The first row is a real call; the others are calculated cases from our test suite.

  • Excellent ≥ 4.3
  • Good ≥ 4.0
  • Fair ≥ 3.6
  • Poor ≥ 3.1
  • Bad < 3.1

Calls below the threshold are flagged

Each organization sets its own threshold, 3.6 by default. Calls below it are marked in the call list and counted on the overview. A call.quality_low webhook is sent once for each such call.

On phone calls we cannot see the caller's network, so the score uses the agent-side measurements only, and the record says so.

Getting the details right

Dates, numbers and names, checked before they are saved.

An appointment or a callback is only useful if the date, the number and the name are right. These are the details voice agents get wrong most often, so they are handled by explicit rules and code instead of being left to the model.

Turkish date math, done in code

Expressions such as "next Tuesday", "the day after tomorrow" or "the Friday after the 15th" are resolved in code, in the agent's time zone. The time the caller gave stays with the date in every confirmation.

Caller
Önümüzdeki salı öğleden sonra iki buçukta olur mu?
Agent
10 Kasım Salı, saat 14.30. Doğru mu?

Asked on Thursday 5 November: "Next Tuesday at half past two in the afternoon?" The agent confirms Tuesday 10 November, 14:30.

Numbers read back in groups

Phone numbers are read back in the groups people use when they say them, and the agent asks again if it is not sure. On the Classic engine in Turkish, amounts, dates and times are spoken as words while the transcript keeps the digits.

Caller
Sıfır beş yüz otuz iki, dört yüz elli altı, yetmiş sekiz, doksan.
Agent
0532 456 78 90. Doğru mu?

The number is saved as digits, 05324567890, in the message for your team.

Names spelled letter by letter

When a caller spells or corrects a name ("not C, with Ç"), the agent uses the latest version, keeps letters such as ç, ş, ğ and ı, and spells it back once to confirm.

Caller
C değil, Ç ile. Çağlar.
Agent
Ç, A, Ğ, L, A, R. Çağlar, doğru mu?

The corrected spelling is what goes into the message or the booking.

Date expressions are understood in Turkish and English. Number read-back and name spelling have been tested in Turkish and English calls.

Telephony

Bring your numbers. The agent answers.

Incoming calls are answered by the agent assigned to the number that was dialed. The agent you tested in the browser talks on the phone with the same instructions and voice.

  1. A call comes in

    From DIDWW, Twilio or your own PBX over SIP.

  2. The number is matched

    The agent assigned to the dialed number is picked.

  3. The agent talks

    With the engine, voice and instructions you chose.

  4. The record lands

    Transcript and cost, in the dashboard and the API.

DIDWW

Connect your DID numbers over a SIP trunk.

Twilio

Route Twilio numbers through Elastic SIP Trunking.

Asterisk / PBX

Running your own PBX? Your numbers stay where they are; point a SIP trunk at us.

Outbound works too: start a call from one of your numbers with POST /v1/calls, and the agent speaks when it is answered.

Transfer to a personComing soon

When a call needs a person, the agent hands it over.

On phone calls the agent can pass the caller to a colleague or a team. You describe when each transfer target should be used; the agent never sees the number it dials.

In development. Not yet available in accounts.

Cold transfer

The call goes straight to a phone number or a SIP address.

Warm transfer

The agent calls your colleague first and reads a short summary, then connects the caller. The caller hears silence, not the briefing.

The caller agrees first

The agent asks the caller to confirm before it transfers the call.

If nobody answers

No answer, busy or declined: the agent comes back to the caller, apologises and takes a message.

Phone calls only. Every attempt and its result is written to the call record.

Outbound campaignsComing soon

Call a list, within the hours you choose.

Upload a CSV of contacts and the agent calls them from your number, using the values in each row in its greeting and instructions.

In development. Not yet available in accounts.

Calling window

Days and hours in the campaign's time zone, a limit on simultaneous calls, and retries for busy or unanswered numbers.

Personal details in the call

Columns such as a name or a plate number become placeholders like {{name}} in the agent's instructions.

Do-not-call list

Numbers on your organization's list are never called, by a campaign or any other outbound call. If someone asks not to be called again, the agent adds them once they confirm.

Results per contact

Every attempt is logged: answered, no answer, busy, and how the call ended.

Turkish numbers: we do not check İYS consent records for you. Before a campaign to +90 numbers starts, you are reminded to confirm İYS consent yourself.

How it works

01

Describe the agent

Instructions, greeting, language, engine, voice and speaking style. In the dashboard or through the API.

02

Talk to it in the browser

Try changes without saving. See the transcript, the cost, how long the greeting took and the audio quality right away.

03

Go live

Assign it to a phone number, or embed the web call on your own site.

Built for teams

  • Organizations and roles: owner, admin, member
  • API keys per organization
  • A monthly spending limit that stops new calls once reached
  • Call history, usage and cost reports

Tools

Let the agent get things done during the call.

Turn on the built-in tools or connect your own systems through a webhook. The same tool definition works on all four engines.

Hang up, take a message

Built-in end_call and take_message: the agent ends the call politely, or writes a message and a callback request into the call record.

Your own webhooks

Describe an endpoint and its parameters once. The agent calls it with a signed HTTPS request when the conversation needs it.

Confirmation before changes

Tools that change data run only after the agent has read the details back and the caller has said yes.

Tools in the docs →

Answers and bookings

Answers from your documents. Appointments in your calendar.

Give the agent what it needs to be useful on the phone: your own information and access to your calendar.

Knowledge base

Upload PDF, Word, text or Markdown files, paste text or add a web page. During the call the agent searches them and answers from what it finds.

  • It is instructed not to make up what is not in your documents.
  • The sources behind each answer are saved in the call record.
  • Choose which documents each agent may use.

Appointments

Connect Google Calendar in the dashboard. The agent checks free slots within your working hours and can book or cancel.

  • It reads the details back and books only after the caller says yes.
  • Notice time, buffers and how far ahead people can book are up to you.
  • Booked appointments appear in the call record.

Knowledge and calendar in the docs →

MCP

MCP, in both directions.

The Model Context Protocol is an open standard for connecting AI applications to tools and data. HubVocal supports it on both sides.

Your MCP server, used by the agent

Connect an MCP server and choose which of its tools the agent may use during calls. Tools that change data go through the same confirmation step as other write tools.

HubVocal as an MCP server

Connect Claude, Cursor or another MCP client with an API key to list agents, read call summaries or update an agent. The key's scopes decide what it may do.

MCP in the docs →

Live console

Step into a live call when it matters.

A supervisor can join any call that is in progress, on the web or on the phone, from the dashboard. The agent keeps the conversation unless someone takes over.

  1. Listen

    Hear the call and follow the live transcript. The caller does not know you are there.

  2. Whisper

    Send the agent a note it takes into account in its next reply. The caller does not hear it.

  3. Take over

    The agent stops talking and the caller hears you. The transcript keeps running where the engine supports it.

  4. Hand back

    Return the call to the agent, with an optional note. It picks up from what was said.

Available to organization admins by default; it can be opened to members. Every join, whisper and takeover is recorded in the call record.

After the call

A summary for every call, sent where you need it.

When a call ends, the agent writes a short summary from the transcript. A webhook can deliver the full record to your CRM or helpdesk.

Summary and outcome

A few sentences, an outcome such as resolved or message taken, the caller's sentiment, topics and follow-up actions.

call.ended webhook

A signed HTTPS request with the call record, summary and transcript. Failed deliveries are retried for about two and a half hours.

Delivery log

Every attempt is logged with its status, so you can see what arrived and resend what did not.

Webhooks in the docs →

Recording and privacy

Record when you need to. Keep only what you must.

Call recording is off by default. When you turn it on, you also decide how long recordings and transcripts are kept.

Recording with an announcement

When recording is on, the agent tells the caller before the greeting, in the caller's language. Recordings can be played back from the call record.

Retention and masking

Set how many days recordings and transcripts are kept; they are deleted automatically afterwards. Optionally mask phone numbers, emails, ID, IBAN and card numbers in transcripts and summaries.

Deletion on request

Delete a call's recording and transcript at once, for example when someone asks under KVKK or GDPR.

Day to day

Tools for running it every day.

Test lab

Write scenarios with a simulated caller and the rules a good call must meet. Run them against the draft before you publish; each rule is checked and explained.

Web widget

Add a call button to your site with one script tag and a public key limited to your domains.

Structured fields

Define fields such as appointment date or interest. After each call they are filled from the conversation and sent with the call record.

Reports and export

Calls, minutes, cost, latency, outcomes and audio quality by day, agent or outcome. Export calls as CSV.

Two-step sign-in

TOTP codes for the dashboard, an organization setting to require them, session list and an audit log.

Supported conversation languages

Which languages each engine can hold a conversation in. An agent's language is set with the lang field, using the codes below.

  • Supported
  • Experimental The engine does not officially list this language. It works when instructed to, but we have not measured the quality.
Language lang GPT-Live 1Gemini LiveOpenAI RealtimeClassic
TurkishTürkçetr tr Experimental Supported Experimental Supported
Englishen en Supported Supported Experimental Supported
GermanDeutschde de Supported Supported Experimental Supported
FrenchFrançaisfr fr Supported Supported Experimental Supported
SpanishEspañoles es Experimental Supported Experimental Supported
ItalianItalianoit it Experimental Supported Experimental Supported
PortuguesePortuguêspt pt Supported Supported Experimental Supported
DutchNederlandsnl nl Experimental Supported Experimental Supported
RussianРусскийru ru Experimental Supported Experimental Supported
UkrainianУкраїнськаuk uk Experimental Supported Experimental Supported
PolishPolskipl pl Experimental Supported Experimental Supported
RomanianRomânăro ro Experimental Supported Experimental Supported
GreekΕλληνικάel el Experimental Supported Experimental Supported
BulgarianБългарскиbg bg Experimental Supported Experimental Supported
CzechČeštinacs cs Experimental Supported Experimental Supported
SlovakSlovenčinask sk Experimental Supported Experimental Supported
HungarianMagyarhu hu Experimental Supported Experimental Supported
CroatianHrvatskihr hr Experimental Supported Experimental Supported
SerbianСрпскиsr sr Experimental Supported Experimental Supported
BosnianBosanskibs bs Experimental Supported Experimental Supported
SlovenianSlovenščinasl sl Experimental Supported Experimental Supported
MacedonianМакедонскиmk mk Experimental Supported Experimental Supported
SwedishSvenskasv sv Experimental Supported Experimental Supported
DanishDanskda da Experimental Supported Experimental Supported
NorwegianNorskno no Experimental Supported Experimental Supported
FinnishSuomifi fi Experimental Supported Experimental Supported
EstonianEestiet et Experimental Supported Experimental Supported
LatvianLatviešulv lv Experimental Supported Experimental Supported
LithuanianLietuviųlt lt Experimental Supported Experimental Supported
CatalanCatalàca ca Experimental Supported Experimental Supported

Experimental languages are worth testing in the browser before you put them on a phone line.

Developers

Everything is in a REST API.

Whatever you can do in the dashboard, you can do through the API: create agents, assign numbers, open web calls, place outbound calls, read call records and usage.

  • JSON, Bearer API keys, plain error messages
  • OpenAPI 3.1 specification
  • 120 requests per minute per key
  • A livekit-client example for browser calls
Open a web call
curl
curl -X POST "https://hubvocal.com/v1/web-calls" \
  -H "Authorization: Bearer $VT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "agent_id": "front-desk"
}'

On the roadmap

What we are working on next. We will announce each one here and in the docs when it ships.

  • Coming soonPay as you goTop up by card and pay per minute of conversation.
  • Coming soonTransfer to a personA cold or warm transfer to a colleague on phone calls, with a short summary first.
  • Coming soonOutbound campaignsCall a contact list within set hours, with retries and a do-not-call list.

Want to hear it on your own line?

Tell us what you have in mind. We will open an account and set up the first agent with you.