
# ARIA
**A real-time voice AI that sells like a real salesperson — not a phone tree.**
[](https://www.agora.io/)
[](backend)
[](frontend)
[](mobile)
[](#contributing)
*Part of the [AROICE](https://aroice.in) family of tools.*
[Features](#features) • [Quick Start](#quick-start) • [Architecture](#architecture) • [Tech Stack](#tech-stack) • [Contributing](#contributing) • [Team](#team)
**🔴 Live now:** [aria.aroice.in](https://aria.aroice.in) — console + ops dashboard · [crm.aria.aroice.in](https://crm.aria.aroice.in) — the real CRM, hosted on a real Oracle Cloud VPS behind Caddy and Let's Encrypt TLS, not a laptop and a tunnel.

Aria runs a complete B2B sales qualification call, out loud, in real time. She answers pricing
questions from a knowledge base, handles objections, negotiates within limits she is not allowed
to cross, remembers what you told her twenty turns ago, **writes to a real CRM while you are
still talking**, books a meeting with a calendar invite, and escalates to a human — with a
written handoff brief — the moment she genuinely should.
> Open the console and a CRM lead page side by side. Say *"actually, make that fifty devices"* —
> the lead updates itself, with no refresh, while she is still speaking.

## Contents
- [Features](#features)
- [Quick Start](#quick-start)
- [Architecture](#architecture)
- [Tech Stack](#tech-stack)
- [How a call actually flows](#how-a-call-actually-flows)
- [Three layers of who is talking](#three-layers-of-who-is-talking)
- [The console](#the-console)
- [The CRM](#the-crm)
- [Mobile app for the rep](#mobile-app-for-the-rep)
- [Configuration](#configuration)
- [Tests](#tests)
- [Proven at scale](#proven-at-scale)
- [Project layout](#project-layout)
- [Contributing](#contributing)
- [Team](#team)
## Features
- **Grounded, not scripted.** No decision tree — an LLM-driven tool-calling loop decides, turn by
turn, whether to search product docs, update the lead, check the calendar, negotiate, or
escalate. Every pricing/spec answer comes from a live knowledge-base search; she says "I'm not
sure" rather than invent a number.
- **A correction is a field update, not a restart.** Change "10 devices" to "50" mid-call and one
field on one lead changes — you don't get a second lead for the same conversation.
- **A real CRM, live.** EspoCRM in Docker backs every lead and meeting. Leads are created and
updated mid-call, meetings are booked for real, and the CRM's own audit trail shows an agent
genuinely working the record.
- **She bargains, and she can't give the deal away.** A three-layer negotiation: Aria can offer up
to 3% herself, a separate deal-desk agent can go to 10% against a real commitment, and nothing
ever crosses an 18% walk-away floor — enforced by code, not by asking the model nicely.
- **A specialist for the technical questions.** A second agent, its own prompt and its own voice,
answers compatibility/migration/MDM/rollout questions from the real docs — and is required to
say exactly what it doesn't know instead of rounding a gap to reassurance.
- **Escalation is a safety net, not just the model's opinion.** Deterministic guardrails —
repeated frustration, an unresolved objection raised three times, a low-confidence search — force
a handoff even if the model never asks for one. Escalation is a **warm transfer**: a human joins
the live call already briefed, and the customer never repeats themselves.
- **Booking sends a real invite.** `calendar_book_meeting` emails the customer a confirmation with
a `.ics` attachment that lands straight in their Google or Outlook calendar.
- **Every call ends with a human being told.** Not just escalations — an AI-written wrap-up
(headline, next action, what was already agreed) is delivered to the CRM, Slack, and email,
independently and best-effort.
- **She can take the call in Hindi.** One `AGENT_LANGUAGE` setting moves five things together —
ASR, TTS voice, voice boosting, greeting, and prompt — so a Hinglish call doesn't half-switch.
- **The voice changes with who's actually talking.** Aria, the deal desk, and the solutions
engineer each get a distinct voice, and the accent follows the caller's language mid-call.
- **A mobile app for the rep.** An Expo app that surfaces live escalations and handoff briefs, so
the human on the other end of a warm transfer isn't stuck at a desktop.
- **Not just B2B.** Aria reads the phrasing — "my team" vs. "I need a new phone" — and skips the
company/role/headcount questions entirely for a solo buyer. Financing, AppleCare+, and trade-in
work exactly the same for one device as for fifty.
- **A live ops dashboard.** `/dashboard` lists every lead and session the backend has ever seen,
live capacity stats, open escalations (with one-click discount approval), follow-up tasks, and
the product catalog — proof concurrency is real, not simulated.
- **A catalog a rep can extend live.** Adding a product writes real stock and re-indexes the RAG
corpus in the same call — Aria can answer about it on the very next question, no restart.
- **When it isn't ready to be a meeting yet.** A follow-up gets written as a real Task in the CRM,
not a line buried in a transcript, so a rep has something to work later.
- **She does the currency math.** ₹, rupees, lakh, crore — Aria recognizes all of them, converts
at an approximate stated rate, and switches her own spoken currency to match the caller's.
- **A face, not just a voice.** An optional 3D avatar, lip-synced off the live remote audio track
in real time — toggle it on mid-call, the 2D orb stays the default.
## Quick Start
**Windows — one command:**
```bat
run.bat
```
That checks your prerequisites, starts EspoCRM in Docker, provisions it, launches the backend,
opens a public tunnel, writes the tunnel URL into `.env`, restarts the backend so it picks the URL
up, starts the frontend, and opens both tabs. `run.bat stop` shuts it all down.
**Before the first run you need:**
| | Why | Get it |
|---|---|---|
| **Docker Desktop** | Runs EspoCRM + MariaDB |