Статья

Расшифровка совещаний без облака: Whisper и разделение спикеров

Редакция Avenex · 2026-10-13

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

Из чего состоит конвейер

Запись сначала переводится в WAV 16 кГц через ffmpeg — такой формат ждут модели распознавания речи. Затем текст распознаёт Whisper large-v3. На Mac с Apple Silicon мы используем сборку mlx-whisper: она считает на видеоядрах через Metal. Язык модель определяет сама, но его можно указать явно.

Отдельный шаг — разделение спикеров (диаризация). Его делает pyannote speaker-diarization-3.1. Whisper отвечает на вопрос «что сказали», pyannote — «кто говорил». Результат обоих шагов сводится в один текст с метками говорящих и таймкодами.

Как работать без интернета

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

Для ноутбука без видеокарты подходит другой вариант. В нашем голосовом помощнике для диктовки распознавание идёт либо через Whisper с ускорением на GPU, либо через модель Parakeet, оптимизированную под обычный процессор. Перед распознаванием детектор речи (VAD) отбрасывает тишину: так меньше лишней работы и меньше «призрачных» фраз на пустых участках.

Узнавание знакомых голосов

Pyannote сам по себе не знает имён: он выдаёт метки SPEAKER_00, SPEAKER_01 и так далее. Каждый раз подписывать спикеров вручную утомительно, поэтому мы храним галерею голосовых отпечатков. Для каждого говорящего pyannote отдаёт усреднённый вектор голоса, и он сравнивается с галереей по косинусному сходству.

Имя ставится, только если лучший кандидат набрал не меньше 0,5 и заметно — минимум на 0,1 — опережает второго. Иначе остаётся SPEAKER_XX: лучше честная метка, чем уверенно подписанный не тот человек. Голос человека заносится в галерею один раз, по уже размеченной записи. Если на встрече известно число участников, его можно подсказать диаризации.

От расшифровки к решениям и задачам

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

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

Где хранить результат

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

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