Почему созвоны мы расшифровываем сами, а не отдаём наружу

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

Записи звонков в Kontext долго лежали мёртвым грузом. Получасовой созвон ради одной договорённости никто не переслушивает, а искать по записи было нечем. Очевидное решение — расшифровка: разговор превращается в текст, текст можно найти поиском и составить по нему краткое содержание.

Первый вопрос — не «как», а «куда уйдёт разговор»

Самый быстрый путь — отправлять записи в готовый сервис распознавания речи. Пара дней на подключение, приличное качество. Но у этого пути есть свойство, о котором редко думают заранее: каждый разговор команды целиком уходит чужой компании.

Разговор команды — самое личное, что есть в рабочем мессенджере. Переписку пишут, помня, что её прочитают; на созвоне говорят то, что никогда бы не написали. Обсуждение увольнения, спор о бюджете, разбор аварии с именами. Отдавать это наружу ради удобства — такое решение продукт не должен молча принимать за клиента.

Поэтому речь в текст у нас переводит своя модель, на нашем же сервере.

Сколько это стоит по времени

Модель работает на обычном процессоре, без видеокарты. Главный вопрос был — успеет ли она. Замер на рабочем сервере: десять минут звука расшифровываются за четыре минуты на четырёх ядрах. Это значит, что всё, что команда наговорила за день, расшифровывается за ночь, а короткий созвон — пока вы наливаете кофе.

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

Почему записи идут по одной

Очередь фоновых задач умеет выполнять по четыре задачи сразу. Для расшифровки это ловушка: модель и так занимает все четыре ядра, поэтому четыре разговора одновременно расшифровываются каждый вчетверо медленнее. Общее время то же, а первый результат появляется в четыре раза позже. Поэтому расшифровки идут строго по одной.

Сначала текст, потом краткое содержание

По расшифровке языковая модель составляет краткое содержание: «о чём говорили» и отдельно «договорились» — решения и кто что делает. Расшифровку мы сознательно сохраняем до того, как просим модель о кратком содержании. Если модель не ответила — кончился лимит, пропала связь, — текст уже сохранён и не пропадёт, а краткое содержание система запросит позже.

Есть и обратная ловушка: запись, в которой было тихо. Пустая расшифровка тоже сохраняется — как пустой текст. Иначе такая запись вечно возвращалась бы в очередь и каждый раз впустую занимала процессор на несколько минут.

Честно о качестве

Модель, которая пишет краткое содержание, предупреждена, что расшифровка машинная: имена искажаются, реплики не разделены по говорящим. На проверке это сработало как надо — на разговоре без решений она написала «конкретных решений не зафиксировано», а не придумала их. Под кратким содержанием в плеере подписано, что его составила модель. Пересказ, который выдают за протокол, хуже, чем никакого пересказа.

Чего пока нет: реплики не разделены по говорящим. Для этого нужна ещё одна модель, которая тянет за собой гигабайты дополнительных программ, — ради одной подписи «кто сказал». Пока это того не стоит.

Итог

  • созвоны расшифровывает своя модель на нашем сервере — сторонним сервисам распознавания разговоры не уходят;
  • десять минут звука расшифровываются за четыре минуты;
  • записи идут по одной, текст сохраняется раньше краткого содержания, пустые записи не застревают в очереди;
  • краткое содержание составляет языковая модель — и об этом честно написано и в плеере, и в политике конфиденциальности.

Как это выглядит для пользователя — на странице «Звонки и расшифровка».

Обновлено 17.10.2026. С 16 октября краткое содержание не ждёт, пока кто-то откроет плеер: бот присылает его сообщением «Итоги разговора» туда, где шёл разговор, — в голосовой канал, канал созвона или личку. Каждому участнику, которому видна запись, бот пишет в личку, какие задачи модель нашла в разговоре. Создаются они только по ответу человека — «создай все», «создай 1 и 3», — сам бот задач не создаёт.