Платформа аналітики дзвінків · працює на API
Кожен дзвінок відділу продажів — транскрибований і оцінений автоматично.
Підключіть джерело дзвінків один раз. Далі система сама розшифровує розмови, розділяє менеджера й клієнта, оцінює роботу за вашим чек-листом і збирає все у звіти.
Початок роботи
Запуск за чотири кроки
Один раз під'єднуєте джерело — далі все відбувається без вашої участі.
-
01
Реєстрація
Створюєте робочий простір команди й запрошуєте керівників відділу.
-
02
Підключення джерела
Генеруєте вебхук-адресу й секрет та вказуєте їх у своїй телефонії або CRM. Записи починають надходити автоматично.
-
03
Налаштування чек-листа
Описуєте критерії оцінки: привітання, виявлення потреби, робота із запереченнями, домовленість про наступний крок.
-
04
Готово
Кожен новий дзвінок розшифровується, оцінюється й з'являється в дашборді зі звітами по менеджерах.
Демонстрація
Подивіться, як це працює
Наше демо розпізнавання реального дзвінка — та приклад аудіозапису, на якому воно працювало.
Запис екрана: CallLens розшифровує й оцінює реальний дзвінок у кабінеті.
Архітектура
Шлях дзвінка крізь систему
П'ять зон обробки. Синхронне приймання на Symfony повертає відповідь за мілісекунди, а вся «важка» робота йде асинхронно у воркерах і викликає зовнішні API . Власний GPU не потрібен.
-
A
Зона · Клієнтпоза вашим контуром
Джерело дзвінка
- Джерело Twilio · Binotel · Ringostat · Bitrix24
- Подія завершення дзвінка
- Дані запис mp3/wav, бажано двоканальний (менеджер/клієнт окремо)
-
B
Зона · Symfony (синхронно)< 50 мс
Приймання вебхука
- Endpoint POST /v1/calls/webhook
- Безпека перевірка підпису HMAC-SHA256
- Дедуп ідемпотентність за call_id
- Дія зберегти аудіо в Hetzner S3 → dispatch у Messenger
- Відповідь 202 Accepted одразу, не чекаючи обробки
-
C
Зона · Воркери (асинхронно)Messenger
Обробка дзвінка
- Транспорт Redis / Doctrine · ретраї з backoff · dead-letter
- Виклики через Symfony HttpClient за єдиним інтерфейсом
Конвеєр · зовнішні APIплатно/хв1 · STTDeepgram / AssemblyAI → транскрипт + діаризація + таймкоди слів2 · LLMGPT-4o-mini / Gemini → JSON-оцінка по критеріях + цитати (structured output)3 · EMBOpenAI / Voyage → вектори реплік для пошуку -
D
Зона · ДаніDoctrine ORM
PostgreSQL + pgvector
- Сутності Call · Transcript · Utterance(+vector) · Score · Tenant
- Ізоляція дані розділені за tenant_id (мультитенантність)
- Пошук семантичний по векторах (pgvector, індекс HNSW)
- E
Бурштинова зона C — єдина, що залежить від зовнішніх платних API. Усе сховано за інтерфейсом, тож провайдера можна замінити, а згодом — перенести транскрипцію на власний GPU, не чіпаючи зони A, B, D, E.
Рішення про інфраструктуру
Чому API, а не власний GPU
На старті й ранньому зростанні платні API дешевші за власний GPU у 3–4 рази — і значно простіші в експлуатації. Власний GPU стає вигідним лише на великому обсязі.
Платні API
за 50 000 хв/міс (≈ 10 000 дзвінків)
- ✓Нуль DevOps на інференс
- ✓Оплата лише за фактичне використання
- ✓Миттєве масштабування під навантаження
- ✓Запуск за тижні, без капітальних витрат
Власний GPU
за той самий обсяг 50 000 хв/міс
- ✕GPU простоює ~96% часу на малому обсязі
- ✕Потрібен DevOps: vLLM, моніторинг, оновлення моделей
- ✕Фіксована вартість незалежно від навантаження
- →Окупається лише з ~215 000 хв/міс
Усе сховано за єдиним інтерфейсом, тож коли обсяг перетне ~215 000 хв/міс, транскрипцію переносимо на власний GPU без переписування системи — зони архітектури A, B, D, E лишаються незмінними.
Від звуку до аналітики
Як розмова стає цифрою
Чотири перетворення: сирий звук дзвінка крок за кроком стає структурованою оцінкою менеджера та зведеною аналітикою.
Сирий аудіозапис дзвінка
Транскрипт із діаризацією
«…надішлю комерційну пропозицію вже сьогодні» — цитата-доказ
Оцінка за вашим чек-листом
Середні оцінки по команді
Звіти та аналітика
Метрики поверх PostgreSQL з Cube
Cube — семантичний шар над базою: метрики описуються один раз, а віддаються через API з пре-агрегаціями та кешем. Звіти лишаються швидкими на самому PostgreSQL — без окремого пошукового рушія.
PostgreSQL
Call · Score · Utterance
Cube
пре-агрегації + кеш
API
REST / GraphQL / SQL
Next.js
дашборди та звіти
cubes: - name: calls sql_table: calls measures: - name: avg_score sql: score type: avg - name: count type: count dimensions: - name: manager sql: manager_id type: string - name: week sql: created_at type: time pre_aggregations: - name: by_manager_week measures: [avg_score, count] dimensions: [manager] granularity: week
Середній бал по менеджеру
avg_scoreДинаміка якості по тижнях
granularity: weekТоп заперечень клієнтів
countПідключення джерела
Що таке «реєстрація вебхука»
Після реєстрації в розділі Налаштування → Інтеграції ви отримуєте власну вебхук-адресу та секретний ключ. Цю адресу ви вказуєте у своїй телефонії чи CRM.
Коли дзвінок завершується, ваша система надсилає на цю адресу повідомлення із посиланням на запис. Symfony перевіряє підпис, зберігає аудіо й ставить дзвінок у чергу на обробку. Одне налаштування на старті — далі автоматично.
- ✓Підпис HMAC-SHA256 захищає від підробних запитів.
- ✓Двоканальні записи — менеджер і клієнт на окремих доріжках, без помилок діаризації.
- ✓Немає вебхука — записи можна завантажувати вручну або через REST API.
POST https://api.calllens.app/v1/calls/webhook X-CallLens-Signature: sha256=9f3a… { "call_id": "c_8421", "recording_url": "https://…/rec.mp3", "agent_id": "mgr_17", "channels": "dual", "started_at": "2026-06-17T09:14:02Z", "duration_sec": 312 }
#[Route]('/v1/calls/webhook', methods:['POST']) public function handle(Request $r): Response { $this->verifySignature($r); // HMAC $bus->dispatch(new ProcessCall($payload)); return new Response(status: 202); }
Інфраструктура · залізо
Одного виділеного сервера достатньо
Уся важка обробка — транскрипція, оцінка, ембединги — виконується на зовнішніх API, тож серверу не потрібен GPU. Він тримає лише застосунок, воркери, базу та чергу — це спокійно тягне один виділений сервер Hetzner.
Hetzner AX-line
- AMD Ryzen · 8 ядер / 16 потоків
- 64 ГБ DDR5 ECC
- 2 × 512 ГБ NVMe (RAID 1)
- 1 Гбіт/с, без ліміту трафіку
+ ~€39 одноразово (налаштування)
Hetzner Object Storage
- S3-сумісне (працює з тим самим кодом)
- ЦОД у ЄС · GDPR (замість Cloudflare)
- 1 ТБ сховища + 1 ТБ трафіку в базі
- далі — pay-as-you-go
S3 API-виклики та вхідний трафік — безкоштовно
сервер + сховище
Чому одного сервера достатньо
- ✓Немає GPU — лише веб, воркери, база, черга
- ✓Воркери чекають на відповіді API (I/O), а не вантажать CPU
- ✓PostgreSQL + Redis спокійно живуть на 64 ГБ і NVMe
- →Масштаб: більший сервер або +окремий воркер
Що встановлено на сервері
Повний стек проєкту на одному вузлі (натисніть для деталей):
Безкоштовна веб-панель для адміністрування сервера: вебсервер, бази, домени, SSL, cron і бекапи — у графічному інтерфейсі, без ручної консолі. Окремо дає аналітику роботи сервера в реальному часі.
Ціни Hetzner вказані без ПДВ і орієнтовні — перевірте актуальні конфігурації та вартість на сайті Hetzner перед замовленням.
Технічний стек
На чому це працює
Натисніть на будь-яку технологію, щоб відкрити її офіційний сайт.
Symfony
Бекенд, REST-API, мультитенантність
Symfony Messenger
Асинхронна черга обробки дзвінків
Doctrine ORM
Маппінг сутностей на PostgreSQL
PostgreSQL
Основна база: дзвінки, оцінки, звіти
pgvector
Вектори реплік і семантичний пошук
Cube
Семантичний шар і пре-агрегації для звітів
Next.js
Фронтенд дашбордів на React
Hetzner Object Storage
S3-сумісне сховище аудіо (EU, GDPR)
Twilio
Телефонія та запис дзвінків
Symfony AI · HttpClient
Виклики зовнішніх API за єдиним інтерфейсом
Deepgram
STT API: транскрипція з діаризацією
AssemblyAI
STT API: альтернатива
OpenAI
LLM-оцінка та ембединги
Google Gemini
LLM-оцінка (дешевий клас)
Voyage AI
Embeddings API для пошуку
Готові підключити свій відділ продажів?
Реєстрація, вебхук, чек-лист — і перші оцінки вже сьогодні.