Как работает Whisper архитектурно для ASR (Automatic Speech Recognition)?
Краткий тезис
Whisper — это transformer|encoder-decoder transformer от OpenAI, предназначенный для распознавания речи (ASR). Аудиосигнал преобразуется в log-Mel спектрограмму, которая подаётся в encoder. Encoder использует два свёрточных слоя для даунсемплинга, а затем стек transformer-блоков. Decoder авторегрессивно генерирует транскрипцию, используя cross-attention к encoder. Модель обучена на 680k часах мультиязычных данных, поддерживает 90+ языков и умеет выполнять не только транскрипцию, но и перевод на английский, а также определять язык.
1. Общая архитектура Whisper
Whisper — это sequence-to-sequence (seq2seq) модель, основанная на архитектуре Transformer. Она состоит из двух основных частей:
- Encoder — преобразует входное аудио в скрытые представления (hidden states).
- Decoder — генерирует выходной текст (транскрипцию, перевод или метку языка) авторегрессивно, токен за токеном.
В отличие от классических ASR-систем (например, CTC-моделей), Whisper не использует отдельный языковой модуль или фонетический словарь — всё обучено end-to-end.
| Компонент | Назначение |
|---|---|
| Encoder | Извлекает акустические признаки из спектрограммы |
| Decoder | Генерирует текстовую последовательность с учётом контекста аудио |
| Cross-attention | Связь decoder с encoder: каждый шаг decoder «смотрит» на все выходы encoder |
2. Предобработка аудио: log-Mel спектрограмма
Входное аудио (моно, 16 кГц) сначала преобразуется в log-Mel спектрограмму — двумерное представление частот по времени.
- Аудио разбивается на окна (frame) длиной 25 мс со сдвигом 10 мс.
- Для каждого окна вычисляется спектр через STFT (Short-Time Fourier Transform).
- Спектр сводится к Mel-шкале — 80 Mel-фильтров, имитирующих восприятие человеческого уха.
- Берётся логарифм от амплитуды: log(Mel спектр + 1e-10).
Итоговый тензор имеет размерность (T, 80), где T — число временных шагов (frames). Для 30-секундного аудио T ≈ 3000.
Почему log-Mel
- Mel-шкала снижает размерность (80 каналов вместо 257 в линейном спектре).
- Логарифм сжимает динамический диапазон, делая признаки более устойчивыми к громкости.
3. Encoder: свёрточные слои и transformer
-
Два свёрточных слоя (conv1d) с ядром размера 3 и stride=1, каждый с GELU активацией.
- Первый слой:
in_channels=80(Mel-каналы) →out_channels=encoder_dim(например, 384 для small, 1024 для large). - Второй слой: сохраняет размерность.
- Даунсемплинг не используется (stride=1), но свёртки уменьшают временную размерность за счёт padding? На самом деле, в Whisper свёртки не меняют длину последовательности (padding='same'). Однако в оригинальной статье упоминается, что свёртки выполняют «локальное сжатие» признаков. Позже в transformer-блоках используется позиционное кодирование (sinusoidal).
- Первый слой:
-
Стек transformer-блоков (количество зависит от размера модели: 6 для tiny, 32 для large). Каждый блок содержит:
- Multi-head self-attention (с residual connection и layer norm).
- Feed-forward network (FFN) с расширением в 4 раза.
- Layer norm перед каждым подуровнем (pre-norm).
Выход encoder — последовательность скрытых векторов (T, d_model), где d_model — размерность модели.
Почему свёртки перед transformer
- Они помогают модели извлекать локальные паттерны (например, форманты) до того, как self-attention начнёт обрабатывать глобальный контекст.
- Увеличивают эффективность: transformer может сосредоточиться на более высокоуровневых зависимостях.
4. Decoder: авторегрессивная генерация
Decoder Whisper — это стандартный autoregressive transformer decoder. Он генерирует выходную последовательность токенов по одному, используя:
- Masked self-attention — каждый токен может «смотреть» только на предыдущие (чтобы не подглядывать в будущее).
- Cross-attention — каждый токен decoder обращается ко всем выходам encoder (ключи и значения от encoder, запросы от decoder).
- Feed-forward — как в encoder.
На первом шаге decoder получает специальный токен <|startoftranscript|>. Затем на каждом шаге он предсказывает следующий токен, используя предыдущие.
Выходные задачи (multitask):
- Транскрипция на исходном языке.
- Перевод на английский (если указан токен
<|translate|>). - Определение языка (токен
<|lang|>). - Метка временных меток (опционально).
Все задачи решаются одной моделью — выбор задачи кодируется специальными токенами в начале последовательности.
5. Токенизация: Byte-Pair Encoding (BPE)
Whisper использует Byte-Pair Encoding (BPE) для токенизации текста. Словарь размером 51865 токенов (включая специальные токены для языков, задач и временных меток).
- BPE разбивает текст на подслова (subwords), что позволяет обрабатывать редкие слова и мультиязычные тексты.
- В отличие от многих ASR-систем, которые используют фонемы или символы, Whisper работает на уровне текста, что упрощает интеграцию с downstream-задачами.
Пример: слово "hello" может быть токеном [15339], а слово "hel" + "lo" — двумя токенами.
6. Обучение: данные, задачи, loss
Whisper обучен на 680 000 часах мультиязычного аудио, собранного из интернета (в основном YouTube). Данные включают 90+ языков, а также английский перевод для части записей.
Обучение с учителем (supervised):
- Для каждого аудиофайла есть транскрипция на исходном языке, а для некоторых — ещё и английский перевод.
- Модель обучается предсказывать последовательность токенов, которая включает:
<|startoftranscript|> <|lang|> <|task|> <|transcribe|> <текст> <|endoftext|>
Функция потерь Cross-entropy loss на каждом шаге decoder (стандартный loss для языковых моделей).
Особенности обучения
- Размер батча: до 256 аудиофайлов (каждый обрезан до 30 секунд).
- Оптимизатор: AdamW, learning rate с warmup и cosine decay.
- Регуляризация: dropout, weight decay.
- Модели разных размеров: tiny (39M), base (74M), small (244M), medium (769M), large (1550M).
7. Мультиязычность и мультизадачность
Whisper умеет одновременно:
- Транскрибировать аудио на любом из 90+ языков.
- Переводить аудио на английский (если задан токен
<|translate|>). - Определять язык аудио (без отдельного классификатора).
Это достигается за счёт специальных токенов в начале последовательности decoder:
<|en|>,<|fr|>,<|de|>и т.д. — язык.<|transcribe|>— задача транскрипции.<|translate|>— задача перевода на английский.
Модель обучается на всех комбинациях, поэтому может выполнять любую задачу в зависимости от промпта.
8. Инференс: стратегии декодирования
На этапе инференса Whisper использует beam search (по умолчанию beam size=5) для улучшения качества. Также поддерживается temperature sampling для стохастической генерации (полезно для креативных задач).
Параметры декодирования
beam_size— ширина луча (чем больше, тем лучше, но медленнее).temperature— контролирует «случайность» (0 — жадный поиск, >0 — sampling).compression_ratio— штраф за повторение токенов.no_speech_threshold— если вероятность токена<|nospeech|>высока, модель считает, что речи нет.
Обработка длинных аудио
Whisper принимает аудио длиной до 30 секунд. Для более длинных записей используется sliding window с перекрытием (chunking). Каждый чанк транскрибируется отдельно, затем результаты объединяются с учётом временных меток.
9. Сравнение с другими ASR-моделями
| Модель | Архитектура | Обучение | Языки | Особенности |
|---|---|---|---|---|
| Whisper | Encoder-decoder transformer | Supervised (680k часов) | 90+ | Multitask, без предобучения на неразмеченных данных |
| wav2vec 2.0 | CNN + transformer encoder | Self-supervised (CTC) | Любые (дообучение) | Требует дообучения под язык, меньше данных |
| HuBERT | CNN + transformer encoder | Self-supervised (кластеризация) | Любые | Более устойчив к шуму, чем wav2vec |
| DeepSpeech | RNN (LSTM) + CTC | Supervised | Ограничен | Устаревшая, но простая |
Whisper выигрывает в мультиязычности и удобстве (одна модель для всего), но проигрывает в скорости и размере (large модель ~1.5B параметров).
10. Ограничения и особенности
- Размер модели large версия требует много GPU памяти (около 10 GB для batch size=1).
- Задержка (latency): из-за encoder-decoder архитектуры и beam search инференс медленнее, чем у CTC-моделей.
- Длинные аудио chunking может привести к потере контекста между чанками (например, разрыв предложения).
- Шум и акценты модель обучена на YouTube, поэтому хорошо работает с чистой речью, но может ошибаться на сильном шуме или нестандартных акцентах.
- Только английский перевод перевод возможен только на английский (не на другие языки).
11. Пет-проект для закрепления
Задача Создать веб-приложение для транскрипции и перевода аудиофайлов с помощью Whisper.
Инструменты
- Python, библиотека
openai-whisper gradioдля интерфейсаffmpegдля конвертации аудио
Шаги:
- Установить зависимости:
pip install openai-whisper gradio ffmpeg-python - Загрузить модель:
model = whisper.load_model("base") - Написать функцию, которая принимает аудиофайл, возвращает транскрипцию и перевод:
def transcribe_and_translate(audio_path): result = model.transcribe(audio_path, task="transcribe") translation = model.transcribe(audio_path, task="translate") return result["text"], translation["text"] - Создать интерфейс Gradio:
import gradio as gr iface = gr.Interface( fn=transcribe_and_translate, inputs=gr.Audio(type="filepath"), outputs=[gr.Textbox(label="Транскрипция"), gr.Textbox(label="Перевод")] ) iface.launch() - Протестировать на разных аудио (свои записи, примеры из интернета).
Ожидаемый результат Рабочее приложение, которое принимает аудио (mp3, wav) и выводит транскрипцию на исходном языке и перевод на английский. Можно добавить выбор модели (tiny, small, medium, large) и параметры декодирования.
12. Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 541 | Архитектура encoder-decoder в NLP |
| 542 | Механизм cross-attention |
| 544 | Интеграция ASR в RAG-систему |
| 545 | Сравнение Whisper и wav2vec 2.0 |
| 546 | Fine-tuning Whisper под специфический домен |
| 548 | Мультиязычное распознавание речи |
Навигация
- Предыдущий: 542
- Следующий: 544
- Индекс: 00. Индекс разборов