Voice AI · Real-time

An AI receptionist that actually picks up.

Point a phone number at CodeB and a real-time voice AI answers it. It speaks any language, follows the script you wrote, takes messages, transfers to a human softphone when the caller asks for one, and emails you a transcript when it hangs up. No call centre, no IVR tree, no “press 1 for reservations”. Pluggable real-time voice backend, dispatched per virtual number, runs inside your own deployment.

Live demo · talks back in your browser
Hear the AI receptionist for yourself.

One click opens a browser call to our public demo line. Say hello in any language — the model picks up, replies in sub-second latency, and follows the script. No sign-in, no install.

Try the AI receptionist — call now

Already shipping — configure on the virtual numbers page. Pick a real-time voice Mode on any number you own, paste a system prompt, save. The next inbound call is answered by the AI.

What it does

Real-time, not record-and-respond

Full-duplex audio over the same SIP leg the caller dialled. The model hears the caller as they speak, can be interrupted mid-sentence, and replies with sub-second latency. No “please wait while I think”.

Real-time voice

Any language, on the fly

The model detects the caller’s language and replies in kind. Switches mid-call if the caller switches. Your script can pin a default (“always greet in German, switch only if asked”) or let the model choose.

Multilingual

One persona per number

Each virtual number gets its own system prompt, voice, opening line, and warm-up delay. A hotel can run +356 ... 100 as the front desk, ... 101 as the restaurant, ... 102 as the spa — same AI engine, three personalities.

Per-number config

Transfer to a human

The receptionist decides when to transfer using a structured tool call — not a brittle phrase match. It can transfer to any registered SoftPhone (internal extension) and, when the operator has added the number to the per-tenant whitelist, to any external phone. Off-list numbers are refused fail-closed. The AI says it’s connecting you and drops out.

Whitelisted hand-off

Knows when to hang up

A second tool lets the receptionist end the call itself once the caller is done. The reason it gives (“caller said goodbye”, “rude / abusive”, “voicemail loop detected”) lands in the transcript and the CDR so you can see why each call ended.

Self-terminate

One room per caller

Set the room to random and every browser call mints a fresh isolated room name. Two visitors landing on the same dial-in URL never end up in the same room, so the AI never accidentally hears the previous caller’s conversation.

Per-session isolation

Transcript + summary by email

Every call ends with a full transcript and a one-paragraph summary in your inbox. Recipients are configured per virtual number; the format reads like a human took notes. Nothing else is retained on the server by default.

No silent recordings

Drops into your existing PBX

CodeB doesn’t replace your phone system — it complements it. Route a single DID (or a single internal extension) to the bridge and the AI receptionist is online; the rest of your numbers stay on whatever you already have.

SIP-friendly

Works for office and softphone too

Inbound from the PSTN, inbound from a registered SIP softphone, inbound from a CodeB Webphone web user — all three reach the same AI. Same script, same voice, same transcript.

Three answer paths

Tenant-isolated

Each tenant points at its own appsettings file, brings its own provider credentials, gets its own transcripts. A hotel chain running on a shared CodeB host keeps each property’s receptionist separate.

Multi-tenant

Fall-back to TTS

If the configured provider credentials are missing or the model is unreachable, the bridge falls back to a server-side TTS auto-reply so the caller never hits dead silence. The transcript records the fallback so you know it happened.

Always answers

Sample industry: hospitality

Hotels, restaurants, spas, vacation rentals, B&Bs — anywhere a small team has to answer the phone in any language at any hour. The AI receptionist takes the obvious calls so the human team handles the ones that matter.

Three numbers at a Mediterranean hotel

NumberPersonaWhat it handles
+356 ... 100 Front desk Room availability, check-in / check-out times, late arrival, lost keys, “is the pool open?”. Books from the rate sheet you paste into the prompt. Anything booking-system-related — transfer to the duty manager.
+356 ... 101 Restaurant Table reservations, menu questions, dietary restrictions, opening hours. Reads back the booking, emails the maître d’ the transcript.
+356 ... 102 Spa & concierge Treatment availability, prices, taxi bookings, “where’s the nearest pharmacy?”. Transfers to concierge for anything off-script.

All three personas live in the same deployment, share the same staff softphones for transfers, and roll up into one transcript folder. No per-seat licensing, no per-minute AI billing surcharge from a third party — the bridge talks directly to the provider with your own credentials.

Front desk in three languages, 24 hours a day, that never forgets to email me the booking. The night manager finally gets to do night-manager things. — What we’re hearing from boutique hotel buyers

Configuring a number

Open virtual numbers in the admin, add a row, pick the real-time voice mode, paste your prompt. Save and dial it. That’s the whole setup.

# Front desk — Hotel Casa Mediterraneo Number: +356 ... 100 Mode: ai-receptionist Voice: aoede # warm, female, multilingual Warm-up: 1500 ms # jitter buffer before first audio Greeting: "Casa Mediterraneo, good evening — how can I help?" Transcripts to: manager@hotel.example, reception@hotel.example System prompt: You are the front-desk receptionist at Casa Mediterraneo, a 38-room boutique hotel on the north coast of Malta. Always greet first in English, switch to the caller's language if they reply in another one. You CAN answer: check-in (15:00) and check-out (11:00) times, room types and indicative prices, breakfast hours (07:30–10:30), pool and beach access, parking (free, gated), late arrival procedure, lost key replacement, taxi bookings via concierge. You CANNOT confirm a booking yourself — always offer to transfer to the duty manager (say "I'll put you through to a colleague who can finalise that") and the system will hand the call over. Be brief. Speak naturally. If the caller is in distress, transfer immediately.

How it’s wired

Six moving parts; each is replaceable.

ComponentWhat it does
Virtual number Admin record that says “when this number is dialled, dispatch the call to handler X with config Y”. Stored per-tenant in App_Data/<tenant>/appsettings.json.
InboundDispatcher Routes the inbound INVITE to the right handler based on the virtual-number record. Same dispatcher handles AI mode, TTS auto-reply, room join, and softphone fan-out — one place to add new modes.
VoiceHandler Owns the call for its lifetime. Answers the SIP leg, opens a websocket to the configured real-time voice provider, streams audio both directions, watches for transfer intent, writes the transcript when the call ends.
Audio pipeline G.711 µ-law on the SIP side (RFC 3551 baseline, every carrier supports it), PCM 16 kHz on the model side, with proper resampling so the caller doesn’t get chipmunked.
Transcript writer Per-call JSONL in App_Data/<tenant>/transcripts/, optional email via your existing SMTP pickup directory. Nothing is sent to a third party.
CDR Same call detail record as any other CodeB call — disposition (answered / transferred / fallback-tts), duration, language detected, transfer target if any. Visible on cdr.html.

Privacy posture

Two facts to know:

What’s in scope, what’s not

In scope todayNot (yet)
Live voice answering with sub-second latency Outbound autonomous calling — AI initiates calls to customers
Multilingual on-the-fly Real-time integration with third-party PMS / booking engines (planned)
Per-number persona, voice, warm-up Voice cloning of a specific staff member
Transfer to staff softphone on intent Multi-party conferencing the AI into an existing call
Per-call transcript + email summary Long-term call memory across separate sessions (next phase)

Other industries it fits

Dental & medical clinics

Appointment reschedules, opening hours, “is Dr X in today?”, prescription pickup status. Transfer to reception on intent.

Property management

After-hours maintenance triage. Asks for property, issue, urgency, transfers to the on-call agent or takes a message.

Legal / accounting

New-client intake. Takes name, matter type, callback number; emails the partner a summary; books a 15-minute slot.

Trades & services

Plumber, electrician, locksmith. Captures address, problem, urgency. Sends an SMS-style summary to the technician’s WhatsApp via your usual integration.

FAQ

Whose API key does it use? Yours. The bridge reads provider credentials from per-tenant settings; you bill the provider directly, no markup. Invalid credentials fall back to the TTS auto-reply path so the caller still gets a useful response.
What happens if the voice provider is down? The bridge auto-falls back to the per-virtual-number TTS auto-reply. The caller still gets a useful response and your transcript records the fallback.
Can I A/B two prompts? Yes — run them on two different virtual numbers and compare transcripts. The bridge tracks each prompt’s call count + duration + transfer rate in the CDR.
What audio quality? G.711 µ-law (8 kHz, PCMU payload 0) on the SIP leg — the safest baseline that every carrier and softphone accepts. The configured model receives 16-bit PCM at the rate it expects, with proper resampling; chipmunk effects from earlier builds have been eliminated.
Will it disconnect after 32 seconds like cheap SIP gateways? No. We removed the early 180 Ringing that triggered the carrier-side Timer C 32-second drop. Sessions stay up for as long as the caller and the AI want to talk.
How do transfers work? The model uses a structured transfer_to_user tool. The bridge looks up the username against the SIP registrar first — if it’s a registered SoftPhone, the AI’s SIP leg gets a SIP REFER to that contact and drops out. If the username looks like a phone number, the bridge checks the per-tenant whitelist and (if allowed) loops the call back through the public listener for outbound PSTN dialling. Non-allow-listed numbers are refused; the receptionist tells the caller and offers to take a message.
How does it know when to hang up? A second hangup tool gives the model an explicit way to end the call with a reason (e.g. caller said goodbye, abusive, voicemail loop). The reason lands in the transcript and the CDR so you can spot patterns later.
What stops the receptionist dialling +1-900 premium-rate numbers? Two gates. (1) The per-tenant whitelist — only numbers an admin explicitly added can be reached. (2) The bridge’s FraudGuard runs independently on the loopback INVITE, so even if the model somehow asked for an off-list number, the trunk would refuse it.
Can the caller tell it’s an AI? If they listen carefully, eventually yes. Many won’t. The honest answer in your script is the right one; we recommend disclosing on first contact (“Casa Mediterraneo, our virtual assistant speaking”) — this is what callers prefer and what the EU AI Act will require by 2026 anyway.

Set up on a virtual number → virtual-numbers.html · Browse the live directory → virtual-numbers-overview.html · want the rest? All features →