LinuxRuLinux без лишней теории
Речь в текст

Распознавание речи в Linux: Whisper и whisper.cpp для аудио, видео и субтитров

Редакция LinuxRu7 мин чтенияИнструкции

Whisper в Linux переводит аудио и видео в текст локально и без интернета, причём русский распознаётся хорошо уже на моделях medium и turbo. Проще всего начать с pip install openai-whisper при видеокарте NVIDIA, а на процессоре или видеокартах AMD быстрее работает whisper.cpp, который сразу выдаёт субтитры SRT.

Распознавание речи в Linux: Whisper и whisper.cpp для аудио, видео и субтитров
Фото: Panos Sakalakis, CC BY 2.0, Wikimedia Commons
Содержание
  1. Какой вариант
  2. Модели
  3. openai-whisper
  4. whisper.cpp
  5. Субтитры к видео
  6. Перевод
  7. Качество русского
  8. С микрофона
  9. Ошибки
  10. Частые вопросы

Три способа запустить Whisper в Linux

Whisper - открытая модель распознавания речи от OpenAI. Она понимает почти сотню языков, включая русский, сама ставит знаки препинания и выдаёт текст с таймкодами, из которого получаются субтитры. Всё работает локально, без интернета и без отправки записей на чужие серверы. В Linux её запускают тремя способами:

  • openai-whisper - оригинальный пакет на Python и PyTorch. Ставится через pip, хорошо работает на видеокартах NVIDIA, на процессоре медленный.
  • whisper.cpp - переписанная на C/C++ реализация от авторов llama.cpp. Быстро работает на процессоре, ускоряется через CUDA и Vulkan (то есть и на AMD, и на Intel), требует меньше памяти.
  • faster-whisper - библиотека на движке CTranslate2. Те же модели, но заметно быстрее оригинала и с квантованием int8. Удобна, если вы пишете свой скрипт на Python.

Если нужен графический интерфейс, посмотрите Speech Note на Flathub: внутри те же движки whisper.cpp и faster-whisper, а модели скачиваются кнопкой. Для пакетной обработки файлов и субтитров удобнее командная строка, о ней дальше.

Какую модель выбрать и сколько нужно памяти

Модели отличаются размером. Чем больше модель, тем точнее текст, особенно на русском, и тем медленнее работа. Данные из README проектов:

МодельПараметрыVRAM для openai-whisperФайл ggml для whisper.cppСкорость относительно large
tiny39 млноколо 1 ГБ75 МБоколо 10x
base74 млноколо 1 ГБ142 МБоколо 7x
small244 млноколо 2 ГБ466 МБоколо 4x
medium769 млноколо 5 ГБ1,5 ГБоколо 2x
large (v3)1550 млноколо 10 ГБ2,9 ГБ1x
turbo (large-v3-turbo)809 млноколо 6 ГБоколо 1,6 ГБоколо 8x

Для русского языка tiny и base годятся только для черновой расшифровки: много ошибок в окончаниях и именах. Нормальный результат начинается с small, хороший даёт medium, лучший - large-v3. Модель turbo почти не уступает large по точности и работает в разы быстрее, поэтому для большинства задач это выбор по умолчанию. Модели с суффиксом .en понимают только английский, для русского они не подходят.

Установка openai-whisper через pip

Понадобится ffmpeg для чтения аудио и видео. В Fedora полный ffmpeg ставится из RPM Fusion, а в основном репозитории есть урезанный ffmpeg-free, которого для Whisper обычно хватает.

# Debian, Ubuntu
sudo apt install ffmpeg python3-venv
# Fedora
sudo dnf install ffmpeg-free python3
# Arch Linux
sudo pacman -S ffmpeg python

Современные дистрибутивы не дают ставить пакеты pip в системный Python, поэтому создайте виртуальное окружение:

python3 -m venv ~/whisper-env
source ~/whisper-env/bin/activate
pip install -U openai-whisper

Вместе с Whisper скачается PyTorch с поддержкой CUDA, это пара гигабайт. Проверьте, видит ли он видеокарту:

python -c "import torch; print(torch.cuda.is_available())"

Если выводится False, проверьте драйвер командой nvidia-smi и настройку CUDA по статье об установке CUDA в Ubuntu. Расшифровка лекции в субтитры:

whisper lecture.mp3 --model turbo --language Russian --output_format srt --output_dir subs

Форматы на выходе: txt, srt, vtt, tsv, json или all. При первом запуске модель скачивается в ~/.cache/whisper. Без видеокарты добавьте --device cpu, но для процессора лучше подходит whisper.cpp.

Сборка whisper.cpp с CUDA или Vulkan

whisper.cpp собирается из исходников за пару минут, полный список ключей сборки есть в README проекта. Поставьте компилятор, CMake и git:

# Debian, Ubuntu
sudo apt install build-essential cmake git ffmpeg
# Fedora
sudo dnf install gcc-c++ cmake git ffmpeg-free
# Arch Linux
sudo pacman -S base-devel cmake git ffmpeg

Клонируйте репозиторий и соберите вариант под своё железо:

git clone https://github.com/ggml-org/whisper.cpp.git
cd whisper.cpp
# только процессор
cmake -B build
# или NVIDIA, нужен CUDA Toolkit
cmake -B build -DGGML_CUDA=1
# или AMD и Intel через Vulkan, нужны заголовки Vulkan и glslc
cmake -B build -DGGML_VULKAN=1
cmake --build build -j --config Release

Скачайте модель скриптом из репозитория и проверьте на примере:

sh ./models/download-ggml-model.sh large-v3-turbo
./build/bin/whisper-cli -m models/ggml-large-v3-turbo.bin -f samples/jfk.wav

Программа читает только WAV 16 кГц, моно, 16 бит. Остальные форматы сначала конвертируйте через ffmpeg, затем запускайте распознавание с русским языком и выводом в SRT:

ffmpeg -i interview.mp3 -ar 16000 -ac 1 -c:a pcm_s16le interview.wav
./build/bin/whisper-cli -m models/ggml-large-v3-turbo.bin -f interview.wav -l ru -osrt -otxt -of interview -t 8

Ключ -of задаёт имя файлов без расширения, -t - число потоков процессора. Если памяти мало, модель можно квантовать: качество падает незначительно, файл уменьшается в 2-3 раза.

./build/bin/quantize models/ggml-large-v3-turbo.bin models/ggml-large-v3-turbo-q5_0.bin q5_0

Субтитры к видео: от записи до готового файла

Видео целиком распознавать не нужно, достаточно вытащить звуковую дорожку:

ffmpeg -i video.mp4 -vn -ar 16000 -ac 1 -c:a pcm_s16le video.wav
./build/bin/whisper-cli -m models/ggml-large-v3-turbo.bin -f video.wav -l ru -osrt -of video

Получится video.srt. Плееры mpv и VLC подхватывают субтитры автоматически, если имя файла совпадает с видео. Чтобы вшить их дорожкой в контейнер без перекодирования:

# MP4
ffmpeg -i video.mp4 -i video.srt -c copy -c:s mov_text -metadata:s:s:0 language=rus video-sub.mp4
# MKV
ffmpeg -i video.mp4 -i video.srt -c copy -c:s srt video-sub.mkv

Для соцсетей, где отдельные дорожки не поддерживаются, субтитры впечатывают в картинку. Это уже перекодирование, оно занимает время:

ffmpeg -i video.mp4 -vf subtitles=video.srt -c:a copy video-burned.mp4

Для папки с записями пригодится простой цикл:

for f in *.mp4; do
  n="${f%.*}"
  ffmpeg -y -i "$f" -vn -ar 16000 -ac 1 -c:a pcm_s16le "$n.wav"
  ~/whisper.cpp/build/bin/whisper-cli -m ~/whisper.cpp/models/ggml-large-v3-turbo.bin -f "$n.wav" -l ru -osrt -of "$n"
  rm "$n.wav"
done

Если вы сами записываете ролики, в статье про запись экрана в OBS есть настройки, при которых звук получается чище, а значит, и расшифровка точнее.

Перевод речи на другой язык

Whisper умеет переводить только в одну сторону: с любого языка на английский. В openai-whisper это --task translate, в whisper.cpp ключ -tr:

whisper talk.mp3 --model medium --language Russian --task translate --output_format srt
./build/bin/whisper-cli -m models/ggml-medium.bin -f talk.wav -l ru -tr -osrt

Модель turbo обучена без задачи перевода и вернёт текст на исходном языке, даже если попросить перевод. Для перевода берите medium или large.

Английское видео в русские субтитры за один шаг не превратить. Рабочая схема: сначала расшифровать в SRT на языке оригинала, затем перевести текст локальной языковой моделью, например через Ollama, попросив сохранить нумерацию и таймкоды без изменений.

Как улучшить распознавание русской речи

  • Указывайте язык явно. Автоопределение по первым 30 секундам иногда ошибается на записях с английскими терминами и выдаёт транслит.
  • Подсказка с терминами. В openai-whisper есть --initial_prompt, в whisper.cpp --prompt. Фраза с именами, названиями и аббревиатурами из записи помогает модели писать их правильно и задаёт стиль пунктуации.
  • Чистый звук. Шум и эхо дают больше ошибок, чем размер модели. Простая очистка и выравнивание громкости в ffmpeg: ffmpeg -i in.wav -af "afftdn,loudnorm" clean.wav.
  • Тишина и музыка. На длинных паузах Whisper склонен выдумывать повторяющиеся фразы. Помогает вырезание тишины, а в свежих версиях whisper.cpp есть встроенный детектор речи (VAD) с отдельной моделью.
  • Кто говорит. Разделения по спикерам в Whisper нет. Для интервью и совещаний используют надстройки вроде WhisperX с диаризацией.

Перед обработкой часов записи прогоните двухминутный фрагмент на моделях small, medium и turbo и сравните тексты. На чистом звуке разница бывает минимальной, и тогда нет смысла ждать лишний час.

Распознавание с микрофона и faster-whisper в скрипте

Записать голос в нужном формате можно стандартной утилитой PipeWire, остановка по Ctrl+C:

pw-record --rate 16000 --channels 1 --format s16 note.wav

Если микрофон молчит, разберитесь со звуковой подсистемой по статье о проблемах со звуком в PipeWire. Для распознавания в реальном времени в whisper.cpp есть программа whisper-stream, она собирается с библиотекой SDL2 (ключ -DWHISPER_SDL2=ON).

Для своих скриптов удобна faster-whisper. Ставится в то же окружение командой pip install faster-whisper:

from faster_whisper import WhisperModel
model = WhisperModel("large-v3", device="cuda", compute_type="float16")
segments, info = model.transcribe("note.wav", language="ru", beam_size=5)
for s in segments:
    print(f"[{s.start:.1f} - {s.end:.1f}] {s.text}")

Без видеокарты укажите device="cpu" и compute_type="int8".

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

  • CUDA out of memory. Модель не влезла в видеопамять. Возьмите модель меньше или квантованную версию для whisper.cpp.
  • whisper: command not found. Не активировано виртуальное окружение: source ~/whisper-env/bin/activate.
  • FileNotFoundError про ffmpeg. Не установлен ffmpeg или его нет в PATH.
  • whisper.cpp не использует видеокарту. Сборка прошла без CUDA или Vulkan. Удалите папку build и пересоберите с нужным ключом. При запуске в выводе должна быть строка об инициализации CUDA или Vulkan.
  • Текст повторяется по кругу. Это галлюцинации на тишине или музыке, смотрите советы про VAD выше.

Частые вопросы

Работает ли Whisper без интернета?

Да. Интернет нужен один раз, чтобы скачать программу и модель. Дальше распознавание идёт полностью на вашем компьютере.

Какая модель Whisper лучше для русского языка?

Лучшая точность у large-v3, почти такая же у turbo при большей скорости. Минимально приемлемая для русского - small.

Можно ли запустить Whisper без видеокарты?

Можно. Для процессора лучше подходит whisper.cpp или faster-whisper с int8: модель small или turbo расшифровывает час записи за разумное время на современном многоядерном процессоре.

Как сделать субтитры из видео?

Извлеките звук через ffmpeg в WAV 16 кГц, запустите whisper-cli с ключами -l ru -osrt и получите файл .srt. Его можно положить рядом с видео или вшить дорожкой через ffmpeg.

Может ли Whisper перевести английское видео на русский?

Нет, встроенный перевод работает только на английский. Сначала получите субтитры на языке оригинала, затем переведите текст языковой моделью.

Документация и источники

Читайте также

Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.