Whisper от OpenAI

Разбираем самую популярную открытую модель ASR и учимся её запускать.

Whisper — открытая seq2seq-модель распознавания речи от OpenAI, обученная на сотнях тысяч часов аудио на 99 языках; умеет и транскрибировать, и переводить речь в текст.

Whisper стал стандартом де-факто для распознавания речи: он точен, многоязычен, устойчив к шуму и акцентам, а главное — открыт и прост в использовании. Если вам нужно «речь → текст» без обучения своей модели, начинают почти всегда с него.

Архитектура

Whisper — классический энкодер-декодер на трансформерах (тот самый seq2seq с attention из прошлого урока). Энкодер получает лог-мел-спектрограмму (80 каналов) и превращает её в представление. Декодер авторегрессионно порождает текст, управляемый специальными токенами: на каком языке, транскрипция это или перевод, нужны ли таймкоды.

звук 16кГц --> лог-мел (80) --> [энкодер] --> представление
                                                   |
   спецтокены (<|ru|> <|transcribe|>) --> [декодер] --> текст

Многоязычность и режимы

Whisper обучен на 99 языках, включая русский, и сам определяет язык по звуку. У него два ключевых режима: transcribe (речь → текст на том же языке) и translate (речь на любом языке → текст по-английски). Это делает его универсальным инструментом для субтитров и расшифровок.

РазмерПараметрыКогда
tiny / base39–74 млнбыстро, черновик
small / medium244–769 млнбаланс
large-v31.5 млрдмаксимум точности

Whisper за несколько строк

Через библиотеку transformers распознавание умещается в пару строк. Этот код использует сторонние библиотеки (torch, transformers) и сетевую загрузку модели — он не исполняется в браузере, а приведён как образец для вашей машины.

from transformers import pipeline

# создаём пайплайн распознавания речи
asr = pipeline("automatic-speech-recognition", model="openai/whisper-small")

# распознаём аудиофайл
result = asr("speech.wav")
print(result["text"])

Для русского языка и перевода можно передать параметры генерации:

asr = pipeline("automatic-speech-recognition", model="openai/whisper-medium")

# транскрипция на русском
ru = asr("rech.wav", generate_kwargs={"language": "russian", "task": "transcribe"})
print("Текст:", ru["text"])

# перевод речи на английский
en = asr("rech.wav", generate_kwargs={"language": "russian", "task": "translate"})
print("Перевод:", en["text"])

Оригинальная библиотека openai-whisper устроена ещё проще, но идея та же — модель сама делает всю работу от спектрограммы до текста.

Логика выбора длинных аудио

Whisper работает с окнами по 30 секунд. Длинное аудио режут на чанки. Прикинем число чанков на чистом Python.

duration_sec = 185      # длина записи
chunk = 30              # окно Whisper

import math
n_chunks = math.ceil(duration_sec / chunk)
print("Длина:", duration_sec, "сек")
print("Чанков по 30 сек:", n_chunks)
print("Последний чанк, сек:", duration_sec - (n_chunks - 1) * chunk)

Вывод:

Длина: 185 сек
Чанков по 30 сек: 7
Последний чанк, сек: 5

Хорошая интуиция про размеры Whisper: это не «больше — всегда лучше», а выбор точки на кривой «скорость против качества». Модель tiny на ноутбуке расшифрует час записи за минуты и сгодится для черновика, но споткнётся на тихой речи, именах и терминах. Large-v3 эти же места разберёт куда увереннее, но и ресурсов, и времени потребует в десятки раз больше, а без видеокарты будет мучительно медленной. Практичный приём — гонять small или medium по умолчанию и поднимать до large только те фрагменты, где черновая версия выглядит подозрительно.

Оборотная сторона обучения на «диком» интернет-аудио — склонность Whisper к галлюцинациям. На участках тишины, музыки или сильного шума декодер, будучи по сути языковой моделью, может уверенно «дописать» текст, которого в звуке нет: повторить последнюю фразу, вставить «Спасибо за просмотр» или выдумать предложение. Это прямое следствие seq2seq-природы: декодер всегда хочет порождать правдоподобный текст. Именно поэтому VAD из конца курса часто ставят перед Whisper — отсечь тишину, на которой модель особенно любит фантазировать, дешевле, чем потом вычищать выдуманные реплики.

История Whisper — наглядный урок о том, что в современном ИИ данные нередко важнее архитектуры. Внутри него нет ни одной экзотической идеи: обычный трансформер-энкодер-декодер, какие описывали ещё в 2017 году. Вся сила пришла от 680 тысяч часов разнообразного аудио, собранного из интернета вместе с уже готовыми, пусть и неидеальными, субтитрами. Этот объём научил модель акцентам, фоновой музыке, телефонному качеству и десяткам языков — тому, что вручную не разметишь. Тот же рецепт «масштаб данных бьёт хитрый дизайн» мы видели в больших языковых моделях и в компьютерном зрении.

Как работает под капотом

Секрет Whisper не в хитрой архитектуре (она стандартная), а в масштабе и разнообразии данных: 680 тысяч часов слабо размеченного аудио из интернета. Такой объём научил модель шуму, акцентам, музыке на фоне и множеству языков. Это пример общего тренда: большие предобученные модели на огромных данных бьют тщательно спроектированные узкие системы.

Частые ошибки

  • Подавать не 16 кГц. Whisper ждёт 16 кГц моно; забыли ресэмплинг — страдает качество (библиотеки часто делают это сами).
  • Брать large без нужды. Для черновых субтитров small/base быстрее и почти так же хороши.
  • Путать translate и transcribe. translate всегда выдаёт английский, что неожиданно для тех, кто хотел текст на языке оригинала.

Итоги

  • Whisper — открытая seq2seq-модель ASR на 99 языках.
  • Вход — лог-мел (80 каналов); режимы transcribe и translate задаются токенами.
  • Через transformers распознавание — буквально несколько строк.
  • Сила Whisper — в масштабе и разнообразии обучающих данных (680 тыс. часов).
Проверьте себя
1. На какой архитектуре построен Whisper?
AGMM-HMM
BЭнкодер-декодер на трансформерах (seq2seq с attention)
CТолько CTC
DБез нейросетей
2. Что делает режим translate в Whisper?
AТранскрибирует на языке оригинала
BПереводит речь (с любого языка) в текст на английском
CТолько определяет язык
DСинтезирует речь
3. В чём главный секрет качества Whisper?
AУникальная архитектура
BОгромный объём и разнообразие обучающих данных (сотни тысяч часов)
CЗапуск только на сервере
DОчень маленький размер