WebCall CDR — справочная информация

Информация о проекте, лицензия

WebCall CDR — веб-приложение для работы с детализацией вызовов, аудиозаписями телефонных разговоров, распознаванием речи, речевой аналитикой и отчётами по качеству коммуникаций.

Проект не ограничен использованием только с Asterisk. Asterisk CDR через MySQL — штатный сценарий подключения, но систему можно интегрировать с любым источником телефонных разговоров через REST API: внешняя система может загружать аудиофайлы и метаданные звонков, после чего WebCall CDR выполнит распознавание и аналитику.

Основные данные

  • CDR может браться из MySQL базы Asterisk или поступать из внешних систем через REST API.
  • Транскрипты и результаты анализа хранятся в MongoDB.
  • ASR-сервер распознаёт аудиофайлы.
  • LLM-сервер формирует аналитику, метрики и проблемные сигналы.

Ключевые разделы

  • «Настройки» — подключение баз, ASR, LLM, промта и API.
  • «Вызовы» — поиск CDR и прослушивание записей.
  • «Аналитика» — отчёты, карточки звонков, качество и динамика.
  • «Проблемы» — радар повторяющихся проблем по звонкам.

Лицензия

                      
MIT License

Copyright (c) 2026 WebCall CDR

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Запуск системы

Веб-интерфейс WebCall CDR по умолчанию работает по протоколу HTTP на порту 8082. Для доступа к системе через Интернет не публикуйте этот HTTP-порт напрямую: обязательно используйте HTTPS reverse proxy с действующим TLS-сертификатом, например Nginx, Caddy, Traefik или другой корпоративный прокси.
Данные авторизации по умолчанию после первого запуска: логин admin, пароль admin. После входа рекомендуется сразу сменить пароль администратора.

Для качественного анализа необходимы качественные записи разговоров. Рекомендуемый формат — WAV stereo с разделением спикеров по каналам: один канал — сотрудник, второй канал — клиент.

Пример dialplan Asterisk

fdate=${STRFTIME(${EPOCH},,%Y%m%d%H%M%S)};
year=${STRFTIME(${EPOCH},,%Y)};
month=${STRFTIME(${EPOCH},,%m)};
date=${STRFTIME(${EPOCH},,%d)};
fname=/var/spool/asterisk/monitor/${year}/${month}/${date}/${fdate}-${CALLERID(NUM)}-${EXTEN}-${UNIQUEID};
MixMonitor(,r(${fname}-in.wav)t(${fname}-out.wav),
sox ${fname}-in.wav ${fname}-out.wav --channels 2 --combine merge ${fname}.wav && rm ${fname}-in.wav && rm ${fname}-out.wav);
Соответствие спикеров каналам настраивается в меню «Настройки» → «Аналитика»: поля «Левый канал записи» и «Правый канал записи».

MP3-файлы тоже обрабатываются, но качество распознавания и анализа обычно хуже. Диаризация по спикерам не выполняется: если файл моно, все фразы будут обработаны как обычные «реплики» без разделения по каналам.

1. База данных MongoDB

MongoDB хранит транскрипты, результаты аналитики, отчёты и данные проблемного радара.

docker run -d --name mongodb -p 27017:27017 -v /opt/mongo_data:/data/db mongo:latest
  • -v /opt/mongo_data:/data/db — постоянное хранение данных MongoDB на сервере.
  • По умолчанию приложение ожидает MongoDB на 127.0.0.1:27017, базу webcallcdr, коллекцию calls.

2. Сервер ASR

ASR выполняет распознавание речи и должен быть доступен приложению по HTTP.

Для распознавания используется T-one ASR.

docker run -d -p 2710:2710 webcallpbx/webcallasr:latest

Адрес по умолчанию: http://127.0.0.1:2710/v1/audio/transcriptions.

3. WebCall CDR

docker run -d --net host \
-v /opt/webcallcdr:/opt/webcallcdr \
-v /var/spool/asterisk/monitor:/monitor \
-v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro \
webcallpbx/webcallcdr:beta
  • --net host — использовать сеть сервера. Альтернатива: проброс порта -p 8082:8082.
  • -v /opt/webcallcdr:/opt/webcallcdr — данные приложения и конфигурация сохраняются при перезапуске контейнера.
  • -v /var/spool/asterisk/monitor:/monitor — папка с записями разговоров внутри контейнера доступна как /monitor.
  • -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro — использовать таймзону сервера.

После запуска откройте интерфейс на порту 8082, войдите в систему, перейдите в «Настройки» и заполните параметры MySQL, MongoDB, ASR и LLM.

4. Локальная LLM на NVIDIA GPU 16GB VRAM

  1. Установите драйверы NVIDIA.
  2. Установите NVIDIA Container Toolkit.
  3. Скачайте модель google_gemma-4-26B-A4B-it-IQ4_XS.gguf в каталог /home/models.
  4. Запустите контейнер LLM-сервера:
docker run -d --runtime=nvidia --gpus all -p 8000:8000 \
-v /home/models:/models ghcr.io/ggml-org/llama.cpp:server-cuda \
-m /models/google_gemma-4-26B-A4B-it-IQ4_XS.gguf \
--host 0.0.0.0 --port 8000 -c 10240 -fa on --n-gpu-layers 999 \
--batch-size 512 --parallel 1 --reasoning off

OpenAI-compatible endpoint по умолчанию: http://127.0.0.1:8000/v1/chat/completions. Модель google_gemma-4-26B-A4B-it и запуск через llama.cpp приведены только как пример локального инференса. Можно использовать любую локальную или облачную LLM, если она предоставляет совместимый OpenAI API endpoint. Облачную модель вместо локальной можно настроить в «Настройки» → «Аналитика», указав LLM host, модель и API key.

Настройки MySQL

Раздел задаёт подключение к базе CDR Asterisk и соответствие полей, по которым WebCall CDR читает вызовы.

ПолеНазначение
MySQL hostАдрес и порт сервера MySQL, например 127.0.0.1:3306.
MySQL database nameИмя базы данных Asterisk, обычно asterisk.
MySQL login / passwordПользователь и пароль с правами чтения таблицы CDR.
Поле MySQL с временем вызоваИмя поля даты вызова, по умолчанию calldate.
Поле входящего номера DIDПоле для отображения входящей линии или DID.
Поле исходящей линииПоле для определения исходящей линии.
Папка записей разговоровКаталог, где приложение ищет аудиофайлы. В Docker-примере это /monitor.
Если MySQL недоступен или параметры неверны, раздел «Вызовы» перенаправит пользователя в «Настройки», а главная страница покажет ошибку подключения.

После сохранения проверьте главную страницу и раздел «Вызовы»: должны появиться записи CDR за выбранный период.

Настройки Аналитика

Этот раздел объединяет MongoDB, ASR, LLM и параметры автоматической обработки звонков.

Хранилище и сервисы

  • MongoDB host, login, password, database, collection — место хранения транскриптов и результатов анализа.
  • Сервер распознавания — endpoint ASR, обычно http://127.0.0.1:2710/v1/audio/transcriptions.
  • LLM host — OpenAI-compatible endpoint, например http://127.0.0.1:8000/v1/chat/completions.
  • LLM model — имя модели для облачного OpenAI API или совместимого сервера.
  • LLM API key — ключ авторизации, если сервер его требует.

Переключатели обработки

  • «Включить распознавание» — разрешает ASR-обработку аудио.
  • «Включить речевую аналитику» — разрешает отправку транскриптов в LLM.
  • «Запускать радар проблем» — включает периодический поиск повторяющихся проблем.
  • «Показывать имена менеджеров» — управляет отображением имён сотрудников в отчётах.
  • Отдельные флаги входящих, внутренних и исходящих вызовов определяют, какие направления попадут в обработку.

Очередь и качество данных

  • Интервал сканирования — как часто искать новые звонки.
  • Период сканирования дней — глубина поиска новых записей.
  • Очередь вызовов — максимальный размер очереди обработки.
  • Одновременная обработка — число параллельных задач.
  • Минимальная продолжительность — короткие звонки ниже порога не анализируются.
  • Левый/правый канал записи — подписи спикеров для stereo WAV.

Настройки LLM-промт

LLM-промт описывает бизнес-контекст компании и правила, по которым модель анализирует разговор. От качества этих настроек зависит точность классификации, метрик и выявленных проблем.

Обязательные блоки

  • Описание деятельности компании — чем занимается компания, какие услуги оказывает, как устроен процесс обслуживания.
  • Тема звонка — типовые причины обращений и сценарии диалогов.
  • Продукты компании — товары, услуги, тарифы, сервисные направления.
  • Выполнение скрипта — список пунктов скрипта с весами points.
  • Метрики — показатели, которые модель должна оценивать.
  • AI-скоринг — критерии итоговой оценки качества разговора.
  • Категории проблем — словарь проблем для аналитики и радара проблем.
  • Признаки критической ситуации — правила выделения критичных звонков.
При сохранении промта приложение проверяет заполненность обязательных блоков. Если один из блоков пустой, форма не будет сохранена.

После изменения промта новые звонки будут анализироваться по обновлённым правилам. Уже обработанные документы в MongoDB не пересчитываются автоматически, если не запущена повторная обработка.

Вызовы

Раздел «Вызовы» показывает детализацию CDR из MySQL и помогает найти нужные записи разговоров.

Основные возможности

  • Выбор периода дат: начало и окончание периода.
  • Поиск по номеру, имени, линии или другим отображаемым данным CDR.
  • Фильтры: группировать или показывать все CDR, отвеченные/неотвеченные, входящие/исходящие.
  • Выгрузка найденной детализации в Excel через кнопку экспорта.
  • Прослушивание записи, если файл найден в папке записей.
  • Открытие текста/транскрипта и карточки анализа, если звонок уже обработан.

Как приложение находит запись

Путь поиска задаётся настройкой «Папка записей разговоров». Рекомендуется хранить файлы в структуре по годам, месяцам и дням, а в имени использовать UNIQUEID. Это повышает вероятность корректного сопоставления CDR и аудиофайла.

Если запись не отображается, проверьте монтирование каталога в Docker, права доступа к файлам и наличие UNIQUEID в имени файла.

Аналитика

Модуль аналитики строит отчёты на основе документов MongoDB: транскриптов, классификации, метрик, скриптов, эмоций, критичности и AI-скоринга.

Что показывает отчёт

  • Количество обработанных звонков за период.
  • Группировку по дням, операторам, направлениям и отделам.
  • Средние оценки AI-скоринга и выполнение скрипта.
  • Эмоции клиента и оператора, решённость обращения, критичные случаи.
  • Таблицу звонков с фильтрами и переходом в карточку конкретного разговора.
  • Качество обслуживания: интегральный показатель, компоненты качества и динамика.

Карточка звонка

Карточка открывает детали одного разговора: аудио, транскрипт, краткое резюме, классификацию, проблему, предложенное решение, метрики, скоринг и дополнительные инсайты.

Условия корректной работы

  • MongoDB должна быть доступна.
  • Нужны обработанные звонки в коллекции, указанной в настройках.
  • Промт должен соответствовать бизнес-процессу компании.
  • Для точного разделения ролей лучше использовать stereo WAV с настроенными каналами.

Проблемы

Модуль «Проблемы» представлен радаром проблем. Он анализирует problem_signals в результатах речевой аналитики и помогает найти повторяющиеся сбои сервиса, коммуникации или продукта.

Как работает радар

  1. Фоновая задача проверяет, включён ли параметр «Запускать радар проблем».
  2. С заданным интервалом берёт обработанные звонки за период.
  3. Собирает сигналы проблем: категория, описание, сервис, severity.
  4. Группирует проблемы и рассчитывает количество, среднюю/максимальную критичность и индекс деградации.
  5. Сохраняет агрегаты в MongoDB коллекции problems_radar_daily, историю и live-данные.
  6. LLM дополнительно формирует краткие инсайты по категориям проблем.

Интерфейсы

  • Радар — текущая панель проблем, топ проблем и динамика.
  • Список вызовов — переход к звонкам по категории, проблеме, окну времени или конкретному сигналу.
  • API радара — внутренние endpoints для обновления и пересчёта данных.
Чтобы модуль был полезным, настройте в LLM-промте качественные категории проблем и признаки критичности. Тогда problem_signals будут стабильными и сопоставимыми между звонками.

REST API

REST API предназначен для интеграции с внешними системами: загрузки аудиофайлов на обработку и выгрузки результатов распознавания/аналитики.

Настройка доступа

  1. Откройте «Настройки» → «REST API».
  2. Включите «Включить REST API».
  3. При необходимости включите «Загружать файл записи на сервер» — тогда файлы сохраняются в папку записей.
  4. Создайте токен и сохраните его сразу: повторно он не показывается.
  5. Передавайте токен в заголовке Authorization: Bearer или X-API-Token.

Endpoints

МетодURLНазначение
GET/api/docsSwagger UI документация.
GET/api/openapi.jsonOpenAPI спецификация.
POST/api/v1/audioЗагрузить аудиофайл wav/mp3/ogg и поставить его в очередь обработки.
GET/api/v1/callsВыгрузить список документов звонков из MongoDB с фильтрами.
GET/api/v1/calls/{id}Выгрузить один звонок по uniqueid, linkedid или audio_uniqueid.

Параметры выгрузки звонков

  • date_from, date_to — диапазон дат.
  • call_id, id, uniqueid, linkedid — поиск по идентификатору.
  • phone — поиск по src или dst.
  • type=transcript — вернуть только текст разговора.
  • type=analytics — вернуть только аналитику.
  • Без type возвращается полный документ.
Если API выключен в настройках, защищённые методы возвращают ошибку 403 REST API disabled. Если токен неверный — 401 invalid api token.