Чароит записывает мои созвоны, а после кнопки Стоп собирает стенограмму, протокол и граф встречи. Самое капризное место во всей цепочке — понять, кто что сказал. Это называется диаризацией. Ошиблась она, и решение в протоколе повисает на другом человеке.
23 сентября NVIDIA выложила нейросеть, которая только этим и занимается. Через пять дней она уже работала у меня. Сейчас через неё идут оба канала звонка, очные встречи и живая лента.
Что за нейросеть
Nemotron 3 Diarization. Веса открытые, на Hugging Face. Сто миллионов параметров, по нынешним меркам кроха: модель, которая пишет мне протоколы, больше в триста с лишним раз.
Диаризацию обычно делают так. Речь режут на куски, с каждого снимают отпечаток голоса, похожие складывают в кучки — сколько кучек, столько людей. Так работал и мой прежний движок. Кучки то слипаются, то дробятся. А когда двое говорят разом, отпечаток у куска выходит смешанный, и кто-то из двоих пропадает.
Nemotron кучек не собирает. Каждую сотую долю секунды она для каждого из восьми голосов отдельно решает, звучит он или нет. Перебили друг друга? Звучат оба, для неё это обычный кадр. По записи она проходит один раз, отсюда и скорость.
Для меня важны ещё две вещи. Одни и те же веса работают и по готовой записи, и потоком, пока звонок ещё идёт. И есть версия под MLX, фреймворк Apple для нейросетей, так что на маке с M-чипом она считает без всякой видеокарты NVIDIA.
Русского в обучении нет. Английский, китайский, четыре индийских языка. Но различает она голоса, а не слова.
Почему взял
До неё голоса размечал sherpa-onnx, тот самый способ с кучками, а мой второй проход поверх склеивал лишние метки. В третьей части я писал, что менять его не на что. Жить было можно.
Только медленно: канал собеседников двадцатиминутного звонка размечался минут семь. И неточно. После каждой встречи стенограмму читает ревизия — облачная модель, которая по смыслу реплик проверяет, кто что говорил. Она то и дело ловила враньё в метках. Трое разных людей под меткой Собеседник 2. Мужчина и женщина в одной реплике. Десять меток на встречу, где нас было четверо.
На бумаге Nemotron лечил и то, и другое.
Как проверял
Подробно это было в восьмой части, тут коротко. Синтетикой её не проверишь: голоса синтезатора macOS, которые говорят по очереди, она сливает в один. На английских совещаниях, размеченных людьми (открытый набор AMI), ошибок у неё вышло почти вдвое меньше, чем у моего прохода, а считала она в сто раз быстрее.
Дальше мои встречи. Из-за забытой настройки на диске скопилось 57 записей. Эталона у них нет, судьёй стала та же ревизия. Тех троих под одной меткой Nemotron развёл на три голоса. Мужчину и женщину тоже. А на встрече с десятью метками нашёл в канале собеседников троих: четвёртым был я, в микрофоне.
Собирался ещё неделю гонять её втихую, рядом со старым движком. Потом понял, что 57 записей на диске и есть такая проверка, только уже готовая. Включил в тот же вечер, со страховкой: если движок упал, не ответил вовремя или вернул пустоту, встречу размечает sherpa, а в шапке стенограммы появляется об этом строка.
Неделя
Страховка не сработала ни разу.
Переводил по частям: в понедельник голоса собеседников в разборе после звонка, в четверг живую ленту, в пятницу мой микрофон, в субботу очные встречи.
С микрофоном я не спешил. Там на звонке обычно один голос, мой, — что размечать? Потом посмотрел, сколько sherpa с ним возится. Часовой звонок в четверг разбирался полчаса. Я прогнал его микрофон отдельно: у sherpa восемнадцать минут, у Nemotron восемь секунд.
Теперь звонок на полчаса разбирается целиком минут за восемь-десять. Стенограмма, протокол, граф.
Живая лента — это реплики с метками, которые бегут по экрану, пока идёт звонок. По ним строятся подсказки. Раньше метки ставил отдельный трекер по отпечаткам голоса, и людей он путал заметно чаще. Теперь там тот же Nemotron, только потоком. Метки почти не перескакивают с человека на человека, и памяти поток берёт меньше гигабайта.
Очные встречи — когда все сидят вокруг одного микрофона. Тут сравнил на двух записях: разметка почти та же, что у sherpa, а считает Nemotron раз в тридцать быстрее.
Что получил
Голоса были самым долгим шагом разбора. Стали секундами.
Люди в стенограмме реже слипаются и реже множатся. Лента во время звонка меньше путает, кто говорит.
И разметка целиком на ноутбуке. Сеть движку не нужна, звук никуда не уходит.
Что не так
Потолок — восемь голосов. На восьми встречах из тех 57 она в него упёрлась.
Цифры ошибок на русском у меня нет. Размеченных людьми русских записей нет тоже: сверялся с ревизией и со старым движком.
С живой лентой подсказки приходят на пару секунд позже. Поток ли тормозит — пока не знаю.
Nemotron включается строкой в конфиге, по умолчанию стоит sherpa. Окружение и веса Чароит ставит сам, одной командой. Веса в репозиторий не кладу, у них своя лицензия. Всё это вошло в релиз 0.93.
Код и релизы: github.com/charoiteai/Charoite_audio, Apache 2.0. Девлог по-английски: charoiteai.github.io/Charoite_audio. Первая часть — про устройство и запись, вторая — про граф встреч как память, третья — про диаризацию и три ложных диагноза, четвёртая — про ревизию после кнопки Стоп, пятая — про облако и что уходит наружу, шестая — про полчаса тишины, которых не было в протоколе, седьмая — про семь пакетов в плане и один в коде, восьмая — про модель, ради которой я поменял диаризацию за один вечер.
Автор: Charoiteai


