Write us on Telegram@Odilient

AI & AUTOMATION

Bronjoy AI Receptionist

AI voice receptionist for salons and barbershops in Uzbekistan. It understands Uzbek, Russian and mixed speech, checks the real calendar and prices, and books the appointment.

In-house product
Client
Local Services
Industry
Ongoing
Duration
2026
Year
Where it started

The Challenge

Small salons and barbershops in Uzbekistan take bookings by phone, often while the person who should answer is busy with a client. Callers switch between Uzbek and Russian mid-sentence, and a voice agent that mishears a time, invents a price or claims a booking it never made is worse than no agent at all. Every second of silence on the line counts too.

What we did

The Solution

We built a turn-based voice agent that sends the caller's audio straight to Gemini with real booking tools attached and streams the reply sentence by sentence into edge-tts. A time can only be booked through a hold token, no tool accepts a price, and every sentence claiming a booking, cancellation or reschedule is checked against the tools that actually succeeded before it is spoken.

Built with
Geminiedge-ttsLaravel 12Nuxt 4PostgreSQLOpenRouterTelegram Bot APIDocker
Inside the build

How It Came Together

An AI voice receptionist for appointment booking in Uzbek and Russian

The Bronjoy AI receptionist answers a business's calls in the caller's language. It understands Uzbek, Russian and code-switched speech such as "menga zapis kerak, ertaga utrom", reads the real calendar and price list, holds a slot and writes a real appointment into the Bronjoy dashboard, where owners see every call and its transcript.

Current status: the receptionist works end to end as a browser demo that books into a demo barbershop's real calendar. In production the feature sits behind a VOICE_ENABLED flag that is currently off, so the demo page at bronjoy.com/ai-receptionist is published but its voice API returns 404. The telephony leg, a real +998 phone number, is not built yet.

Key features

  • Real data only — services, availability and business details come from the business's own records, and no tool accepts a price.
  • Slot holds — hold_slot reserves a time and returns the hold_token that book_appointment requires, so the agent cannot book a time the calendar never offered, and two callers cannot get the same slot.
  • Claim guard — claims of a booking, cancellation or reschedule in Russian, Uzbek or English are checked before text-to-speech; without a matching successful tool call, the sentence becomes a confirmation question and the interception is logged.
  • A handoff that reaches a person — escalate_to_human sends a critical Telegram notification with the reason and the caller's last words.
  • Owner settings — greeting, languages, voice gender, polite or informal register (siz or sen), local vocabulary and house rules.
  • Costs in so'm — call costs are reported in Uzbek som at a daily Central Bank rate, never in tokens.

Architecture and tech stack

Turn-based, not a realtime API

Each caller turn runs one streaming Gemini call per tool round, with the caller's audio sent straight to the model alongside the booking tools, under a 20-second deadline shared by every round and every model failover. We skipped transcribe-then-reason on purpose: on our phone-quality test clips it added 1.8–2.7 seconds per turn and lost what the words alone do not carry. Transcription runs afterwards, for captions, the CRM record and search. A phone line will use the same path, so telephony can be added without rewriting the agent.

Models and voices

The agent runs on gemini-3.5-flash-lite with a low thinking level and falls back to gemini-3.1-flash-lite under load; one tool round measured 1.4–1.6 seconds. Speech comes from edge-tts voices such as uz-UZ-MadinaNeural, whose first audio arrived in 0.5 seconds against 6.6 seconds for Gemini TTS. A cached "one moment" filler in each language covers calendar lookups, and the Nuxt demo page shows each tool as it fires beside the transcript, including every claim the guard stopped.

Bugs that only appeared in Uzbek

Testing in real Uzbek surfaced failures an English test would miss:

  • Prices read as noise. "80 000 so'm" was voiced as "80 och och och son" because the Uzbek voice read the thousands space as a word. Prices now reach the model unspaced.
  • Times converted wrongly. A slot held at 14:30 was read back as "half past twelve". Times are now repeated exactly as the calendar returns them.
  • A doubled country code. A phone number came back with 998 repeated. Anything other than +998 and nine digits is now refused, and spoken numbers are always read back or taken from caller ID.

Demo safeguards

The public demo allows 30 turns and 10 minutes per session and 20 sessions per IP address per hour. An hourly voice:sweep-demo job removes demo bookings after 24 hours, and call audio is not stored by default. In our test calls a full three-turn booking cost about 120–150 so'm, around one US cent.

What we delivered

We designed and built the agent, its tools and guardrails, the voice pipeline, the owner's call log and settings screens, and the browser demo. Not built yet: a real phone number, outbound calls and other channels.

This is part of our AI integration and automation work. Handoffs use the notification layer behind the Bronjoy staff bot, and the Bronjoy MCP servers let text-based AI assistants book into the same calendars.

Let's Build

Want something like Bronjoy AI Receptionist?

Tell us what your product needs to do. We'll shape the scope, map a timeline and send a fixed price — free, and with no obligation to proceed.

Free consultation No commitment Fast reply