Антон Малявский Антон Малявский

Локальная транскрипция подкаста через whisper.cpp

4 марта 2026 г.

Что это?  Ссылка на этот раздел

Локальный инструмент для транскрипции диктофонных записей через whisper.cpp. Устанавливается на MacOS через Homebrew и добавляется как команда voice в ~/bin.

Идея простая: в терминале набираю voice и путь к одному или нескольким аудиофайлам, нажимаю Enter, и рядом с каждым исходным файлом появляется готовый *.srt. Это отдельный инструмент для голосовых заметок, диктофонных файлов и длинных аудиозаписей, где важна более быстрая обработка, чем в сценарии с подкастом.

Требования  Ссылка на этот раздел

  • MacOS с Homebrew
  • FFmpeg
  • whisper.cpp (через brew)
  • Мультиязычная модель Whisper для whisper.cpp (в этом варианте: medium)

Установка  Ссылка на этот раздел

Установить FFmpeg и whisper.cpp:

BASH
1brew install ffmpeg whisper-cpp

Проверить, что ffmpeg доступен:

BASH
1ffmpeg -version

Проверить, что whisper CLI доступен:

BASH
1command -v whisper-cli || command -v whisper-cpp || command -v whisper

Модель: Whisper medium  Ссылка на этот раздел

Для диктофонных заметок используется отдельная мультиязычная модель ggml-medium.bin. Она легче, чем large-v3, и лучше подходит для более быстрого повседневного распознавания длинных записей.

Создать папку и скачать модель:

BASH
1mkdir -p ~/models/whisper
2cd ~/models/whisper
3curl -L -o ggml-medium.bin https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-medium.bin

Проверить, что файл на месте:

BASH
1ls -lh ~/models/whisper/ggml-medium.bin

Настройка: команда voice в ~/bin  Ссылка на этот раздел

Папка ~/bin  Ссылка на этот раздел

Создай папку для личных команд, если её ещё нет:

BASH
1mkdir -p ~/bin

Скрипт ~/bin/voice  Ссылка на этот раздел

Создай файл:

BASH
1nano ~/bin/voice

Вставь код:

ZSH
 1#!/usr/bin/env zsh
 2set -u
 3set -o pipefail
 4
 5MODEL="${MODEL:-$HOME/models/whisper/ggml-medium.bin}"
 6LANG_ASR="${LANG_ASR:-ru}"
 7
 8# Находим CLI whisper.cpp
 9if command -v whisper-cli >/dev/null 2>&1; then
10  WHISPER_BIN="whisper-cli"
11elif command -v whisper-cpp >/dev/null 2>&1; then
12  WHISPER_BIN="whisper-cpp"
13elif command -v whisper >/dev/null 2>&1; then
14  WHISPER_BIN="whisper"
15else
16  echo "Не найден whisper CLI. Установи: brew install whisper-cpp" >&2
17  exit 1
18fi
19
20command -v ffmpeg >/dev/null 2>&1 || {
21  echo "Не найден ffmpeg. Установи: brew install ffmpeg" >&2
22  exit 1
23}
24
25[[ -f "$MODEL" ]] || {
26  echo "Не найдена модель: $MODEL" >&2
27  exit 1
28}
29
30cmd_name="$(basename "$0")"
31
32if [[ $# -lt 1 ]]; then
33  echo "Использование: ${cmd_name} <файл1> [файл2] [файл3] ..." >&2
34  exit 1
35fi
36
37TMPROOT="$(mktemp -d)"
38cleanup() {
39  rm -rf "$TMPROOT"
40}
41trap cleanup EXIT
42
43failed=0
44processed=0
45
46for raw_input in "$@"; do
47  input="${raw_input#file://}"
48
49  if [[ ! -f "$input" ]]; then
50    echo "Пропускаю: не файл: $raw_input" >&2
51    failed=1
52    continue
53  fi
54
55  outdir="$(cd "$(dirname "$input")" && pwd)"
56  base="$(basename "$input")"
57  outbase="$outdir/${base%.*}"
58
59  wavtmp="$TMPROOT/input_${processed}.wav"
60
61  echo "→ Обрабатываю: $input"
62
63  if ! ffmpeg -hide_banner -loglevel error -y -i "$input" -ar 16000 -ac 1 -c:a pcm_s16le "$wavtmp"; then
64    echo "  Ошибка ffmpeg: $input" >&2
65    failed=1
66    continue
67  fi
68
69  if ! "$WHISPER_BIN" -m "$MODEL" -f "$wavtmp" -l "$LANG_ASR" -osrt -of "$outbase"; then
70    echo "  Ошибка whisper: $input" >&2
71    failed=1
72    continue
73  fi
74
75  echo "  Готово: ${outbase}.srt"
76  processed=$((processed + 1))
77done
78
79echo
80echo "Обработано файлов: $processed"
81
82if [[ "$failed" -ne 0 ]]; then
83  echo "Часть файлов не обработалась." >&2
84  exit 1
85fi

Сделай файл исполняемым:

BASH
1chmod +x ~/bin/voice

PATH: чтобы voice работала без полного пути  Ссылка на этот раздел

Если ~/bin ещё не добавлен в PATH, открой ~/.zshrc:

BASH
1nano ~/.zshrc

Добавь в конец:

BASH
1export PATH="$HOME/bin:$PATH"

Применить изменения:

BASH
1source ~/.zshrc
2hash -r

Проверить, что команда доступна:

BASH
1type voice

Использование  Ссылка на этот раздел

Один файл  Ссылка на этот раздел

BASH
1voice /путь/к/заметке.wav

Результат: рядом появится заметке.srt.

Несколько файлов сразу  Ссылка на этот раздел

BASH
1voice /путь/к/1.wav /путь/к/2.m4a /путь/к/3.mp3

Результат: рядом с каждым исходным файлом появится соответствующий *.srt.

Поддерживаются любые форматы, которые открывает FFmpeg: mp3, wav, m4a, flac и т.д.

Язык распознавания  Ссылка на этот раздел

По умолчанию используется ru. Переопределение через переменную окружения:

BASH
1LANG_ASR=en voice /путь/к/файлу.wav

Временная подмена модели  Ссылка на этот раздел

Если нужно проверить этот же инструмент на другой модели, можно временно переопределить переменную MODEL:

BASH
1MODEL="$HOME/models/whisper/ggml-large-v3.bin" voice /путь/к/файлу.wav

Примечания  Ссылка на этот раздел

  • voice сохраняет только srt, без txt и vtt. Это отдельный инструмент именно под диктофонные заметки.
  • Скрипт принимает один файл или сразу пачку файлов.
  • Для каждого файла результат создаётся рядом с исходником и сохраняет то же базовое имя.
  • Используется модель medium, потому что она легче и быстрее, чем large-v3, но при этом остаётся достаточно качественной для русского языка.
  • Скрипт всегда делает временный WAV 16 kHz mono. Это повышает стабильность обработки.
  • Если исходный файл уже WAV, это не гарантирует лучший результат само по себе, но если это исходный несжатый мастер, а не перекодированный MP3, качество распознавания может быть чуть лучше.
  • Если на длинной записи появляются повторы одной и той же фразы, это может быть особенностью самого Whisper на конкретном участке аудио, особенно на паузах, тишине или слабом сигнале.

Диагностика  Ссылка на этот раздел

  • «Не найден whisper CLI»: проверь brew install whisper-cpp и command -v whisper-cli.
  • «Не найден ffmpeg»: проверь brew install ffmpeg.
  • «Не найдена модель»: проверь путь ~/models/whisper/ggml-medium.bin.
  • «Команда не находится»: проверь PATH в ~/.zshrc, затем выполни source ~/.zshrc и hash -r.
  • Если часть файлов не обработалась, скрипт всё равно попытается закончить обработку остальных и в конце сообщит, что были ошибки.
  • Если распознавание идёт не на том языке, явно задай LANG_ASR=ru.

См. также  Ссылка на этот раздел

Есть что сказать? Напишите мне!
Комментировать по почте
Понравилось? Подпишитесь на меня!
RSS Телеграм