Как научить Whisper различать голоса - разбираем проект whisper-diarization
Представьте, что вы записываете интервью или важный созвон в Zoom на пять человек. У вас есть аудиофайл, и вы прогоняете его через OpenAI Whisper. Результат получается отличным: текст точный, знаки препинания на месте. Но есть одна проблема — это «простыня» текста, где непонятно, кто именно произнес ту или иную фразу. Чтобы превратить это в читаемый протокол, придется потратить часы на ручную разметку спикеров.
Проект whisper-diarization решает именно эту задачу. Автор собрал в один пайплайн несколько сильных моделей, чтобы на выходе вы получали не просто текст, а полноценный диалог с именами (или номерами) участников.
Почему просто Whisper недостаточно
Сам по себе Whisper — это модель для распознавания речи (ASR). Он умеет переводить звук в текст, но не обучен разделять дорожку на разных людей. В терминологии обработки звука это называется диаризацией.
Обычно разработчики пытаются прикрутить к Whisper какую-нибудь внешнюю библиотеку вроде Pyannote. Это работает, но часто возникают проблемы с синхронизацией: Whisper выдает одни таймстампы, модель диаризации — другие, и в итоге реплики «съезжают». В этом репозитории предложен более комплексный подход, который минимизирует такие сдвиги.
Что происходит под капотом
Пайплайн в проекте довольно тяжеловесный, но логичный. Весь процесс разбит на несколько этапов.
Сначала из аудио извлекается вокал. Это нужно, чтобы фоновый шум или музыка не сбивали модель с толку при определении характеристик голоса. Для этого используется Demucs от Facebook.
Затем Whisper генерирует транскрипцию. Чтобы таймстампы были максимально точными, используется ctc-forced-aligner. Это критически важный шаг: он принудительно выравнивает текст по звуковой волне, чтобы каждое слово стояло именно там, где оно было произнесено.
После этого в дело вступают модели от Nvidia NeMo. MarbleNet определяет наличие голоса и сегментирует аудио, отсекая тишину. TitaNet извлекает векторы признаков голоса (эмбеддинги), по которым система понимает, что «Спикер 1» в начале записи и «Спикер 1» в конце — это один и тот же человек.
В финале результаты объединяются и корректируются с помощью моделей пунктуации, чтобы сгладить мелкие неточности в границах предложений.
Как это запустить
Для работы потребуется Python 3.10 или выше. Также в системе должны быть установлены ffmpeg и cython. Если вы работаете на Ubuntu, подготовка выглядит примерно так:
sudo apt update && sudo apt install ffmpeg cython3
pip install -r requirements.txt
Запуск максимально простой:
python diarize.py -a audio_file.mp3
Если у вас мощная видеокарта (хотя бы 10 ГБ видеопамяти), можно попробовать экспериментальный скрипт diarize_parallel.py. Он запускает Whisper и NeMo параллельно, что ощутимо экономит время на длинных записях.
Настройки и возможности
В репозитории предусмотрено несколько полезных флагов для командной строки:
--whisper-model: можно выбрать размер модели (по умолчаниюmedium.en). Для русского языка лучше ставитьlarge-v2илиlarge-v3.--suppress_numerals: интересная фишка, которая заставляет модель писать числа словами («двадцать два» вместо «22»). Это сильно помогает при выравнивании текста по времени.--language: если Whisper ошибается с определением языка, его можно задать жестко.--batch-size: если видеокарта выдает ошибку Out of Memory, стоит уменьшить это значение.
Где это пригодится
Я вижу несколько сценариев, где этот инструмент экономит массу времени. Во-первых, это создание субтитров для интервью или подкастов, где важно подписывать говорящего. Во-вторых, автоматизация протоколов встреч в бизнесе. В-третьих, подготовка датасетов для обучения других моделей, где нужны чистые данные с разбивкой по ролям.
Нюансы и ограничения
Проект не идеален, о чем автор честно предупреждает в README. Главная проблема — наложение голосов. Если два человека говорят одновременно, система может ошибиться или приписать фразу только одному из них. Решить это можно было бы предварительным разделением дорожек, но это потребует еще больше вычислительных ресурсов.
Также стоит учитывать, что пайплайн объединяет несколько тяжелых нейросетей. На слабом железе или только на процессоре обработка часовой записи может затянуться.
В целом, это один из самых продуманных Open Source инструментов для диаризации на базе Whisper. Автор не просто склеил две библиотеки, а добавил этапы очистки звука и принудительного выравнивания, что дает на выходе гораздо более чистый результат, чем стандартные решения. Если вам нужно что-то сложнее простого распознавания текста, этот репозиторий точно стоит добавить в закладки.
