Содержание
  1. Карта выбора под ваш вход
  2. Ручной эталон и выход модели
  3. Проверка положительного и отрицательного случаев
  4. Продуктовый путь, API и условия доступа
  5. Границы применимости
  6. Согласование scope, примера и критериев приёмки
  7. Частые вопросы
Подборки и сравнения

Диаризация речи: WhisperX, pyannote или NeMo

7 ноября 2026 · 10 минут чтения

Диаризация речи: WhisperX, pyannote или NeMo — три пути к меткам говорящих. WhisperX собирает ASR, выравнивание и спикерный компонент в один конвейер. pyannote даёт самостоятельный спикерный инструмент. NeMo предлагает собственный стек с настраиваемыми диаризационными конвейерами. Выбор зависит от того, что у вас уже есть на входе.

Карта выбора под ваш вход

Начните с вопроса: что вы подаёте на вход и что хотите получить на выходе. Документация WhisperX описывает проект как быстрый распознаватель речи с временными метками на уровне слов и диаризацией говорящих. Внутри он опирается на pyannote-audio для спикерных меток, о чём сказано в разделе благодарностей README. Это значит, что WhisperX и pyannote связаны: первый использует второй как компонент.

pyannote.audio — открытый инструмент на Python для диаризации говорящих, построенный на PyTorch. В его README заявлены предобученные конвейеры и модели на Hugging Face, которые можно дообучать на своих данных. Это самостоятельный спикерный компонент: вы получаете разметку «кто когда говорил» без распознавания текста.

NeMo от NVIDIA описывает диаризацию как процесс сегментации записи по меткам говорящих и отвечает на вопрос «кто говорил когда». Документация NeMo перечисляет два типа систем: сквозные (end-to-end) и каскадные. Сквозная система принимает сырой аудиосигнал и выдаёт спикерную активность по кадрам. Каскадная состоит из модулей: детектор голосовой активности, экстрактор спикерных эмбеддингов, модуль кластеризации и нейронный диаризатор.

Заполненная карта выбора выглядит так. Нужен текст с временными метками слов плюс метки говорящих в одном проходе — кандидат WhisperX. Нужен самостоятельный спикерный компонент, который встраивается в ваш конвейер — кандидат pyannote.audio. Нужен стек NeMo с его настраиваемыми диаризационными конвейерами — кандидат NeMo. Условия доступа к моделям и лицензии проверяются отдельно для каждого варианта.

Что у вас на входе Что нужно на выходе Кандидат
Аудио, нужен текст и метки говорящих Транскрипт с временными метками слов и спикерными метками WhisperX
Аудио, текст уже есть Только разметка «кто когда говорил» pyannote.audio
Аудио, нужен настраиваемый стек Диаризационный конвейер с выбором модулей NeMo

Отдельно проверьте язык распознавания и условия идентификации спикера. Это разные задачи с разными требованиями.

Ручной эталон и выход модели

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

Возьмём учебную шкалу длительностью 0–8 секунд. На отрезке 0–2 секунды говорит A. На 2–4 секунды говорит B. На 4–5 секунд пауза. На 5–6 секунд одновременно говорят A и B. На 6–8 секунд снова говорит A. Полная атомарная аннотация выглядит так: [0,2,A], [2,4,B], [5,6,A], [5,6,B], [6,8,A]. Последние отрезки A можно объединить в [5,8,A], поэтому требовать ровно пять строк ошибочно. Проверяют покрытие речи, паузы и перекрытие.

Метки модели SPEAKER_00 и SPEAKER_01 сопоставляются с A и B одной глобальной взаимно однозначной перестановкой. Простой обмен местами меток 0 и 1 не меняет смысл диаризации. Контрпример [0,8,A] не проходит проверку: он покрывает паузу 4–5 секунд, теряет второго говорящего и перекрытие 5–6 секунд.

Режим exclusive diarization, который специально оставляет одного говорящего на время, не объявляется способным представить этот контракт перекрытия без отдельного выхода. В README pyannote community-1 сказано, что конвейер возвращает новую исключительную диаризацию поверх обычной, доступную как output.exclusive_speaker_diarization. Она упрощает согласование мелких спикерных меток с метками транскрипции.

Эта шкала задаёт ручной контракт аннотации. Она не измеряет способность выбранной модели разделять этих людей. Для реального пилота читатель записывает и размечает своё разрешённое аудио.

Проверка положительного и отрицательного случаев

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

Положительный случай: [0,2,A], [2,4,B], [5,6,A], [5,6,B], [6,8,A]. Проверяем по пунктам. Отрезок 0–2 покрыт меткой A. Отрезок 2–4 покрыт меткой B. Отрезок 4–5 остаётся паузой без метки. Отрезок 5–6 покрыт двумя метками одновременно. Отрезок 6–8 покрыт меткой A. Все условия контракта выполнены.

Отрицательный случай: [0,8,A]. Проверяем по тем же пунктам. Отрезок 4–5 покрыт меткой A, хотя там пауза. Второй говорящий B отсутствует. Перекрытие 5–6 не представлено. Три нарушения из трёх проверяемых условий.

Порядок проверки на своём аудио выглядит так. Сначала вы размечаете эталон вручную по секундам. Затем прогоняете выбранный инструмент и сохраняете его выход. Потом сопоставляете метки модели с вашими метками одной глобальной перестановкой. После этого проверяете покрытие речи, покрытие паузы и наличие перекрытия. Число отрезков в проверку не входит.

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

Проверка Положительный случай Отрицательный случай
Покрытие речи 0–2, 2–4, 5–6, 6–8 0–8
Пауза 4–5 без метки покрыта меткой A
Второй говорящий B присутствует B отсутствует
Перекрытие 5–6 две метки не представлено

Продуктовый путь, API и условия доступа

У каждого варианта свой путь запуска и свои условия доступа. Разберём по порядку.

WhisperX ставится через pip install whisperx или через uvx whisperx, как указано в README проекта. Для ускорения на GPU документация называет установку CUDA toolkit 12.8 до WhisperX. Для включения диаризации нужен токен доступа Hugging Face с правами чтения, который передаётся после аргумента —hf_token, и принятие пользовательского соглашения для модели speaker-diarization-community-1. Командная строка поддерживает флаги —model, —diarize, —min_speakers, —max_speakers, —language, —compute_type, —device.

pyannote.audio ставится через uv add pyannote.audio или pip install pyannote.audio. README перечисляет шаги: установить ffmpeg, принять условия модели pyannote/speaker-diarization-community-1, создать токен доступа Hugging Face. Конвейер запускается локально на вашем компьютере. Для GPU есть вызов pipeline.to(torch.device(«cuda»)). Число говорящих задаётся опциями num_speakers, min_speakers, max_speakers.

Премиальный конвейер precision-2 работает иначе: нужен ключ API pyannoteAI из панели dashboard.pyannote.ai, и обработка идёт на серверах pyannoteAI. README разделяет бенчмарки community-1 и precision-2; учитывайте локальный режим community-1 и серверный pyannoteAI у precision-2.

NeMo описывает собственный набор инструментов. Документация перечисляет сквозные модели, включая Sortformer Diarizer — трансформерную модель, которая оценивает спикерные метки и выдаёт индексы говорящих в порядке появления. Каскадная система собирается из модулей, перечисленных выше. В документации указаны руководства для сквозной и каскадной диаризации, а также для получения транскрипций ASR вместе со спикерными метками.

Промпт ниже помогает спланировать проверку на своём материале.

КОД10 строк
Ты помогаешь спланировать проверку диаризации говорящих.
Вход: [описание вашего аудио — число говорящих, длина, наличие перекрытий]
Инструмент: [WhisperX / pyannote.audio / NeMo]
Задача: составь пошаговый план проверки.
1. Как разметить ручной эталон по секундам.
2. Какие поля сохранить из выхода инструмента.
3. Как сопоставить метки модели с эталоном одной перестановкой.
4. Какие проверки выполнить: покрытие речи, покрытие паузы, перекрытие.
5. Какие ограничения инструмента учесть заранее.
Верни план списком без пояснений.

Меняйте под себя описание аудио и название инструмента. Вариации той же задачи: план проверки для записи с двумя говорящими; план проверки для записи с перекрытиями; план проверки для длинного файла; план сравнения двух инструментов на одном аудио; план проверки условий доступа к моделям.

Границы применимости

Универсального качества, скорости, приватности или юридической достаточности здесь нет. Каждый вариант имеет свои ограничения, и их стоит знать до запуска.

Документация WhisperX называет ограничения прямо: слова, не содержащие символов из словаря модели выравнивания, не получают временную метку; перекрывающаяся речь обрабатывается плохо; диаризация далека от идеала; нужна языковая модель wav2vec2. Ускорение выравнивания до 30–100 раз достигается установкой Numba, о чём сказано в README.

pyannote.audio по умолчанию работает на CPU. Перевод на GPU описан отдельным вызовом. Для офлайн-использования README предлагает скопировать конвейер на диск через git lfs и загружать его из локального пути без подключения к интернету. Телеметрия настраивается переменной окружения PYANNOTE_METRICS_ENABLED или вызовом set_telemetry_metrics.

NeMo различает сквозные и каскадные системы. Документация отмечает, что каскадные системы сложнее оптимизировать целиком и разворачивать, но они имеют меньше ограничений на число говорящих и длину сессии. Сквозные системы проще в оптимизации и развёртывании.

Приватность зависит от того, где выполняется обработка. Локальный запуск pyannote.audio community-1 и WhisperX на своём железе держит аудио у вас. Премиальный конвейер precision-2 обрабатывает запись на серверах pyannoteAI. Юридическую достаточность обработки голосовых данных определяет ваша ситуация, и здесь её оценить нельзя.

Согласование scope, примера и критериев приёмки

Scope описывает, что вы сравниваете. WhisperX — это конвейер ASR, выравнивания и диаризации. pyannote — спикерный компонент. NeMo — другой набор инструментов. WhisperX может использовать pyannote внутри, поэтому объявлять их независимыми семействами моделей некорректно.

Пример — это ваше разрешённое аудио с ручной разметкой. Учебная шкала 0–8 секунд показывает семантику выхода и критерии выбора. Она не измеряет DER или WER. Реальной записи, запуска, имён, значений DER и WER или скоростей в этом примере нет.

Схема данных описывает формат выхода. Для диаризации это список отрезков с началом, концом и меткой говорящего. Метки SPEAKER_00 и SPEAKER_01 — условные обозначения говорящих. Сопоставление с реальными именами выполняется отдельно и требует дополнительного источника данных.

Критерии приёмки формулируются до запуска. Покрытие речи: все отрезки с речью размечены. Покрытие паузы: отрезки без речи остаются без метки. Перекрытие: одновременная речь представлена двумя метками. Сопоставление меток: одна глобальная взаимно однозначная перестановка. Число отрезков в критерии не входит.

Условия доступа к моделям и лицензии проверяются отдельно для каждого варианта. Язык распознавания проверяется отдельно от идентификации спикера. Эти две проверки не объединяются.

Частые вопросы

Чем диаризация отличается от распознавания речи?

Диаризация отвечает на вопрос «кто говорил когда» и размечает запись по меткам говорящих. Распознавание речи отвечает на вопрос «что сказано» и выдаёт текст. Документация NeMo описывает это различие прямо: до диаризации известно, что сказано, но не известно, кем. Диаризация обогащает транскрипцию спикерными метками.

Можно ли использовать pyannote внутри WhisperX?

Да. README WhisperX указывает pyannote-audio как источник спикерных меток для мультиспикерного распознавания. В разделе благодарностей названы модели pyannote для VAD и диаризации. Это значит, что WhisperX и pyannote связаны как конвейер и компонент. Объявлять их независимыми семействами моделей некорректно.

Что нужно для локального запуска pyannote community-1?

Установить ffmpeg, поставить pyannote.audio, принять условия модели speaker-diarization-community-1 и создать токен доступа Hugging Face. README перечисляет эти шаги. Конвейер запускается локально на вашем компьютере. Для офлайн-работы конвейер копируется на диск и загружается из локального пути.

Как проверить метки говорящих на своём аудио?

Разметьте эталон вручную по секундам, прогоните инструмент, сохраните выход. Сопоставьте метки модели с эталоном одной глобальной перестановкой. Проверьте покрытие речи, покрытие паузы и перекрытие. Число отрезков в проверку не входит. Учебная шкала 0–8 секунд показывает, как это устроено.

Что делать с перекрывающейся речью?

Документация WhisperX предупреждает, что перекрывающаяся речь обрабатывается плохо. README pyannote community-1 описывает исключительную диаризацию, которая оставляет одного говорящего на время и упрощает согласование с транскрипцией. Для контракта перекрытия нужен отдельный выход. Проверяйте на своём материале, потому что гарантий здесь нет.

Читайте также

3 материала