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

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

21 марта 2026 г.

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

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

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

Идея простая: в терминале набираю dicta и путь к одному или нескольким аудиофайлам, нажимаю 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

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

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

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

BASH
1mkdir -p ~/bin

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

Создай файл:

BASH
1nano ~/bin/dicta

Вставь код:

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/dicta

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

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

BASH
1nano ~/.zshrc

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

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

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

BASH
1source ~/.zshrc
2hash -r

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

BASH
1type dicta

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • dicta сохраняет только 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 Телеграм