faster-whisper против whisper.cpp: что выгоднее и когда
Выбор между faster-whisper и whisper.cpp сводят к вопросу «кто быстрее», хотя оба движка на C++ считают одну и ту же нейросеть — заметной разницы в скорости чаще всего нет. Расходятся они в другом: один встраивается в Python-приложение и требует venv, второй — самостоятельный бинарник без интерпретатора, но с ручной сборкой под процессор. Разберём оба движка по критериям, которые реально всплывают в эксплуатации, — с версиями, флагами и честным ответом, где выигрыш есть, а где его придумали.
Содержание
- Один и тот же Whisper, два разных движка
- Установка: pip в venv против CMake с флагами
- Модели и память: CT2 против ggml
- Вход и выход: чем кормить и что получаете
- Скорость и качество: где разница реальна, а где её выдумывают
- Прод: API, параллельность и обслуживание
- Что выбрать под задачу и какой сервер взять в MAATRIX
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Один и тот же Whisper, два разных движка
Веса Whisper одни и те же — их выложила OpenAI под лицензией MIT. Различаются только рантаймы.
faster-whisper — тонкая Python-обёртка над CTranslate2, движком инференса от SYSTRAN: внутри C++ с GEMM-ядрами, снаружи — библиотека для импорта в свой код. Актуальная ветка — 1.2.x.
whisper.cpp — реализация на C/C++ поверх библиотеки ggml, той же, что в основе llama.cpp. Ни Python, ни CUDA-стека — набор бинарников и файл весов. Ветка — 1.9.x.
Сводка по критериям:
| Критерий | faster-whisper | whisper.cpp |
|---|---|---|
| Что ставится | venv с ctranslate2, tokenizers, av | каталог бинарников, зависимостей нет |
| Установка | pip install faster-whisper | сборка через CMake или готовый архив |
| Формат весов | каталог CTranslate2 с model.bin | один файл ggml-*.bin, можно квантованный |
| Готовый CLI | нет, отдельно пакет whisper-ctranslate2 | whisper-cli с выводом в SRT, VTT, JSON |
| HTTP-сервер | нет, пишете сами | whisper-server, порт 8080 |
| Параллельные запросы | num_workers в одном процессе | по одному, остальные ждут |
| Пакетная обработка | BatchedInferencePipeline | нет |
| Пословные тайм-коды | word_timestamps=True | --dtw, нужен пресет под модель |
| Ускорители | CUDA 12 + cuDNN 9 | CUDA, Vulkan, Metal, ARM NEON |
| Диаризация | нет, нужен pyannote или WhisperX | -tdrz, экспериментально, только английский |
Водораздел проходит не по скорости, а по форме поставки: faster-whisper — библиотека для Python-приложения, whisper.cpp — программа, которую можно положить рядом с чем угодно, включая контейнер без интерпретатора или одноплатник на ARM.
Установка: pip в venv против CMake с флагами
faster-whisper ставится за минуту:
python3 -m venv /opt/whisper/venv
/opt/whisper/venv/bin/pip install -U faster-whisper
/opt/whisper/venv/bin/python -c "import faster_whisper, ctranslate2 as c; print(faster_whisper.__version__, c.__version__)"
Единственная заминка — PEP 668: системный pip на Ubuntu 24.04 и Debian 12 ответит error: externally-managed-environment, поэтому venv здесь не рекомендация, а обязательное условие.
whisper.cpp требует компилятора и осознанных флагов:
apt update && apt install -y build-essential cmake git
git clone https://github.com/ggml-org/whisper.cpp /opt/whisper.cpp
cd /opt/whisper.cpp
cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_NATIVE=OFF
cmake --build build -j2 --config Release
Проект переехал из ggerganov/whisper.cpp в организацию ggml-org — старые инструкции ведут на редирект. Флаг GGML_NATIVE по умолчанию включён и даёт -march=native: бинарник затачивается под инструкции машины сборки. На VPS это мина замедленного действия — провайдер мигрирует виртуалку на ноду с другим процессором, и вчера работавшая расшифровка падает с Illegal instruction (core dumped) без строки в логе. Выключайте флаг на VPS всегда, а сборку на машине с 2 ГБ памяти ведите с -j2 — иначе компилятор ggml уйдёт в OOM.
Бинарники окажутся в build/bin: whisper-cli, whisper-server, whisper-bench, quantize. С версии 1.7.4 их переименовали — старый main теперь заглушка:
WARNING: The binary 'main' is deprecated.
Please use 'whisper-cli' instead.
Модели тянутся отдельными скриптами: sh ./models/download-ggml-model.sh large-v3-turbo. faster-whisper качает веса сам при первом обращении в кэш Hugging Face — неприятно на проде, где сервис при каждом старте зависит от чужой доступности.
Развернуть за пару минут
Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Развернуть WhisperМодели и память: CT2 против ggml
Форматы весов несовместимы. У faster-whisper модель — каталог с model.bin, config.json и токенизатором вида Systran/faster-whisper-large-v3, у whisper.cpp — один файл ggml-large-v3-turbo.bin. Конвертеры есть в обе стороны (ct2-transformers-converter, models/convert-*.py), но проще скачать нужный формат напрямую.
У faster-whisper веса лежат в float16 (large-v3 — около трёх гигабайт на диске), а compute_type="int8" квантует их в момент загрузки: на диске полный размер, в памяти — примерно вдвое меньше. У whisper.cpp квантование делается заранее и записывается в файл:
./build/bin/quantize models/ggml-large-v3-turbo.bin \
models/ggml-large-v3-turbo-q5_0.bin q5_0
Модель после этого занимает мало и на диске, и в памяти — старт не тратит время на пересчёт. На сервере с 40 ГБ диска это принципиально: квантованный large-v3-turbo в q5_0 укладывается в несколько сотен мегабайт против трёх гигабайт диска у полновесной модели CTranslate2.
Честно про качество: q5_0 и int8 — оба компромисс. На студийной записи разница с float-версией теряется в шуме, на звонке с фоном и редкими фамилиями оба квантования ошибаются заметнее, по-разному. Проверяйте на своих записях, а не по чужим отзывам.
Плюс whisper.cpp — офлайн по умолчанию: файл на диске, рантайм в сеть не ходит. У faster-whisper офлайн включают явно — путь к каталогу вместо алиаса плюс HF_HUB_OFFLINE=1, иначе сервис не переживёт недоступность Hugging Face.
Вход и выход: чем кормить и что получаете
Устаревшее утверждение про whisper.cpp: «принимает только WAV 16 кГц моно». Это было правдой, пока разбором занимался dr_wav, и до сих пор кочует по статьям. С версии 1.7.5 декодирование перевели на miniaudio, и whisper-cli читает WAV, MP3, FLAC и OGG напрямую, сам приводя их к 16 кГц:
./build/bin/whisper-cli -m models/ggml-large-v3-turbo-q5_0.bin \
-l ru -f /opt/audio/planerka.mp3 -osrt -of /opt/out/planerka
Ограничение осталось, но другое: miniaudio не знает AAC, а значит .m4a с диктофона и звук из .mp4 он не возьмёт. Вариант — собрать с -DWHISPER_FFMPEG=ON либо конвертировать заранее: ffmpeg -i interview.m4a -ar 16000 -ac 1 -c:a pcm_s16le interview.wav.
faster-whisper этой проблемы лишён вовсе — читает аудио через PyAV, теми же библиотеками, что и ffmpeg, и переваривает .m4a, .mp4, .opus без подготовки.
С выходом всё наоборот. whisper.cpp пишет результат готовыми файлами: -otxt, -osrt, -ovtt, -oj для JSON, -ocsv, -olrc. Флаг -ml 16 ограничивает длину строки субтитра. faster-whisper не возвращает ничего, кроме генератора объектов Segment с полями start, end, text; SRT собираете сами или ставите whisper-ctranslate2 с --output_format srt.
Пословные тайм-коды снова в пользу Python-варианта: у faster-whisper — word_timestamps=True и список слов с вероятностями, у whisper.cpp — --dtw, но нужен пресет «выравнивающих голов» под модель — для сторонних весов его может не быть.
Диаризацию не умеет ни один — у whisper.cpp -tdrz работает только с англоязычной моделью small.en-tdrz, для faster-whisper это отдельный слой: pyannote или WhisperX поверх результата.
Скорость и качество: где разница реальна, а где её выдумывают
Ожидание «один движок быстрее другого на N процентов» почти всегда обманывает: оба считают одну нейросеть, оба на C++ и квантуют. Порядок величины одинаковый — разброс задают другие вещи:
- Размер модели. Переход с
large-v3наlarge-v3-turboменяет время в разы — у turbo кратно меньше слоёв декодера. - Режим вычислений.
int8противfloat32,q5_0противf16— тоже кратный эффект. - Число потоков.
cpu_threadsу faster-whisper и-tу whisper.cpp, дефолт в обоих — четыре: на двух ядрах толкотня, на восьми — недоиспользование. - VAD. Выкинутая тишина — меньше аудио на входе; на записях звонков эффект больше, чем от смены движка.
- Пакетная обработка. Только у faster-whisper и только если хватает памяти.
Где преимущество реально есть: faster-whisper — на длинных файлах за счёт BatchedInferencePipeline, whisper.cpp — на маленьких моделях, тесной памяти, ARM и там, где полезны -fa (flash attention) или Vulkan.
Честные цифры — только на своём аудио и своей машине. У whisper.cpp для этого есть whisper-bench -m models/ggml-large-v3-turbo-q5_0.bin -t 4, а после расшифровки whisper-cli печатает разбивку по стадиям:
whisper_print_timings: load time = ... ms
whisper_print_timings: mel time = ... ms
whisper_print_timings: encode time = ... ms
whisper_print_timings: decode time = ... ms
whisper_print_timings: total time = ... ms
Сравнивайте на одном файле, с одинаковой моделью и числом потоков, на прогретом кэше — первый запуск не показателен. Метрика — время обработки на длительность записи. Ловушка: -p режет аудио на куски и ухудшает качество на границах из-за потери контекста — сравнивать с ним против faster-whisper некорректно.
При одинаковых весах и параметрах декодирования результат совпадает с точностью до мелочей. «Этот движок точнее» почти всегда объясняется разными умолчаниями — VAD, beam_size, откатами по температуре. Выровняйте параметры прежде, чем делать вывод.
Прод: API, параллельность и обслуживание
У whisper.cpp HTTP-сервер уже написан:
./build/bin/whisper-server -m models/ggml-large-v3-turbo-q5_0.bin \
--host 127.0.0.1 --port 8080 -t 4 --convert \
--vad --vad-model models/ggml-silero-v6.2.0.bin
Запрос — обычная multipart-форма на /inference:
curl 127.0.0.1:8080/inference \
-H "Content-Type: multipart/form-data" \
-F file="@call.wav" -F language="ru" -F response_format="srt"
Три момента заранее. Модель по умолчанию — models/ggml-base.en.bin, англоязычная: забыли -m — получите на русской записи бессмысленный английский текст. Флаг --convert требует ffmpeg в системе. Главное: сервер держит один контекст модели и обрабатывает запросы по очереди — второй пользователь ждёт. Ни аутентификации, ни TLS в нём нет: только 127.0.0.1, наружу — через Nginx с ограничением доступа.
У faster-whisper готового сервера нет, зато есть настоящая параллельность: модель создаётся один раз, а num_workers разрешает нескольким потокам одновременно звать transcribe():
from faster_whisper import WhisperModel
MODEL = WhisperModel("large-v3-turbo", device="cpu",
compute_type="int8", cpu_threads=4, num_workers=2)
Плата — память: каждый воркер держит свои буферы. Но для сервиса с несколькими клиентами это другой уровень, чем очередь из одного места.
Эксплуатационные риски тоже разные: venv под 3.12 после апгрейда дистрибутива отдаёт ModuleNotFoundError, хотя вы «ничего не трогали» — лечится пересозданием venv, но узнаёте об этом в момент падения сервиса. У whisper.cpp бинарник надо пересобирать при обновлении: другая сборочная машина — и вернётся тот же Illegal instruction. Разница видна в контейнерах: python:3.12-slim плюс CTranslate2 против одного бинарника поверх debian:bookworm-slim.
Что выбрать под задачу и какой сервер взять в MAATRIX
Вывод по сценариям, без попытки назначить победителя:
- Пакетная расшифровка длинных записей, Python-пайплайн, очередь задач — faster-whisper: батчинг и
num_workersдают то, чего у конкурента нет. - Субтитры файлами, один сервис на команду, минимум возни — whisper.cpp:
whisper-serverи-osrtзакрывают задачу без своего кода. - Мало памяти, ARM, контейнер без Python — whisper.cpp с квантованной моделью.
- Пословные тайм-коды, диаризация через WhisperX, дообученные модели — faster-whisper.
- Оба сразу — нормальная стратегия: whisper.cpp обслуживает короткие запросы, faster-whisper ночью перемалывает архив. Форматы весов разные, конфликтов нет.
Приложение whisper есть в каталоге apps.maatrix.io и разворачивается автоматически при заказе — на Ubuntu и на Debian, руками ставить не нужно. Адрес и ключи — в личном кабинете, в разделе «Доступ». Команды из статьи нужны не для установки, а чтобы понимать, что внутри.
Честный минимум: 2 vCPU, 4 ГБ RAM, 40 ГБ NVMe. Хватает одному движку из двух: whisper.cpp с large-v3-turbo в q5_0 живёт свободно, faster-whisper с small или medium в int8 — тоже. Ограничения прямо: батчинг не включить — восемь сегментов упрутся в OOM; сборку whisper.cpp вести с -j2 или через swap; часовая запись на двух ядрах считается долго. Конфигурация под разовые файлы, не под конвейер.
Комфортный вариант: 4–8 vCPU, 8–16 ГБ RAM, 80 ГБ NVMe. Здесь помещаются оба стека сразу — держите рядом обе модели и решайте по результату на своих записях. Диск считайте заранее: обе large-v3 в сумме — около шести гигабайт, плюс turbo и входящие файлы — десять уходят незаметно. Уже осмысленны BatchedInferencePipeline с batch_size=8, два воркера и очередь задач. Видеокарта нужна при часах аудио ежедневно — ориентир по VRAM: около 6 ГБ для turbo, 10 ГБ для large-v3.
Локация — Великобритания, Лондон. Оба движка тянут веса с Hugging Face — из Лондона они скачиваются напрямую, без переливания через третью машину. Заливка часовой записи из Европы занимает секунды, плюс понятный европейский режим обработки персональных данных. Если по 152-ФЗ материалы обязаны оставаться в России — берите RU-локацию: обе реализации после скачивания весов работают офлайн.
Оплата — картой российского банка, по СБП, криптовалютой или токеном MAAT; зарубежная карта для сервера в Лондоне не требуется.
Развернуть за пару минут
Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Развернуть WhisperОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
Правда ли, что whisper.cpp принимает только WAV 16 кГц моно?
Уже нет. С версии 1.7.5 декодирование идёт через miniaudio, и whisper-cli читает WAV, MP3, FLAC и OGG напрямую. AAC не поддерживается: .m4a и звук из .mp4 конвертируйте через ffmpeg -ar 16000 -ac 1 -c:a pcm_s16le либо собирайте с -DWHISPER_FFMPEG=ON.
Даст ли переход с faster-whisper на whisper.cpp прирост скорости сам по себе?
Обычно нет: оба движка на C++ и квантуют веса, порядок величины одинаковый. Кратный выигрыш дают large-v3-turbo, int8/q5_0 вместо float, число потоков, VAD. Переезжать стоит ради Python, готового сервера, маленького контейнера — не ради процентов.
Можно ли держать оба движка на одной машине?
Да, они не пересекаются: разные каталоги, форматы весов, порты. Следите за диском — модели хранятся в двух форматах — и не запускайте их одновременно на одних ядрах: два процесса по четыре потока на четырёх ядрах медленнее, чем по очереди.
Нужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.