MAATRIX / Блог / faster-whisper против whisper.cpp: что выгоднее и когда

faster-whisper против whisper.cpp: что выгоднее и когда

faster-whisper против whisper.cpp: что выгоднее и когда

MAATRIX

Выбор между faster-whisper и whisper.cpp сводят к вопросу «кто быстрее», хотя оба движка на C++ считают одну и ту же нейросеть — заметной разницы в скорости чаще всего нет. Расходятся они в другом: один встраивается в Python-приложение и требует venv, второй — самостоятельный бинарник без интерпретатора, но с ручной сборкой под процессор. Разберём оба движка по критериям, которые реально всплывают в эксплуатации, — с версиями, флагами и честным ответом, где выигрыш есть, а где его придумали.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество 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-whisperwhisper.cpp
Что ставитсяvenv с ctranslate2, tokenizers, avкаталог бинарников, зависимостей нет
Установкаpip install faster-whisperсборка через CMake или готовый архив
Формат весовкаталог CTranslate2 с model.binодин файл ggml-*.bin, можно квантованный
Готовый CLIнет, отдельно пакет whisper-ctranslate2whisper-cli с выводом в SRT, VTT, JSON
HTTP-сервернет, пишете самиwhisper-server, порт 8080
Параллельные запросыnum_workers в одном процессепо одному, остальные ждут
Пакетная обработкаBatchedInferencePipelineнет
Пословные тайм-кодыword_timestamps=True--dtw, нужен пресет под модель
УскорителиCUDA 12 + cuDNN 9CUDA, 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 — десятки моделей в одном окне. Оплата картой РФ и по СБП.