Модуль записи совещаний (callrecording)
Модуль callrecording захватывает аудио из браузерной вкладки и микрофона через Chrome-расширение, передаёт потоком по WebSocket, транскрибирует через GigaAM и генерирует резюме через LLM. Результат сохраняется как Citeck-активность типа meeting-activity или call-activity.
Статья описывает архитектуру модуля, REST API, конфигурацию, артефакты и ключевые файлы. Функциональность доступна начиная с версии 1.11.0 (30 апреля 2026).
Принцип работы
Расширение решает сквозную задачу: от момента обнаружения активного звонка до появления структурированной записи встречи в CRM/проекте — без ручного участия пользователя в процессе обработки.
Обнаружение звонка
content/call-detector.js следит за открытыми вкладками Chrome. Как только пользователь переходит на страницу Yandex Telemost, скрипт отправляет событие call-detected в Service Worker. Пользователю достаточно открыть вкладку встречи — ничего запускать вручную не нужно.
Захват и передача аудио
Service Worker создаёт скрытое окно-рекордер (recorder/recorder.js), которое работает параллельно со встречей:
Захват голосов участников — через
tabCapture.getMediaStreamIdполучает аудиопоток вкладки Telemost (то, что слышит пользователь).Захват микрофона — через
getUserMedia({audio: true})захватывает локальный микрофон пользователя.tabCaptureсам по себе микрофон не включает, поэтому используется отдельный поток.Микширование — оба потока объединяются в
AudioContextчерезGainNode, образуя единый аудиовыход.Кодирование —
MediaRecorderпишет сжатый поток в форматaudio/webm;codecs=opusчанками по 5 секунд, что позволяет начинать передачу немедленно, не дожидаясь конца встречи.Стриминг — каждый чанк отправляется по WebSocket с бинарным протоколом: 4 байта sequence number (big-endian) + аудиоданные. При разрыве соединения
lib/ws-client.jsавтоматически переподключается с экспоненциальной задержкой (до 5 попыток, максимум 30 сек).
Состояние записи зеркалируется в chrome.storage.session, чтобы не потерять контекст при выгрузке MV3 Service Worker после ~30 сек неактивности.
Транскрипция и генерация резюме
Аудиопоток поступает в бэкенд citeck-ai через WebSocket-эндпоинт /gateway/ai/ws/ (проксируется через nginx в обход основного gateway, который WebSocket не поддерживает). Бэкенд запускает pipeline:
STT — Микросервис для транскрипции аудио и диаризации транскрибирует аудио с помощью GigaAM (распознавание речи на русском языке).
LLM summary — на основе транскрипта языковая модель формирует структурированное резюме встречи.
Сессия завершается текстовым WebSocket-сообщением { type: "end" }. Пока идёт обработка, Service Worker каждые 3 секунды опрашивает /session/{id}/status (до 15 минут) и записывает результат в chrome.storage.local.
Сохранение в Citeck
Результат — транскрипт и резюме — сохраняется как объект meeting-activity в платформе Citeck и автоматически привязывается к нужной сущности (сделке или проекту). Пользователь выбирает сущность в popup-интерфейсе расширения через combobox с поиском ещё до начала записи.
Уведомление пользователя
Когда обработка завершена, Service Worker отправляет Chrome Notification. Popup расширения может быть закрыт к этому моменту — уведомление гарантирует, что пользователь узнает о готовности результата вне зависимости от состояния UI.
Архитектура
Chrome Extension (захват аудио)
→ WebSocket /ws/call-recording
→ CallRecordingWebSocketHandler
→ CallRecordingService
→ GigaAmSttProvider (транскрибация)
→ CallSummaryService (LLM-резюме)
→ CallActivityService (сохранение в Citeck)
Зависимости (внешние сервисы)
citeck-ai — WebSocket-хэндлер + pipeline: STT → LLM summary → сохранение активности
citeck-stt-sidecar — сервис транскрипции на базе GigaAM
nginx — WebSocket proxy (
/gateway/ai/ws/) в обход основного gateway, который WS не проксирует
REST API
Метод |
URL |
Описание |
|---|---|---|
|
|
Платформы, типы записей, STT-провайдер (Speech-to-Text — сервис распознавания речи, преобразующий аудио в текст) |
|
|
Поиск записей по типу |
|
|
Старт сессии — возвращает |
|
|
Завершение сессии и пост-обработка |
|
|
Статус сессии |
|
|
Потоковая передача аудио (4 байта sequence + аудиоданные) |
Конфигурация
Настройки задаются в application.yml:
citeck.ai.call-recording:
enabled: true
stt:
provider: gigaam
sidecar-url: http://localhost:8090
language: ru
enable-diarization: false
session:
max-duration-minutes: 180
chunk-size-seconds: 30
summary:
model: ${citeck.ai.base.model}
temperature: 0.3
Через UI
В рабочем пространстве администратора в разделе AI перейдите в журнал Запись звонков:
Заполните Название.
Выберите Типы данных для привязки.
Укажите STT-провайдер по умолчанию для платформы (например, GigaAM для Telemost).
Сохраните.
Citeck-артефакты
Модуль добавляет аспект recording-aspect с атрибутами recording (аудиофайл), transcription, transcriptionDiarized, summary, recordingDuration, recordingStatus, callPlatform, meetingUrl. Аспект подключается к типам meeting-activity и call-activity через artifact-patch.
Путь |
Назначение |
|---|---|
|
Аспект с атрибутами записи |
|
Подключение аспекта к |
|
Подключение аспекта к |
|
Форма с полями аудио, резюме, расшифровки |
|
Действие привязки встречи к сделке или проекту |
|
Тип конфигурации записи (типы, платформы, STT-провайдер) |
|
Форма администрирования конфигурации |
|
Журнал конфигураций |
|
Дашборд встречи |
LLM-промпт
src/main/resources/prompts/call_summary_prompt.xml — инструкция для генерации резюме на русском языке. Промпт формирует адаптивный по длине текст с разделами: ключевые темы, решения, задачи, открытые вопросы, участники.
Тесты
Файл |
|---|
|
|
|
Ключевые файлы
Компонент |
Файл |
|---|---|
Оркестрация сессий |
|
WebSocket-обработчик |
|
REST-контроллер |
|
STT через GigaAM |
|
LLM-резюме |
|
Загрузка в Citeck |
|
Перехват Telemost-URL |
|
Конфигурационные свойства |
|
DTO и статусы |
|
Все пути относительно src/main/java/ru/citeck/ecos/ai/.