Локальный ассистент для зумов, часть 8: смена диаризации за вечер
Когда локальный ассистент путает, кто что сказал на созвоне, виновата обычно диаризация, а распознавание речи работает как надо. Конвейер из нарезки, эмбеддингов и кластеризации ломается на перебивах. Сквозная модель разметки говорящих держит перебивы лучше, но знает не больше четырёх голосов. Для больших встреч Zoom умеет писать отдельную дорожку на каждого участника.
Вторник, 19:40: протокол отдал слова аналитика заказчику 🎧
Созвон по доработке 1С шёл два часа. Нас было трое: я, аналитик и заказчик. Обсуждали печатную форму УПД, и аналитик предложил убрать из неё столбец с кодом вида товара. Заказчик возражал, но невнятно, а последние минуты они говорили почти одновременно.
Вечером ассистент прислал протокол. В разделе решений стояло: «Заказчик согласен убрать столбец». Транскрипт был целым, ни одна реплика не потерялась. Ошибся только ярлык над репликой: диаризация, то есть разметка «кто говорит», отдала слова аналитика заказчику.
Первые полчаса я потратил не туда и сравнивал версии Whisper. Слова в транскрипте были верными, а виноват был другой этап цепочки.
Почему конвейер путает голоса, когда собеседники перебивают друг друга
У меня стоял конвейер класса pyannote, и работает он в три шага. Сначала находит участки речи. Потом для каждого куска считает эмбеддинг, числовой слепок голоса. В конце кластеризация раскладывает слепки по группам, и каждая группа становится «говорящим».
Спорный момент на записи выглядел так. Аналитик договаривает фразу, заказчик вклинивается, и несколько секунд звучат оба голоса. Кусок с двумя голосами даёт смешанный слепок, но кластеризация обязана отнести его к одной группе. Поэтому реплика уходит ближайшей группе, а не правильной.
Первым делом я покрутил порог кластеризации. Он лечит одно и ломает другое: строже порог, и один человек распадается на двух; мягче, и двое сливаются в одного. На других записях конвейер склеивал двух участников, потому что их голоса близки по тембру и идут через похожие гарнитуры. Число говорящих конвейер определяет сам, а ошибка в этом числе тянет за собой все остальные ярлыки.
Сколько стоит одна неверная реплика в протоколе 💸
Ошибку я поймал случайно, потому что помнил разговор. Иначе на приёмке заказчик увидел бы форму без нужного столбца и сказал бы: «Я этого не согласовывал». А протокол подтверждал бы обратное.
Допустим, переделка формы занимает два часа. По ставке сопровождения 1С, 3800 руб/час, это 7600 руб и спор о том, кто платит. Есть и скрытая цена. Протокол, ярлыкам в котором нельзя верить, приходится сверять с записью. Если сверять после каждой встречи, выгода от ассистента исчезает.
Три способа узнать, кто говорит, и где каждый ломается 📊
Вариантов оказалось три. Я прогнал их на одной записи с перебивами, поэтому колонка «где ломается» взята из практики, а не из документации.
| Подход | Как определяет говорящего | Где ломается | Сколько голосов |
|---|---|---|---|
| Конвейер класса pyannote | Нарезка речи, слепок голоса, кластеризация слепков | Перебивы, близкие по тембру голоса, ошибка в оценке числа участников | Число можно задать заранее или доверить кластеризации |
| Сквозная модель типа Sortformer от NVIDIA | Одна нейросеть размечает активность каждого говорящего по времени, кластеризации нет | Больше четырёх участников; удобнее с видеокартой | До 4 |
| Дорожка на участника в Zoom | Каждый пишется в свой файл, диаризация не нужна | Один микрофон на двоих в переговорной; опцию нужно включить до встречи | Сколько участников, столько файлов |
Подходы ломаются в разных местах, и это удобно: один закрывает слабость другого. Сквозная модель не гадает, на сколько групп делить слепки. Она размечает время целиком, и перебивы у неё выходят аккуратнее. Плата за это жёсткий лимит голосов и то, что без видеокарты она работает медленнее, чем хотелось бы.
У дорожек Zoom свой порог входа. Запись должна быть локальной, а опцию отдельного аудиофайла на каждого участника включают до начала встречи: задним числом её не применить.
Как я менял диаризацию за один вечер: пять шагов 🛠
Вечера хватило, потому что стадия диаризации стояла за одним интерфейсом. Если у вас устроено так же, порядок будет тот же.
- ✓Записал эталон. Взял кусок созвона с перебивами и вручную разметил, кто и когда говорит. Без эталона фраза «стало лучше» остаётся ощущением.
- ✓Отделил стадию. Диаризация отдаёт список интервалов: начало, конец, метка говорящего. Whisper отдаёт слова с таймкодами. Слово получает метку интервала, с которым пересекается сильнее всего. Этот код при замене модели не трогают.
- ✓Привёл звук к 16 кГц, моно. Модели этого класса ждут именно такой WAV, и ffmpeg в моей цепочке уже делал это.
- ✓Подключил сквозную модель вместо шагов «слепок и кластеризация». Она отдаёт пересекающиеся интервалы, когда говорят двое сразу, и слово в такой точке я оставляю тому, у кого перекрытие больше.
- ✓Прогнал эталон и слушал только места с перебивами. Реплика про столбец встала на аналитика. Потом прогнал остальные записи и выписал, где ломается: из этого списка выросла следующая секция.
Считал я не проценты точности разметки, а реплики с неверным ярлыком внутри решений и поручений. Ошибка в разговоре о погоде ничего не стоит. Ошибка в строке «согласовано» стоит часов работы разработчика.
Что после замены осталось сломанным
Первое: потолок в четыре голоса. На планёрке из шести человек ярлыки начинают перемешиваться, и протокол снова нельзя принимать на веру без сверки.
Второе: метки «Speaker 0», «Speaker 1» не имена. Имена я подставляю по списку участников созвона, а в спорных случаях ставлю руками. Это несколько минут после встречи, но без них протокол выглядит как переписка с анонимами.
Третье: переговорка с одним микрофоном. Там бесполезны отдельные дорожки, потому что в файле звучат оба голоса. Конвейер с кластеризацией, наоборот, оказывается на своём месте. Правило, к которому я пришёл:
- ✓до четырёх участников с отдельными гарнитурами разметку делает сквозная модель;
- ✓больше четырёх участников, по одному за микрофоном: включаю запись отдельных дорожек в Zoom;
- ✓переговорка с общим микрофоном: конвейер с числом говорящих, заданным заранее.
Где это окупается: созвоны по 1С и данные, которые остаются у вас
Больше всего пользы там, где решения принимают голосом, а потом по ним платят. Созвон по внедрению 1С устроен именно так: какие отчёты нужны, кто видит цены, какие остатки переносить. Ассистент вытаскивает из транскрипта решения и поручения, каждое с ярлыком говорящего и таймкодом, и по таймкоду можно открыть место записи. Аналитик перестаёт печатать протокол вручную, а спор «я этого не говорил» решается прослушиванием фрагмента.
То же со встречами по доработке 1С и обновлению конфигурации: на них решают, какие доработки переносить на новый релиз, а какие выбросить. Спор «мы этого не просили» дешевле закрыть цитатой из транскрипта, чем двумя часами переделки.
Второй довод касается данных. В записи созвона с клиентом звучат ФИО, телефоны, иногда реквизиты договоров, а это персональные данные по 152-ФЗ. Пока модель, запись и транскрипт лежат на вашем сервере, вопроса «куда это ушло» не возникает. Участников предупреждайте о записи в начале встречи.
Собрать такую связку можно на одной машине с видеокартой. Установку драйверов, моделей и автозапуск, если руки не доходят, делает наш сисадмин: 3800 руб/час, работа оплачивается по часам. Тот же принцип, модель и база знаний на вашей стороне, работает для чат-бота на сайте: он отвечает по вашим документам, а переписки клиентов не уходят на чужие серверы. Стоимость такого бота считаем после постановки задачи: без неё любая цифра будет гаданием.
❓ Частые вопросы
Что такое диаризация и чем она отличается от распознавания речи?
Диаризация отвечает на вопрос «кто говорит»: она делит запись на интервалы и присваивает каждому метку участника. Распознавание речи отвечает на вопрос «что сказано» и выдаёт текст. Ассистенту нужны обе стадии, иначе в протоколе будет сплошной текст без авторов реплик, а решения не к кому привязать.
Почему диаризация путает говорящих, когда участники перебивают друг друга?
Когда двое говорят одновременно, в аудио смешиваются два голоса, и слепок такого куска не похож ни на одного из участников. Конвейер с кластеризацией обязан выбрать одну группу и выбирает ближайшую. Сквозные модели размечают время целиком и умеют отдавать пересекающиеся интервалы, поэтому на перебивах ошибаются реже.
Можно ли обойтись без диаризации при записи созвонов в Zoom?
Да, если запись локальная. В настройках локальной записи Zoom есть опция сохранять отдельный аудиофайл для каждого участника, и включить её нужно до начала встречи. Тогда автор реплики известен по файлу, а разметка не нужна. Не работает, когда двое сидят перед одним микрофоном: в файле окажутся оба голоса.
Сколько участников поддерживает сквозная модель разметки говорящих?
Модели типа Sortformer от NVIDIA рассчитаны на четырёх говорящих. На совещании из шести человек ярлыки начнут перемешиваться. Для таких встреч подходят отдельные дорожки Zoom или конвейер с кластеризацией, где число участников можно задать заранее. Точный лимит смотрите в карточке конкретной версии модели: у версий он может отличаться.
Сколько стоит настроить локального ассистента для созвонов?
Серверную часть под локальную транскрипцию и разметку говорящих настраивает сисадмин, час работы стоит 3800 руб. Итог зависит от числа часов: на него влияют железо, число участников встреч и требования к протоколу. Точную сумму без задачи назвать нельзя, поэтому сначала уточняем исходные данные.
Или позвоните: +7 906 045-28-27 — в рабочее время с 9:00 до 19:00
Остались вопросы? Нужна помощь?
Менеджеры компании с радостью ответят на ваши вопросы, произведут расчет стоимости услуг и подготовят индивидуальное коммерческое предложение.
Бесплатная консультация

