WhisperX подробно – диаризация и пословные таймкоды

Автор: Николай СапуновОбновлено: август 202628 мин чтения
Содержание статьи +

Коротко

WhisperX – это бесплатный open-source инструмент, который берёт речевую модель OpenAI Whisper и закрывает две её главные дыры для реальных продуктов: он привязывает каждое слово к точному моменту в аудио и помечает, кто его произнёс. Делает он это, добавляя к Whisper три стадии – детектор речевой активности, который находит, где именно есть речь; вторую небольшую модель, которая «выравнивает» текст по звуку (forced alignment), так что границы слов получаются куда точнее дрейфующих таймкодов самого Whisper; и модель диаризации, которая разделяет разговор по голосам. Та же перестройка ещё и заставляет WhisperX обрабатывать готовую запись во много раз быстрее обычного Whisper, потому что аудио можно расшифровывать параллельными батчами, а не одним медленным скользящим окном. В этой статье разбираем, что делает каждая стадия, где она ломается, чем WhisperX отличается от облачного API вроде Deepgram или AssemblyAI и когда видеокоманде стоит за него браться.

Зачем это нужно

Если вашему продукту нужно знать, когда было сказано каждое слово или кто его сказал, обычный Whisper тихо вас подведёт, и WhisperX – самое распространённое open-source решение. Субтитры, подсвечивающие каждое слово по мере чтения (эффект «караоке» в коротких роликах), требуют пословного тайминга. Саммари созвона, где написано «дедлайн взяла на себя Мария, а не Том», требует меток говорящих. Телемедицинская запись, отделяющая голос врача от голоса пациента, требует и того, и другого. Поиск по видеоархиву, который перематывает вас на точную секунду, где прозвучала фраза, требует точных пословных таймкодов, а не грубых догадок Whisper, ошибающихся на несколько секунд, – и такие транскрипты с пословным таймингом служат основой индекса поиска из урока про video RAG над архивом. Эта статья – для продакт-менеджера, основателя или техлида, решающего, self-host'ить WhisperX или купить облачный API расшифровки. К концу вы поймёте три стадии, которые добавляет WhisperX, конкретные способы, которыми каждая ломается, компромиссы по стоимости и эксплуатации против платного API и тест из четырёх вопросов для выбора пути.

Где находится WhisperX – и что было до него

Этот урок продолжает предыдущий. В уроке про streaming ASR в проде мы сравнили три способа превращать живое аудио в текст, пока человек ещё говорит. WhisperX решает другую, более узкую задачу: он расшифровывает готовую запись – файл, который у вас уже есть, – и делает это с двумя качествами, которые обычный Whisper сам по себе не даёт. Первое – точный таймкод для каждого слова. Второе – метка говорящего для каждого слова. WhisperX – пакетный (batch) инструмент, а не потоковый, и один этот факт определяет всё, что касается его места. (Для случая живых субтитров, когда транскрипт производится и раздаётся зрителям в реальном времени, смотрите вместо этого урок про раздачу субтитров на стороне SFU.)

Начнём со слова расшифровка (transcription). Это превращение записанной речи в текст сказанного. Автоматическое распознавание речи (automatic speech recognition, ASR) – технология, которая это делает. OpenAI Whisper, выпущенный в 2022 году под разрешительной лицензией MIT, – это open-source ASR-модель, к которой большинство команд тянется первой: она бесплатна на своих серверах, поддерживает 99 языков и хорошо держится против акцентов и фонового шума (Radford et al., 2022). Но Whisper создан отвечать на один вопрос – какие слова были сказаны? – а на два других отвечает плохо.

Первый вопрос, на который он отвечает плохо: когда именно было сказано каждое слово? Whisper выдаёт таймкод для каждого куска текста, но эти таймкоды, как известно, дрейфуют, иногда на несколько секунд, а таймкод для каждого отдельного слова Whisper не даёт вовсе (Bain et al., 2023). Второй вопрос, на который он не может ответить совсем: кто это сказал? Whisper расшифровывает разговор двух людей в одну сплошную стену текста, не подозревая, что говорили двое.

WhisperX, опубликованный Максом Бейном и коллегами из оксфордской Visual Geometry Group в 2023 году, существует, чтобы ответить на все три вопроса (Bain et al., 2023). Он оставляет Whisper движком, который решает, что было сказано, и добавляет вокруг него механику, которая решает, когда и кто.

Три стадии, которые добавляет WhisperX

Понятнее всего представлять WhisperX как Whisper плюс три навесные стадии, выполняемые по порядку. Вообразите конвейер. Сырое аудио заходит слева, проходит через четыре станции, и справа выходит полностью размеченный по времени транскрипт с метками говорящих.

Первая станция – детектор речевой активности (voice activity detector, VAD): маленькая дешёвая модель, единственная задача которой – отметить, какие отрезки аудио содержат речь, а какие – тишину, музыку или шум. Вторая станция – сам Whisper, расшифровывающий речь в слова. Третья станция – forced alignment (принудительное выравнивание): отдельная модель, привязывающая каждое слово к его настоящему месту в звуке. Четвёртая станция – диаризация: модель, которая выясняет, сколько различных голосов присутствует и какие отрезки аудио принадлежат каждому. Пройдём по каждой, потому что каждая добавляет реальную возможность и каждая ломается своим конкретным образом, который нужно учесть заранее.

Рисунок 1. WhisperX – это Whisper плюс три стадии: детектор речевой активности находит речь, forced alignment чинит тайминг, а диаризация назначает говорящих.

Стадия один – детекция речевой активности и трюк «Cut & Merge»

Вспомним один жёсткий факт о Whisper из урока про стриминг: модель читает аудио фиксированными блоками по 30 секунд, потому что на такой длине её обучали. Чтобы расшифровать часовой подкаст, обычный Whisper скользит 30-секундным окном по записи. Проблема в том, что окно должно куда-то встать, и оно часто встаёт посреди слова. Слово, разрезанное пополам на границе окна, расшифровывается с ошибкой, и хуже того – Whisper использует свои же шаткие таймкоды, чтобы решить, куда сдвинуть окно дальше, так что ошибка в одном окне толкает следующее окно не туда, и промахи накапливаются. Технический термин для этого накопления – дрейф (drift) (Bain et al., 2023).

WhisperX убирает гадание, заглядывая в аудио до Whisper. Он сначала запускает детектор речевой активности. VAD строит карту того, где именно речь начинается и заканчивается по всей записи. Теперь WhisperX может резать аудио в моменты тишины, никогда не посреди слова.

Но есть тонкость, и она – самая умная часть конструкции. Whisper работает лучше всего, когда у него около 30 секунд контекста, поэтому скармливать ему множество крошечных односекундных обрывков речи означало бы растратить его способности и навредить точности. Поэтому WhisperX применяет то, что в статье называется Cut & Merge (разрезать и склеить). Он режет любой участок речи длиннее 30 секунд в самой тихой точке внутри него – в моменте наименьшей вокальной активности, это самое безопасное место для разреза. Затем он склеивает короткие соседние участки речи вместе, пока каждый объединённый кусок не приблизится к 30 секундам, не превышая их (Bain et al., 2023). В итоге получается набор кусков, каждый около 30 секунд и каждый начинается и заканчивается тишиной.

Это даёт сразу две вещи. Поскольку ни один кусок не зависит от таймкода другого куска, их больше не обязательно обрабатывать последовательно – Whisper может расшифровывать их параллельно, батчем, что намного быстрее. А поскольку каждый кусок отрезан по тишине и подогнан под «сладкое пятно» Whisper, расшифровка ещё и точнее – с меньшим дрейфом и меньшим числом галлюцинированных слов (Bain et al., 2023). В статье сообщается, что батчевый подход дал примерно двенадцатикратное ускорение по сравнению с последовательным скользящим окном Whisper (Bain et al., 2023). Текущая open-source версия идёт дальше – её README сообщает о скорости до 70 раз быстрее реального времени на большой модели, – дополнительно подставив более быстрый движок инференса faster-whisper, тот самый рантайм на CTranslate2, с которым мы встречались в уроке про стриминг (WhisperX GitHub, 2026).

Замечание про две цифры скорости

Вы встретите два разных утверждения о скорости WhisperX, и оба верны. Статья измерила 11,8× от собственной скорости Whisper на GPU NVIDIA A40 – близко к «двенадцатикратному», которое выносят в заголовок авторы, – и, что важно, без потери качества расшифровки; тот же VAD Cut & Merge, что включает батчинг, ещё и снизил WER и урезал галлюцинации (Bain et al., 2023, Таблицы 2 и 3). «70× реального времени» на текущей странице GitHub – более поздняя инженерная цифра, объединяющая этот батчинг с рантаймом faster-whisper, измеренная против другого базиса (WhisperX GitHub, 2026). Ни одна не ошибочна; они мерят разное. Честный вывод: WhisperX превращает запись, которую обычный Whisper расшифровывает медленно, в ту, что завершается во много раз быстрее, – а конкретный множитель зависит от вашего GPU, размера модели и выбранного батча.

Стадия два – forced alignment: привязка каждого слова к звуку

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

Идею легче всего понять по аналогии. Представьте, что у вас есть текст песни и запись, и вы хотите отметить точный миг, когда поётся каждое слово, – так караоке-машина подсвечивает строки в такт. Вы не угадываете слова; вы уже знаете их из текста. Вы решаете только тайминг: сопоставляете известный текст с известным звуком. Эта задача сопоставления и есть forced alignment, и она намного проще и точнее расшифровки, потому что ответ на «что было сказано» уже зафиксирован.

WhisperX делает это моделью из семейства wav2vec2, обученной распознавать отдельные звуки речи – фонемы – в аудио. Для английского по умолчанию используется стандартная модель wav2vec2, обученная на 960 часах речи из аудиокниг, – статья нашла, что именно она работает наиболее стабильно (Bain et al., 2023). Модель сканирует аудио и для каждого крошечного отрезка оценивает, насколько вероятна каждая фонема. Затем WhisperX прогоняет по этой карте оценок динамическую трансформацию времени (dynamic time warping) – алгоритм, находящий единственный лучший временной путь, сопоставляющий последовательность фонем из транскрипта Whisper со звуком, – и берёт начало первой фонемы слова и конец последней как таймкоды слова (Bain et al., 2023).

Выигрыш проявляется измеримо. Статья оценивает тайминг тестом на сегментацию слов: предсказанное слово засчитывается, только если его временное окно перекрывает размеченное человеком окно в пределах допуска 200 мс («коллар») и текст слова совпадает точно. На этом тесте на телефонной речи (корпус Switchboard) WhisperX даёт 93,2% точности (precision) и 65,4% полноты (recall) против 85,4% и 62,8% при использовании собственных таймкодов Whisper; на более сложном аудио совещаний (корпус AMI) – 84,1% и 60,3% против 78,9% и 52,1% у Whisper (Bain et al., 2023, Таблица 2). Проще говоря: один Whisper пропускает или смещает куда больше границ слов и даже уступает гораздо меньшей модели wav2vec2 по точности на AMI – поэтому WhisperX запускает отдельную стадию выравнивания, а не доверяет таймкодам Whisper. Для караоке-субтитров, подсветки клипов или перемотки на точную секунду найденной фразы этот разрыв – и есть весь продукт.

Рисунок 2. Forced alignment сопоставляет известные слова с известными звуками, привязывая каждое слово от грубой посегментной догадки к настоящему месту – 93,2% точности на телефонной речи при колларе 200 мс против 85,4% у одного Whisper.

Подвох forced alignment, на который вы наткнётесь

У forced alignment есть один режим отказа, который нужно заложить в дизайн. Модель wav2vec2 знает только звуки обычных произносимых слов. Когда Whisper расшифровывает что-то, что не является нормальным словарным словом – число цифрами вроде «2014», сумму вроде «£13.60», символ или слово на языке, который выравниватель не покрывает, – у выравнивателя нет фонем для сопоставления, и он не может разместить этот токен. WhisperX тогда заимствует для этого слова таймкод ближайшей соседней фонемы в транскрипте (Bain et al., 2023), так что транскрипт, в остальном плотно выровненный, будет содержать несколько слов, привязанных лишь приблизительно. Если ваш продукт зависит от идеального пословного тайминга – скажем, юридический транскрипт с таймкодами на цифрах, – тестируйте именно на аудио, полном чисел и имён, потому что именно там выравнивание тихо деградирует.

Вторая, смежная осторожность: модель выравнивания wav2vec2 менее устойчива к шуму, чем сам Whisper. На чистом студийном аудио таймкоды отличные; на шумном телефонном звонке они деградируют быстрее, чем расшифровка (Towards AI, 2026). Чистое аудио на входе – чистый тайминг на выходе, поэтому команды, запускающие WhisperX на записях звонков, часто сначала чистят аудио методами из урока про подавление шума в реальном времени.

Стадия три – диаризация: разметка того, кто говорил

Третья стадия отвечает на вопрос кто это сказал? Слово – диаризация: разделение аудиозаписи на сегменты по говорящему и пометка каждого сегмента анонимным ярлыком вроде «Говорящий A» и «Говорящий B». Она не присваивает голосам имена; она лишь разделяет их. Привязку реальных имён делает позже ваше приложение – обычно спрашивая пользователя или сопоставляя с известными голосами.

Эту работу WhisperX поручает отдельной специализированной библиотеке pyannote.audio – open-source стандарту диаризации говорящих (WhisperX GitHub, 2026). Pyannote слушает всю запись, решает, сколько различных голосов присутствует, и строит таймлайн того, какой голос активен когда. Затем WhisperX делает финальное, простое соединение: для каждого слова, которое он уже разметил по времени на стадии два, он смотрит, в сегмент какого говорящего попадает время этого слова, и помечает слово этим говорящим (WhisperX GitHub, 2026). Поскольку слова уже точно размечены по времени, это сопоставление по перекрытию надёжно – что наглядно показывает, почему стадии идут именно в этом порядке. Точный тайминг – это то, что делает возможным точное назначение говорящего.

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

Две вещи, которые подставят вас на диаризации

Первое – трение. Модель диаризации pyannote закрытая (gated): чтобы её скачать, нужно завести бесплатный аккаунт на Hugging Face, принять условия модели и передать WhisperX токен доступа вместе с флагом --diarize (WhisperX GitHub, 2026). Это одноразовая настройка, но она удивляет команды, ожидавшие, что pip install – это и есть конец, и она – повторяющаяся жалоба в трекере проекта (WhisperX GitHub issues, 2026). Заложите десять минут на это и задокументируйте обращение с токеном, потому что токен, истёкший в проде, тихо выключит метки говорящих.

Второе – ограничения. Диаризация – самая медленная и прожорливая по памяти стадия конвейера, и она же наименее надёжная. Она спотыкается, когда двое говорят одновременно – перекрывающаяся речь по-настоящему трудна, – и может слить два похожих голоса в один или разбить один голос на два. Авторы WhisperX прямо говорят, что диаризация «далека от идеала» (WhisperX GitHub, 2026). Планируйте, чтобы человек мог поправить метки говорящих в любом продукте, где ошибка в них важна, – например, в медицинской или юридической записи.

Весь конвейер одним взглядом

Четыре стадии работают как цепочка, и каждая кормит следующую. Таблица ниже – та ментальная модель, которую стоит держать в голове.

СтадияЧто делаетМодельЧто вы получаетеГде ломается
1. Детекция речевой активностиНаходит речь; режет и склеивает в куски ~30 с по тишинеpyannote VADБыстрее, точнее, батчируемый входОчень тихую речь можно пропустить
2. РасшифровкаПревращает речь в слова, параллельными батчамиWhisper (через faster-whisper)Текст сказанногоРедкие слова, сильные акценты, шум
3. Forced alignmentПривязывает каждое слово к его началу/концуwav2vec2Пословные таймкоды в пределах коллара 200 мсЧисла, символы, неподдерживаемые языки
4. ДиаризацияДелит и помечает аудио по говорящемуpyannote.audioМетка «Говорящий A / B» на каждом словеПерекрытие и похожие голоса; нужен HF-токен

Источники: Bain et al. (2023); WhisperX GitHub (2026).

WhisperX против облачного API

Реальное решение, перед которым стоит большинство команд, – не «WhisperX или обычный Whisper», а «self-host'ить WhisperX или платить облачному API вроде Deepgram или AssemblyAI, который даёт пословные таймкоды и диаризацию встроенной возможностью». Урок про стриминг подробно разобрал эти API; вот сравнение, важное именно для задачи «таймкоды и говорящие».

КритерийWhisperX (self-host)Облачный API (Deepgram / AssemblyAI)
Модель стоимостиТолько время GPU; софт бесплатенПлата за час (~$0,15–$0,46/ч стриминг; batch-тарифы разнятся)
Пословные таймкодыForced alignment (93,2% точности на телефонной речи)Встроены, настроены вендором
Диаризацияpyannote, бесплатно, нужен HF-токенВстроена, один флаг
Где данныеОстаются на ваших серверахУходят в облако вендора
СтримингНет – только batchДа
Усилия на настройкуGPU, CUDA, модели, токен, тюнингAPI-ключ
Языки99 расшифровка; ~30 с выравниванием «из коробки»Зависит от вендора
Когда выбиратьТребования on-prem; высокий ровный объём; полный контрольБыстро запуститься; рваный объём; нужен стриминг

Источники: Bain et al. (2023); WhisperX GitHub (2026); цены Deepgram и AssemblyAI – как в уроке про стриминг.

Лицензия – часть этого решения. WhisperX выпущен под разрешительной лицензией BSD-2-Clause, Whisper – под MIT, а код pyannote – под MIT; все они позволяют поставлять их внутри коммерческого продукта бесплатно (WhisperX GitHub, 2026). Единственный нюанс – закрытые веса модели pyannote, которые бесплатны, но требуют принять их условия. Так что «бесплатно» – правда, со звёздочкой: бесплатный софт, бесплатные модели, но вы платите за GPU и за инженера, который всё это держит.

Разбор на цифрах – во что реально обходится self-host WhisperX

Цифры в абстракции бюджет не решают, поэтому прогоним реальные. Предположим, вам нужно обработать 2 000 часов записанного аудио в месяц – сеть подкастов, библиотека курсов или бэклог записанных консультаций – и вы хотите пословные таймкоды и метки говорящих на всём этом. Это batch-работа: файлы уже существуют, поэтому задержка не важна, важны только пропускная способность и стоимость.

WhisperX на большой модели идёт до 70 раз быстрее реального времени на способном GPU, но возьмём осторожную, реалистичную цифру в 30 раз быстрее реального времени с учётом диаризации и выравнивания, поскольку эти стадии медленнее расшифровки (WhisperX GitHub, 2026). При 30× реального времени один GPU обрабатывает 30 часов аудио за час настенного времени:

2 000 часов аудио ÷ 30 часов на GPU-час = 66,7 GPU-часов в месяц.

Арендуйте подходящий облачный GPU примерно за $1,00 в час, и сырой счёт за вычисления:

66,7 GPU-часов × $1,00/час = около $67 в месяц – за вычисления.

Это поразительно дёшево, и поэтому self-host WhisperX привлекателен для ровного batch-объёма. Но цифра вычислений – не вся стоимость. Добавьте одноразовую инженерную работу на построение конвейера, текущее сопровождение, GPU, который вы можете держать частично простаивающим, чтобы гасить пики, и человеческое время на выборочную проверку диаризации. Для сравнения, облачный batch-API по, скажем, $0,20 за час выставил бы 2 000 × $0,20 = $400 в месяц – вшестеро дороже вычислений WhisperX, но без всякого конвейера, который надо строить и держать.

Урок зеркален уроку про стриминг. Для batch-работы при ровном объёме почасовая стоимость вычислений WhisperX намного ниже облачного API, и точка безубыточности склоняется к self-host'у заметно раньше, чем в стриминге, – потому что вы не платите за простаивающие GPU, ждущие живых звонков, а гоните очередь на полную. Облачный API всё ещё выигрывает, когда объём низкий или рваный, когда у вас нет ML-инженера или когда нужно запуститься на этой неделе.

Частая ошибка – доверять таймкодам на трудных токенах

Самая болезненная ошибка, которую мы видим с WhisperX, – считать каждый пословный таймкод одинаково надёжным. На демо с чистой речью тайминг выглядит безупречно, поэтому команды строят фичи – кликабельный транскрипт, движок субтитров, нарезчик клипов, – которые считают время каждого слова точным. Потом приходит реальное аудио, полное цен, дат, телефонов и имён собственных, и часть этих токенов вообще не была выровнена. Они заимствуют таймкод соседнего слова, и кликабельный транскрипт прыгает не на ту секунду, а авто-клип начинается посреди слова.

Решение – знать, какие слова были реально выровнены, а какие откатились. Вывод WhisperX это помечает: выровненное слово несёт плотные начало и конец; невыровненное наследует границы своего сегмента. Постройте фичу так, чтобы читать это различие: для всего необратимого или видимого пользователю считайте откатный таймкод «приблизительным» и, где важно, расширяйте границу клипа или помечайте слово на проверку. Тестируйте на аудио, намеренно полном чисел и имён, до того как доверитесь таймингу в проде, а не после первой жалобы.

Как выбрать – четыре вопроса

Решение сводится к четырём вопросам, по порядку.

Первый: вам действительно нужны пословный тайминг или метки говорящих? Если нужна только простая расшифровка сказанного – обычный Whisper или faster-whisper проще, и WhisperX можно пропустить целиком. WhisperX отрабатывает свои две лишние стадии, только когда важно когда или кто.

Второй: аудио обязано оставаться на ваших серверах? Для медицинских, юридических или иначе регулируемых записей, которые нельзя отправлять в стороннее облако, self-host WhisperX часто – единственный комплаентный вариант, и эксплуатационная стоимость – это цена этого комплаенса.

Третий: работа batch или живая? WhisperX работает только в batch – он обрабатывает готовые файлы. Если вам нужен пословный тайминг на живом потоке, WhisperX – неподходящий инструмент; вам нужны потоковые варианты из предыдущего урока или собственная схема потокового выравнивания.

Четвёртый: есть ли у вас команда и объём? WhisperX вознаграждает ровный высокий batch-объём и инженера, способного держать GPU-конвейер. При низком или рваном объёме или без ML-команды облачный API, дающий таймкоды и диаризацию за одним API-ключом, выйдет дешевле в сумме и куда быстрее в запуске.

Рисунок 3. Четыре вопроса, заданные по порядку, направляют большинство проектов «таймкоды и говорящие» к нужному инструменту.

Где здесь Фора Софт

Мы встраиваем расшифровку в видеопродукты, которые поставляют наши клиенты, и выбор между WhisperX и облачным API возникает постоянно. Мы использовали WhisperX там, где пословный тайминг и метки говорящих должны были производиться на собственной инфраструктуре клиента, – поисковые транскрипты для OTT- и surveillance-архивов, записи с разделением говорящих для телемедицинских консультаций и субтитры с пословным таймингом для библиотек e-learning. Повторяющийся урок: модель – лёгкая часть. Трудная часть – интеграция: извлечь чистое аудио на правильной частоте дискретизации, обработать откаты выравнивания так, чтобы таймкоды никогда тихо не врали, управлять токеном Hugging Face и закрытыми моделями, не ломая деплой, и честно решить, оправдывает ли объём клиента GPU-конвейер или облачный API. Мы выбираем по четырём вопросам выше, а не по тому, какой инструмент сейчас в моде.

Главное

  • WhisperX добавляет к Whisper три стадии: детекцию речи, forced alignment и диаризацию.
  • Forced alignment поднимает точность тайминга до 93,2% на телефонной речи против 85,4% у Whisper.
  • «Cut & Merge» по тишине включает батчевую расшифровку – до 70× быстрее реального времени.
  • Диаризация (через pyannote) метит говорящих, но требует HF-токен и проверку человеком.
  • Выравнивание ломается на числах, символах и неподдерживаемых языках – тестируйте на трудном аудио.
  • Для ровного batch-объёма self-host WhisperX намного дешевле облачного API.

Что почитать дальше

Строите такую систему?

Подберём параметры кодирования под ваш контент и посчитаем стоимость доставки до старта разработки.