Лекция, доклад, интервью, запись созвона — из всего этого часто нужно вытащить текст. Сервисов для этого много, но они либо платные, либо льют ваше видео непонятно куда (а с интервью это критично), либо плохо понимают русский.
Есть вариант лучше: транскрибировать локально, прямо на своём Маке. Бесплатно, приватно, с качеством на уровне платных сервисов. На Apple Silicon это работает быстро — распознавание идёт на GPU.
В этом гайде — весь путь от начала до конца: один раз настраиваем компьютер, собираем скрипт, который делает всю работу за один запуск, и разбираем, как превратить сырую расшифровку в готовый материал — конспект, тезисы, черновик статьи.
Гайд проверен на живой системе, со всеми граблями — они тоже здесь.
Один практический момент: вся работа идёт через терминал — встроенное приложение Terminal.app, ищется через Spotlight по слову «терминал». Его полностью достаточно; про более продвинутые терминалы — в конце гайда. Если регулярно с командной строкой не сталкиваетесь, ничего страшного: команды ниже достаточно копировать и выполнять по очереди. Я веду по шагам.
Часть 1. Готовим среду
Это разовая настройка. Один раз проходим — дальше Mac готов транскрибировать что угодно.
Инструменты разработчика
Нужны для сборки остальных программ. Проверяем, стоят ли:
xcode-select -p
Если в ответ — путь к папке, всё на месте. Если «command not found» или «not installed»:
xcode-select --install
Откроется окно установки, соглашаемся и ждём.
Homebrew — менеджер пакетов
Через него ставится всё остальное одной строкой. Проверяем:
brew --version
Если версия не показывается — устанавливаем. Команду берём с официального сайта brew.sh, она там всегда актуальная. На сегодня это:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Важно: в конце установки Homebrew напечатает блок «Next steps» с двумя строчками — их обязательно нужно выполнить, иначе команда brew не заработает в новом окне. На Apple Silicon это обычно:
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofileeval "$(/opt/homebrew/bin/brew shellenv)"
Не пропускайте то, что установщик просит сделать в конце — это самое частое место, где всё «ломается».
Утилиты — одной командой
brew install cmake ffmpeg yt-dlp
Что ставим:
cmake— нужен для сборки движка транскрибацииffmpeg— конвертирует аудио в нужный форматyt-dlp— качает видео с YouTube и сотен других сайтов
whisper.cpp — движок транскрибации
Это и есть программа, которая превращает речь в текст. Собираем её с поддержкой Metal — тогда задействуется GPU и всё работает быстро.
cd ~git clone https://github.com/ggml-org/whisper.cppcd whisper.cppcmake -B build -DGGML_METAL=ONcmake --build build -j --config Release
Сборка занимает пару минут — это нормально, ждём приглашение строки.
Модель распознавания
Сам движок без модели не работает — модель это «мозг», который понимает речь.
sh ./models/download-ggml-model.sh large-v3
large-v3 — самая точная, отлично понимает русский. Весит около 3 ГБ, качается не моментально. Если нужно легче и быстрее ценой точности — вместо large-v3 можно поставить medium или small.
VAD‑модель — против сбоев на музыке и тишине
Whisper обучен на речи и считает, что речь есть всегда. На музыкальной заставке в начале доклада или на длинной паузе он начинает сбоить: то выдумывает фразы из шума, то зацикливается и повторяет одну строку.
Лечится это VAD‑моделью (Voice Activity Detection) — она заранее размечает, где в аудио речь, а где нет, и движок просто не лезет в пустые участки. Модель маленькая, качается быстро:
cd ~/whisper.cppsh ./models/download-vad-model.sh silero-v5.1.2
Проверка
Убедимся, что всё на месте:
ls ~/whisper.cpp/build/bin/whisper-clils ~/whisper.cpp/models/ggml-large-v3.binls ~/whisper.cpp/models/ggml-silero-v5.1.2.bin
Если все три команды показали файл, а не ошибку — Mac готов.
Важно про папку
Один грабль, на который легко наступить. Не держите рабочие файлы и скрипты в папке «Загрузки» — macOS её защищает, и терминал может выдать «Operation not permitted». Заведите отдельную папку:
mkdir ~/scripts
Теперь она у вас лежит: Macintosh HD → Пользователи → Имя пользователя → scripts.
И всё, что связано с транскрибацией — скрипт, аудиофайлы — держите там.
Часть 2. Скрипт и запуск
Подготовка позади. Теперь — сам скрипт, который делает всю работу за один запуск. Он берёт ссылку на видео или локальный файл, вытаскивает звук, распознаёт речь и сохраняет текст в двух форматах: сплошным текстом и с таймкодами. Понимает и YouTube, и сотни других сайтов, и просто файл с диска.
Куда положить скрипт
Скрипт будет жить в папке ~/scripts, которую мы сделали. Скачайте файл и положите в эту папку. Важный момент: не оставляйте его в «Загрузках», оттуда macOS не даст его запустить. Перенесите именно в ~/scripts — через Finder проще всего, просто перетащите.
Скрипт открытый, его можно открыть в любом текстовом редакторе и посмотреть содержимое — там всё подписано. Исходник на GitHub.
Снять «карантин»
Файл, скачанный из интернета, macOS помечает как потенциально небезопасный. Снимаем эту метку:
cd ~/scriptsxattr -cr transcribe.sh
Это разовая процедура.
Запуск
Общий вид — команда из двух строк, выполнять вместе. Первая переводит терминал в папку со скриптом, вторая запускает:
cd ~/scriptsbash transcribe.sh "<ссылка-или-файл>" <язык> <имя>
Где:
ссылка-или-файл— ссылка на видео или путь к файлу на дискеязык—ru,enилиauto(определит сам)имя— как назвать итоговый файл с текстом
Пример с видео из YouTube:
cd ~/scriptsbash transcribe.sh "https://youtu.be/G2B0YWuJUgI" ru lecture
Пример с локальным файлом:
cd ~/scriptsbash transcribe.sh ~/Movies/interview.mp4 ru interview
Дальше скрипт всё сделает сам: скачает или сконвертирует аудио, прогонит через whisper.cpp и покажет прогресс. На часовом видео это несколько минут — окно не закрывайте, дождитесь надписи «Готово».
Результат
Готовые файлы появятся в папке ~/scripts/transcripts:
имя.txt— сплошной текст, для чтения и дальнейшей обработкиимя.srt— текст с таймкодами, удобно возвращаться к нужному месту видео или подгрузить как субтитры
Если что‑то пошло не так
command not found: yt-dlp— не установлен yt‑dlp, вернитесь к части 1Operation not permitted— скрипт лежит в защищённой папке, перенесите его в~/scriptsскрипт ругается на путь к модели — проверьте, что модель докачалась полностью (около 3 ГБ)
whisper-cliне найден — значит whisper.cpp не собрался, повторите сборку из части 1в тексте одна фраза повторяется десятки раз подряд — whisper зациклился на трудном участке. В скрипте уже стоит защита от этого, но если попалось упрямое место — проверьте, что скачали VAD‑модель
Часть 3. Превращаем текст в пользу
Транскрипт на руках — и вот тут начинается самое ценное.
Сырой транскрипт читать тяжело: это сплошной поток речи, без структуры, плюс whisper местами путает термины и имена. В таком виде им почти не пользуешься. Нужно свернуть его в то, чем реально удобно работать — конспект, тезисы, черновик.
Это делает нейросеть. Но качество саммари целиком зависит от того, как вы попросите. «Сделай саммари этого текста» даст водянистый пересказ ни о чём. Поэтому — рабочий промпт.
Универсальный промпт
Берёте текст транскрипта, вставляете в нейросеть вместе с этим промптом:
Это автоматическая расшифровка видео, поэтому в тексте могут быть ошибки распознавания — особенно в терминах, именах и названиях. Сначала мысленно исправь очевидные ошибки, не меняя смысл.Затем сделай структурированное саммари:— в 2–3 предложениях суть: о чём это и для кого;— ключевые тезисы и идеи, сгруппированные по смысловым блокам;— конкретику, если она есть: факты, цифры, выводы, рекомендации.Пиши по существу, без воды и общих фраз. Если о чём-то в тексте сказано вскользь и неясно — так и помечай, не додумывай за автора.
Этот промпт закрывает большинство задач. Но если понять, как он устроен, его легко затачивать под себя.
Почему он работает
В нём четыре вещи, и каждая делает свою работу.
Первое — предупреждение про ошибки распознавания. Нейросеть не знает, что текст пришёл из транскрибации. Скажешь ей об этом — и она аккуратно поправит «Карпатий» на «Карпати», а не потащит ошибку в саммари.
Второе — заданная структура. «Сделай саммари» оставляет формат на усмотрение модели, и она выберет самый безопасный — обтекаемый пересказ. Когда вы прописываете блоки (суть / тезисы / конкретика), вы получаете то, чем можно пользоваться.
Третье — «без воды». Модели по умолчанию склонны к обтекаемым формулировкам. Прямой запрет на это заметно поднимает плотность текста.
Четвёртое — «не додумывай». Важный предохранитель: без него нейросеть дорисовывает то, чего в видео не было, и саммари перестаёт быть надёжным.
Принцип простой: вы не просите «саммари вообще», вы говорите, что именно хотите получить и в каком виде. Дальше под свои задачи меняется только описание желаемого результата.
Вариации под задачи
Под конспект лекции. К универсальному промпту добавьте: «Сделай подробный конспект по разделам, сохрани логику и последовательность изложения. К каждому разделу — главную мысль одной фразой».
Под рабочий созвон. «Извлеки из расшифровки только: принятые решения, договорённости, задачи — кто что делает и к какому сроку. Остальное обсуждение опусти».
Под черновик статьи или поста. «На основе расшифровки набросай структуру статьи: рабочий заголовок, 4–6 смысловых блоков, к каждому — тезис и опорные факты из текста. Это черновик для дальнейшей доработки, не финальный текст».
Под быструю выжимку. «Сделай короткое саммари: 5–7 пунктов, только самое важное. Без подробностей — чтобы за минуту понять, стоит ли смотреть видео целиком».
Почему транскрипт — это.txt
Маленькое отступление, которое часто вызывает вопрос. Скрипт сохраняет расшифровку в .txt — обычный текст, без всякого форматирования. И это не недоработка: whisper в принципе не умеет отдавать Markdown.
Так и должно быть. Транскрибация — это распознавание речи, на выходе просто слова. А заголовки, списки, выделения — это уже разметка, осмысление текста. В речи их взять неоткуда: расшифровка честно отдаёт то, что было сказано.
Markdown появляется на следующем шаге. Саммари, конспект, структура статьи — это уже осмысленный текст, и вот его логично получить сразу размеченным. Достаточно добавить в промпт строчку вроде «оформи результат в Markdown» — и нейросеть вернёт текст с заголовками и списками. Особенно удобно, если вы держите всё в Obsidian: такое саммари просто кладётся в базу знаний и сразу выглядит как нормальная заметка.
То есть полная цепочка честнее выглядит так: видео → .txt (сырьё) → .md (отформатированный материал).
Про терминалы — если захотите больше
Штатного «Терминала» для всего выше достаточно. Но если втянетесь в работу с командной строкой, есть варианты поудобнее:
-
iTerm2 — классический сторонний терминал, много настроек, удобный поиск и сплит‑панели.
brew install --cask iterm2 -
Ghostty — новый, очень быстрый, рендеринг через GPU.
brew install --cask ghostty cmux — самый продвинутый вариант, построен на движке Ghostty. Заточен под работу с AI‑агентами (Claude Code и другими): вертикальные вкладки, уведомления когда агент ждёт ответа. Если плотно работаете с агентами — стоит посмотреть. cmux.com
Это уже на вырост — для самой транскрибации ничего из этого не обязательно.
Итог
Полный цикл собран: видео → текст (локально, бесплатно, приватно) → готовый материал.
Лекцию на час можно за несколько минут превратить в конспект. Часовой созвон — в список задач. Чужой доклад — в черновик собственной статьи.
Ускоряемся и не страдаем!
Пишу про практики работы с AI в Telegram‑канале «Я и мой друг робот» — про мульти‑агентные системы, визуализацию данных и реальные автоматизации: https://t.me/mewithrobot
Ninil
Ну или есть готовые приложения - например это https://ninilich.github.io/boring-meeting/ - нажал пару кнопок в UI и готово. Добавление загрузки внешних видео и получение саммари из коробки - в планах развития приложения.
VitTurov Автор
Да, я согласен: если задача стоит "записать встречу и получить транскрипт без танцев с бубном", то приложение с понятным UI часто лучше, чем сборка пайплайна из консольных утилит.
Мой гайд скорее для тех, кому хочется заглянуть под капот и собрать всё руками — там и про универсальность (любое видео, не только встречи), и про возможность вмешаться в логику (флаги Whisper, VAD-модель против зацикливания, свои промпты для саммари). Это не «лучше», это для другого настроения и другой задачи.
BoringMeeting посмотрел, классно! Понравился подход "полностью локально, без облака»"и явное разделение микрофона и системного звука, сам мучался давно когда пытался скринкастом с корпоративных звонилок записывать. Удачи с развитием!
Ninil
Спасибо! Пользуйтесь на здоровье) Писал для себя, но потом решил выложить для всех. В планах:
локальное саммари
загрузка внешних файлов для транскрибации
полировка и улучшения UI/UX
Shaman_RSHU
Во время встречи захотел поменять микрофон или гарнитура села и звук перешел на встроенный динамики. Приложение где-то там внизу прыгает, что ошибка, но ты же не можешь отвлекаться, в ВКС участвуешь.
А потом через пару часов встречи у тебя оказывается нет результатов.
Ninil
Есть такое. Причём приложение открыто об этом предупреждает – см предупреждения под кнопкой записи. Это связано с тем, что меняется конфигурация Audio и надо менять устройство для захвата. Этот Функционал пока не реализован. Ситуация известная, находится в бэклоге. Но, буду честен, с достаточно низким приоритетом. Продукт некоммерческий, развивается по мере силы возможностей.