Whisper от OpenAI
Разбираем самую популярную открытую модель ASR и учимся её запускать.
Whisper — открытая seq2seq-модель распознавания речи от OpenAI, обученная на сотнях тысяч часов аудио на 99 языках; умеет и транскрибировать, и переводить речь в текст.
Whisper стал стандартом де-факто для распознавания речи: он точен, многоязычен, устойчив к шуму и акцентам, а главное — открыт и прост в использовании. Если вам нужно «речь → текст» без обучения своей модели, начинают почти всегда с него.
Архитектура
Whisper — классический энкодер-декодер на трансформерах (тот самый seq2seq с attention из прошлого урока). Энкодер получает лог-мел-спектрограмму (80 каналов) и превращает её в представление. Декодер авторегрессионно порождает текст, управляемый специальными токенами: на каком языке, транскрипция это или перевод, нужны ли таймкоды.
звук 16кГц --> лог-мел (80) --> [энкодер] --> представление
|
спецтокены (<|ru|> <|transcribe|>) --> [декодер] --> текст
Многоязычность и режимы
Whisper обучен на 99 языках, включая русский, и сам определяет язык по звуку. У него два ключевых режима: transcribe (речь → текст на том же языке) и translate (речь на любом языке → текст по-английски). Это делает его универсальным инструментом для субтитров и расшифровок.
| Размер | Параметры | Когда |
| tiny / base | 39–74 млн | быстро, черновик |
| small / medium | 244–769 млн | баланс |
| large-v3 | 1.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 тыс. часов).