Коротко
Автор заменил sherpa-onnx на Nemotron 3 Diarization для разметки собеседников в записях звонков. На его тестах новая модель заметно снизила ошибку и сократила обработку 34,8 часа аудио до 3,5 минуты, но потребовала пересмотреть фильтр эха и усилить проверки.
Контекст
Автор разрабатывает приложение Charoite_audio для записи и разбора встреч. Ранее диаризацию выполняла связка sherpa-onnx и собственного второго прохода: размечать канал собеседников в двадцатиминутном звонке занимало около семи минут. 23 сентября NVIDIA выпустила Nemotron 3 Diarization, и автор проверил её в своём рабочем процессе.
Главное
- Nemotron 3 Diarization — Sortformer на 100 млн параметров, рассчитанный максимум на восемь голосов; он выдаёт вероятности для каждого голоса с шагом 10 мс и допускает одновременную речь.
- Автор запускает MLX-порт через mlx-audio 0.5.6 только на Apple Silicon. Модель обучалась без русского языка, а веса распространяются под лицензией NVIDIA OpenMDW и не входят в репозиторий.
- На синтетических фикстурах результаты оказались обманчивыми: пример с перебиваниями дал DER 0,039, а запись четырёх голосов, говорящих по очереди, — DER 0,628. Автор заключил, что такие тесты не отражают работу модели на живой речи.
- На двух англоязычных встречах из AMI с четырьмя участниками Nemotron получил DER 0,269 и 0,277 против 0,606 и 0,453 у прежнего прохода. RTF составил 0,003 против 0,35; эталоном служила разметка pyannote по словам.
- На 57 личных встречах было 34,8 часа аудио: обработка заняла около 3,5 минуты. Эталонной разметки для этих записей не было, поэтому автор сверял результат с облачной ревизией стенограмм.
- На восьми встречах модель достигла предела в восемь голосов. Очные встречи, записанные одним микрофоном, автор не проверял.
- Из-за подписи приложения MLX нельзя было просто встроить в его бандл. Движок вынесли в отдельное окружение и процесс: приложение запускает отдельный Python и получает результат в JSON.
- Старое правило фильтрации эха перестало работать на выходе Nemotron: модель дробила реплики паузами, и эхо проходило как речь с микрофона. Подсчёт доли речи по всем отрезкам сразу вернул долю микрофонной речи примерно к прежнему уровню.
- Если движок недоступен, падает, не укладывается в лимит времени или возвращает пустую разметку, приложение теперь переключается на sherpa и указывает это в стенограмме.
- После выноса логики разметки из rebuild() автор добавил тесты, проверил 300 случайных разметок на совпадение старого и нового поведения и довёл общее число тестов до более чем 4 600.
Как сделано
Автор сравнил модели сначала на синтетических фикстурах, затем на двух встречах AMI с эталоном pyannote и, наконец, на собственных записях, где эталона не было. Для личных встреч он использовал результаты облачной ревизии как ориентир, а перед внедрением запускал старый и новый движки параллельно на записях одного дня.
Поскольку приложение подписано, MLX оставили вне бандла: отдельный Python в собственном окружении запускает движок, который возвращает JSON. Перед подключением автор вынес существующую логику порогов, фильтра эха и нумерации голосов из rebuild() и закрепил её тестами. Для нового источника разметки отдельно проверили downstream-фильтры, включая эхо.
Сбой или непригодный ответ Nemotron приводит к запасному запуску sherpa. Условия отказа включают отсутствие интерпретатора или весов, ошибку выполнения, превышение лимита в одну минуту плюс десятую долю длительности записи, а также ответ без отрезков или всего с одним отрезком.
Результаты
На двух встречах AMI DER Nemotron составил около 0,27 против 0,45–0,61 у прежнего прохода, а RTF — 0,003 против 0,35. На 57 собственных встречах обработка 34,8 часа аудио заняла около 3,5 минуты — примерно в сто раз быстрее прежнего процесса. После исправления подсчёта эха доля речи, ошибочно остававшейся в микрофонном канале, составила 17,8% на восьмиминутной записи и 16,1% на двадцатиминутной, близко к показателям sherpa. Изменения вошли в main 28 сентября; флаг автор включил в тот же вечер.
Ограничения
Собственные встречи не имели эталонной разметки, поэтому оценки качества основаны на облачной ревизии, а не на строгом сравнении. Русский язык и очные встречи автор не измерял; результаты AMI относятся к двум английским встречам. На восьми записях модель упёрлась в лимит восьми голосов. Порог в пять секунд для слияния коротких голосовых фрагментов настроен всего по пяти записям и должен быть пересмотрен после недели использования. Окружение движка пока установлено вручную, а автоматическая установка и унификация рецепта чистого окружения ещё не завершены.
Что взять себе
- При смене модели проверяйте не только её качество, но и все последующие фильтры: другой формат или дробление выходных сегментов может сломать прежние правила.
- Синтетические тесты могут давать неверное представление о диаризации; проверяйте систему на живых записях и, по возможности, с независимым эталоном.
- Для надёжного внедрения предусмотрите явные условия отказа и резервный движок, в том числе на случай пустого или неполного ответа.
- Перед переносом логики полезно закрепить её прежнее поведение тестами, а затем проверять граничные случаи, например совпадающие границы речевых фрагментов.
Читать оригинал, если…
Откройте оригинал, если нужны детали интеграции в Charoite_audio, таблицы замеров, тестовые сценарии или код проекта на GitHub.