Локальная транскрипция подкаста через whisper.cpp
Что это?
Локальный инструмент для транскрипции диктофонных записей через whisper.cpp. Устанавливается на MacOS через Homebrew и добавляется как команда voice в ~/bin.
Идея простая: в терминале набираю voice и путь к одному или нескольким аудиофайлам, нажимаю Enter, и рядом с каждым исходным файлом появляется готовый *.srt. Это отдельный инструмент для голосовых заметок, диктофонных файлов и длинных аудиозаписей, где важна более быстрая обработка, чем в сценарии с подкастом.
Требования
- MacOS с Homebrew
- FFmpeg
whisper.cpp(через brew)- Мультиязычная модель Whisper для
whisper.cpp(в этом варианте:medium)
Установка
Установить FFmpeg и whisper.cpp:
1brew install ffmpeg whisper-cppПроверить, что ffmpeg доступен:
1ffmpeg -versionПроверить, что whisper CLI доступен:
1command -v whisper-cli || command -v whisper-cpp || command -v whisperМодель: Whisper medium
Для диктофонных заметок используется отдельная мультиязычная модель ggml-medium.bin. Она легче, чем large-v3, и лучше подходит для более быстрого повседневного распознавания длинных записей.
Создать папку и скачать модель:
1mkdir -p ~/models/whisper
2cd ~/models/whisper
3curl -L -o ggml-medium.bin https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-medium.binПроверить, что файл на месте:
1ls -lh ~/models/whisper/ggml-medium.binНастройка: команда voice в ~/bin
Папка ~/bin
Создай папку для личных команд, если её ещё нет:
1mkdir -p ~/binСкрипт ~/bin/voice
Создай файл:
1nano ~/bin/voiceВставь код:
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Сделай файл исполняемым:
1chmod +x ~/bin/voicePATH: чтобы voice работала без полного пути
Если ~/bin ещё не добавлен в PATH, открой ~/.zshrc:
1nano ~/.zshrcДобавь в конец:
1export PATH="$HOME/bin:$PATH"Применить изменения:
1source ~/.zshrc
2hash -rПроверить, что команда доступна:
1type voiceИспользование
Один файл
1voice /путь/к/заметке.wavРезультат: рядом появится заметке.srt.
Несколько файлов сразу
1voice /путь/к/1.wav /путь/к/2.m4a /путь/к/3.mp3Результат: рядом с каждым исходным файлом появится соответствующий *.srt.
Поддерживаются любые форматы, которые открывает FFmpeg: mp3, wav, m4a, flac и т.д.
Язык распознавания
По умолчанию используется ru. Переопределение через переменную окружения:
1LANG_ASR=en voice /путь/к/файлу.wavВременная подмена модели
Если нужно проверить этот же инструмент на другой модели, можно временно переопределить переменную MODEL:
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.