Транскрибация аудио в текст бесплатно и без облаков: почему мне не хватило одной модели


Я провожу существенную часть рабочего дня на встречах и обсуждениях. Когда родился ребёнок и начались бессонные ночи, я стал упускать детали. Какой срок назвали? Кто обещал вернуться с ответом? О чём мы в итоге договорились?
Так началась история Рекордера. Сначала я собирался купить готовое приложение. Потом стал сравнивать Whisper, Parakeet и GigaAM. В итоге проверил 32 конфигурации распознавания и собрал каскад из двух моделей: одна даёт основу текста, другая исправляет неточности. На моих датасетах это исправило каждую пятую ошибку (WER упал с 27,0% до 21,7%).
Из экспериментов получилось бесплатное приложение для Mac, которое записывает встречи и переводит аудио и видео в текст локально. Расскажу, как выбирал модели, что измерял и какие очевидные решения не сработали. В статье есть промт для агента, чтобы собрать все самому.
Почему я искал только локальную транскрибацию
Стандартное решение: набрать в поиске «транскрибация встречи» и выбрать сервис. Проблем с количеством вариантов нет. Проблема в том, чтобы понять, чем они отличаются.
Я сразу ограничил поиск локальными приложениями. На моих встречах обсуждают бюджеты, кадровые решения, условия договоров и внутренние проблемы компаний. Не каждую встречу C-level можно отправить во внешний сервис.
Знаю, что многие отдают такие записи Claude или ChatGPT. Но мне некомфортно передавать туда и сами разговоры и голоса участников. Поэтому, требование было простым: аудио и расшифровка должны оставаться только на моем ноутбуке.
Кажется, что все приложения устроены одинаково: взяли открытую модель, добавили интерфейс и предложили подписку. Есть несколько доп. фичей: запись звука, разделение участников, работа с длинными файлами. До этого я ещё дойду.
Список знакомых моделей внутри разных программ действительно повторяется. Whisper используют MacWhisper, Buzz и SuperWhisper. Handy поддерживает не только Whisper, но и Parakeet.
Вообще, я собирался просто купить SuperWhisper Pro. Помню цену около 85 долларов за год, но оплата не прошла. Возможно, если бы покупка удалась, на этом я бы и успокоился. А так, пришлось разбираться что к чему.
Начал с Whisper, это база. Он выдавал понятный текст, но заметно ошибался на моих русскоязычных встречах и работал медленно. Для некоторых задач такого качества достаточно. Мне хотелось лучше.
Что есть на Хабре
Задачу локального распознавания здесь решали не раз. Мне пригодились статьи:
Whisper без облака: локальное распознавание чувствительных записей.
Я ошибался: бенчмарк 23 ASR-нейросетей для русской айтишной диктовки.
Как я собрал полностью локальную диктовку: GigaAM, Whisper, Qwen и Apple.
После чтения Хабра и Deep Research с Claude, Gemini и ChatGPT основными кандидатами для меня стали Whisper в версиях large-v2, large-v3 и turbo, Parakeet TDT v3 и GigaAM-v3. Позже, для чистоты эксперимента, добавил Breeze-ASR, Qwen3-ASR и другие модели.
Само подключение модели оказалось самой простой частью. Прототип, который принимает файл и возвращает текст, делают даже локальные агенты. Но рабочий прототип не отвечает на главный вопрос: какую модель выбрать и почему?
На него пришлось отвечать самому и это заняло существенно больше времени чем код.
Сначала я выбирал модель на глаз
Я прогонял записи своих встреч и читал расшифровки. Пришлось навайбкодить diff-инструмент, чтобы удобнее сравнивать тексты. Первые впечатления были такими:
GigaAM хорошо слышит обычную русскую речь. Мне нравится пунктуация. Но на терминах, названиях продуктов и ИТ-сленге начинались проблемы. Текст выглядел связным, а понять суть разговора не всегда было возможно.
Parakeet существенно лучше слышал термины и англоязычный сленг. Итоговый текст выглядел хуже, модель мультиязычная и не заточена под русский язык как GigaAM, но по его тексту почти всегда можно было восстановить смысл.
Обе модели работали быстро.
Whisper показался очень внимательным к некоторым деталям. Иногда он сохранял то, что пропускал Parakeet и GigaAM. Но работал медленнее, а в некоторых местах дописывал фразы, которых на записи не было. Разброс по качеству у него был большой. Результат не выглядел стабильным, но иногда он поражал.
Это были впечатления от анализа моих расшифровок (архив из 36 часов встреч).
На тот момент я выбрал Parakeet. Для моих записей он выглядел разумным компромиссом между скоростью, точностью и сохранением терминов.
Какое-то время меня это устраивало. Потом захотелось улучшить качество, и стало понятно: дальше без измерений я буду просто выбирать текст, который больше нравится. Нужны метрики!
Как я собирал данные для сравнения ASR

Самой долгой частью оказалась разметка. Запустить модель легко. Проверить, что именно она пропустила, заменила или придумала, гораздо дольше.
Я собрал четыре набора.
Набор | Что записано | Длительность | Слова / термины |
|---|---|---|---|
Бизнес-встречи | Выбрал 82 фрагмента рабочих встреч, где модели расходятся сильнее всего. И добавил столько же случайных фрагментов. | Около 24 минут | 1 870 / ~5% |
ИТ-речь | Специально подготовленный текст с плотными ИТ-терминами | Около 24 минут | 1 679 / ~41% |
Кормушка | Рассказ про умную кормушку для кота, прочитанный двумя голосами. Что-то среднее между первыми двумя датасетами. Аналог текста из статьи @egorsokolov | Около 24 минут | 2 391 / ~14% |
Синтетика | 200 фраз с терминами с Хабра, озвученных Silero TTS. Посмотреть насколько этот метод показывает реальность | Около 26 минут | 2 831 / ~14% |
Получилось около 1 часа 38 минут звука с эталонным текстом и 8,7 тысячи слов. Отдельно был архив из 185 записей общей длительностью 36 часов на котором я смотрел результат после проверки гипотез на размеченной выборке. Полного эталона у него нет и нет полной разметки для подсчета WER. В архиве примерно 230 000 слов.
У набора встреч есть важная особенность: я отбирал трудные места. В 40 фрагментах модель была не уверена в результате, ещё в 42 текст выглядел странно для LLM. После чего добавил туда 82 случайных фрагмента для баланса.
Синтетику проверял отдельно. Хотел проверить, можно ли озвучивать тесты с нужными терминами и насколько этот метод подойдет для анализа.
Как считал ошибки и скорость
Основной показатель WER, считает замены, пропуски и лишние слова относительно эталона. Чем ниже значение, тем лучше. Перед сравнением я приводил текст к нижнему регистру, заменял «ё» на «е» и убирал пунктуацию. «Клод» вместо Claude считался ошибкой. Пунктуацию эта проверка вообще не оценивала.
Звук подавался кусками до 20 секунд, с разрезами по паузам. Для Whisper использовал Silero VAD, чтобы отделять речь от тишины. Замеры проводил на Intel Core i9 без ускорения на видеокарте.
Whisper, GigaAM и Parakeet на русской речи
В основной таблице оставил модели, по которым хорошо видна разница. Всего в подробном сравнении было 32 конфигурации, включая разные квантования, промпты и способы запуска.
Модель | Встречи, WER | IT-речь, WER | Кормушка, WER | Всего, WER |
|---|---|---|---|---|
GigaAM-v3 e2e | 14,8% | 52,9% | 16,3% | 27,0% |
Parakeet TDT 0.6B v3 | 24,6% | 40,0% | 13,9% | 24,6% |
Whisper large-v2 | 30,1% | 39,0% | 11,5% | 24,8% |
Whisper large-v3 | 27,1% | 59,8% | 11,6% | 30,3% |
Whisper large-v3-turbo | 28,7% | 66,5% | 11,1% | 32,5% |
Whisper medium | 39,4% | 43,9% | 13,5% | 29,6% |
Breeze-ASR-25 | 35,4% | 43,4% | 9,6% | 26,7% |
Qwen3-ASR 1.7B | 30,1% | 48,6% | 14,7% | 29,0% |
NVIDIA Canary 1B v2 | 31,9% | 47,4% | 16,4% | 29,9% |
GigaAM Multilingual 600M | 21,1% | 58,4% | 22,2% | 32,9% |
Здесь Whisper запущен с явно заданным русским языком без текстового промта, Breeze с промптом. Меньшее значение WER - лучше.
Главное наблюдение: у каждой модели есть свои преимущества и недостатки.
На фрагментах встреч точнее GigaAM. На IT-речи впереди Whisper large-v2 и Parakeet. В среднем, Parakeet действительно лучше. На начитанном рассказе лучшее значение у Breeze, что совпадает с тестами @egorsokolov.
Whisper large-v2 лучше v3 только на речи с терминами, она точнее их передает. Но на встречах v3 немного точнее. Плотный поток английских терминов v3 слышит искаженно. Вероятная причина в обучении: большую часть данных для v3 разметила сама v2, и смешанная русско-английская речь от этого лучше не стала.
Breeze-ASR-25 - это Whisper large-v2, дообученный на речи, где китайский перемешан с английским. На «Кормушке» у неё лучший результат, в основном за счёт терминов. На живых встречах Breeze ошибается и хуже почти всех моделей.
Со сжатыми моделями картина была спокойнее. У GigaAM Q8 и F32 результаты почти совпали. У Parakeet на встречах получилось 24,6% для F32, 25,5% для Q8 и 25,7% для Q6_K. Разница небольшая, но она есть. Это я не включал в таблицу, как и разные промты, они не сильно влияют на результат.
В тестах были ещё russian whisper fine-tune модели, но все они давали на моих датасетах результаты хуже чем у исходных моделей, из таблицы тоже убраны.
Синтетика отличалась по метрикам от живой речи: у Parakeet WER 16,8%, у GigaAM 22,8%. Там были видны перекосы, поэтому, я исключил ее из рассмотрения и оценок.
Почему одного WER недостаточно
После замеров стало понятнее, почему таблица и впечатления от текста иногда расходились.
WER не знает, какое слово важно для разговора. Замена названия системы и замена слова «ну» дают по одной ошибке. Но для человека последствия разные. Без названия или термина иногда нельзя понять суть разговора.

Есть и обратная ситуация. Модель написала «эластик» вместо Elastic. Для строгого сравнения это ошибка. Для читателя, который знает продукт, смысл может сохраниться.
Я хотел отделить ошибки написания от случаев, когда модель действительно исказила слово. Поэтому добавил собственную эвристику и назвал её WER по звучанию (WERx).
Она работает с текстом, а не слушает аудио. Латиница переводится в кириллический фонетический ключ, убираются мягкие знаки, пробелы и дефисы. Например, Cloud-MD и «клауд мд» получают одинаковый ключ. Дальше сравнивается близость ключей или их согласных. При этом два обычных русских слова должны совпасть точно: «пропадал» и «пропадает» не становятся одним словом.
Это не универсальная фонетическая метрика и не оценка сохранения смысла. Она нужна для вопроса: сколько ошибок связано с тем, что похожее звучание записали иначе?
Модель | IT-речь: WER | IT-речь: WERx | Точно записанные термины |
|---|---|---|---|
GigaAM | 52,9% -> | 40,6% | 19% |
Parakeet | 40,0% -> | 30,7% | 47% |
Whisper large-v2 | 39,0% -> | 30,3% | 54% |
У GigaAM после такой нормализации показатель заметно улучшился. Часть ошибок действительно была связана с написанием. Но отставание от Parakeet осталось почти в десять процентных пунктов. Значит, одной транслитерацией проблему не исправить.
На встречах результат менялся гораздо меньше: у GigaAM с 14,8% до 14,1%, у Parakeet с 24,6% до 23,6%. Там не такая высокая плотность терминов.
Так у меня появились два разных требования. Нужна модель, которая хорошо передаёт обычный русский разговор. И нужен способ сохранять термины (англицизмы / сле́нг), на которых эта модель ошибается.
Каскад из двух моделей: GigaAM и Parakeet

Мне нравился русский текст GigaAM и то, как Parakeet справлялся с терминами (+ он 4 раза быстрее). Захотелось совместить их результаты.
Я взял расшифровку GigaAM за основу. Parakeet распознавал тот же звук независимо. Затем я выравнивал два текста, находил расхождения и проверял возможные замены.
Из Parakeet брал вариант, если он содержал латиницу и был достаточно похож по звучанию на соответствующий фрагмент GigaAM. Остальной текст оставлял без изменений.
Например, так удавалось заменить «апкид» на AppKit, «Sweeft» на Swift, «Промиус» на Prometheus. Но появлялись и ошибки: «диф» мог превратиться в div, а «клот» в Cloud вместо Claude. Похожее звучание ещё не означает правильную замену.
Главным параметром стал порог похожести. При низком пороге каскад охотнее принимал исправления, при высоком пропускал больше кандидатов.
Правило замены | IT-речь, WER | Встречи, WER |
|---|---|---|
Только GigaAM | 52,9% | 14,8% |
Латиница, похожесть от 0,3 | 41,0% | 14,5% |
Латиница, похожесть от 0,4 | 41,9% | 14,5% |
Латиница, похожесть от 0,5 | 43,4% | 14,5% |
Латиница, похожесть от 0,7 | 49,1% | 14,6% |
Похожесть от 0,5, без требования латиницы | 43,6% | 17,4% |
Без ограничения на латиницу результат на встречах ухудшался. Каскад забирал у Parakeet не только полезные термины, но и ошибки в обычных русских словах.
Для дальнейшего разбора я взял вариант с порогом 0,4. Это не универсальный оптимум, но он дает “безопасную” замену. И вот что получилось при пороге 0,4:
Вариант | Встречи, WER | IT-речь, WER | Кормушка, WER | Всего, WER |
|---|---|---|---|---|
GigaAM | 14,8% | 52,9% | 16,3% | 27,0% |
Parakeet | 24,6% | 40,0% | 13,9% | 24,6% |
GigaAM с исправлениями Parakeet | 14,5% | 41,9% | 12,0% | 21,7% |
На плотном IT-тексте каскад уступил одному Parakeet. Зато относительно GigaAM он убрал 11 процентных пунктов WER и увеличил долю точно написанных терминов с 19% до 44%.
На встречах сохранилось качество GigaAM. Разницу между 14,8% и 14,5% я бы не считал главным достижением на такой маленькой выборке. Важнее, что исправление терминов не ухудшило общий показатель. На «Кормушке», где обычный рассказ сочетался с техническими словами, каскад оказался лучше обеих моделей по отдельности.
За это пришлось заплатить вторым проходом распознавания. У каскада получился RTF около 0,3 на моём Intel. Для самого распознавания это примерно 18 минут на час аудио.
Почему основой стала GigaAM, а не Parakeet
До каскада я пользовался Parakeet. Поэтому обратный вариант тоже проверил: оставить его текст, а неуверенные слова исправлять через GigaAM. Эта схема не обогнала одну GigaAM.
Ну и дополнительный фактор: основную часть разговора составляет обычная русская речь. На ней GigaAM показывала лучший результат на моих данных. Ей и стоит доверить основу, а второй модели поручить исправления в неточностях.
Это не означает, что GigaAM должна быть основой любого распознавания. Для записи с плотным потоком английских терминов один Parakeet оказался лучше этого каскада.
Какая модель лучше исправляет GigaAM
Следующий вопрос: почему исправления должен предлагать именно Parakeet? Может, с этим лучше справится другая модель, даже если её собственная расшифровка хуже?
Я сравнил кандидатов в отдельной серии. Для всех использовал одно правило исправления, более строгое, чем в предыдущем разделе.
Модель, предлагающая исправления | Встречи, WER | IT-речь, WER | «Кормушка», WER | Всего, WER |
|---|---|---|---|---|
Нет, только GigaAM | 14,8% | 52,9% | 16,3% | 27,0% |
Parakeet | 14,8% | 42,5% | 12,1% | 22,0% |
Whisper medium | 14,4% | 41,9% | 11,3% | 21,4% |
Whisper large-v2 | 15,2% | 41,3% | 11,6% | 21,5% |
Breeze-ASR-25 с промптом | 16,7% | 43,4% | 10,2% | 22,0% |
Whisper large-v3 | 14,3% | 50,1% | 11,6% | 24,0% |
Qwen3-ASR 1.7B | 15,2% | 45,8% | 11,8% | 23,0% |
Whisper medium дал более низкий WER, чем Parakeet, на всех трёх наборах. Но работал примерно втрое медленнее. Большой Whisper large-v2 немного лучше исправлял IT-текст, зато ухудшал результат на встречах относительно одной GigaAM.
Я остановился на Parakeet, он не победил по точности, но дал хороший баланс качества и скорости: RTF Whisper medium от 0,45 до 0,68 против 0,15–0,23 у Parakeet. Large-v2 и Breeze ещё медленнее, от 0,8 до 1,7.
Заодно стало видно, что хорошая самостоятельная модель и хороший источник исправлений не обязательно одно и то же. Например, Whisper medium в основной таблице заметно проигрывал на встречах, но в роли исправляющего оказался полезен.

Что не сработало
Словарь терминов исправлял знакомые ошибки и создавал новые
Первая идея была очевидной: собрать словарь замен. Модель пишет «клот», я заменяю на Claude. Пишет «кафка», заменяю на Kafka.
Словарь, собранный по коротким IT-записям, улучшил результат на этих же записях на величину от 6 до 13 процентных пунктов. Но на длинной записи, которой не было при составлении словаря, выигрыш составил всего от 0,3 до 0,5 пункта. Исправлять уже известные ошибки оказалось проще, чем новые.
Потом я взял большой словарь из 8 130 терминов и прогнал его по архиву. «Нас» превратилось в NAS 1 246 раз, «нет» в .NET 864 раза. На IT-текстах словарь убрал 94 ошибки, а на встречах добавил 24.
Помог фильтр по частотам слов на Хабре: не делать замену, если кириллическую форму пишут не реже латинской. После очистки количество срабатываний на архиве сократилось с 3 175 до 449. Значит, проблема была не в словаре вообще, а в безусловных заменах без учёта неоднозначности.
Перекрытие аудиофрагментов не улучшило целые записи
Модели получали звук кусками до 20 секунд. У границ кусков ошибок было больше, чем в середине. Казалось логичным добавить перекрытие в две секунды, чтобы модель повторно услышала начало и конец.
На 74 коротких фрагментах WER снизился на 0,4 процентного пункта. На целых записях вырос с 30,8% до 31,3%. Улучшение на коротком тесте не выдержало проверки на длинном.
Потом выяснилось, что слова рядом с обычной паузой, где разреза не было, тоже распознаются хуже. Я связал проблему с нарезкой, хотя значительная её часть была связана с границами фраз.
Промпт улучшал один тип речи и портил другой
Я пробовал подсказывать Whisper, как записывать английские термины. У large-v3 на IT-тесте WER снизился с 59,8% до 58,1%. Зато на встречах вырос с 27,1% до 66,7%.
Подсказку нельзя оценивать только на тех примерах, ради которых её добавили. В моей задаче модель должна была справляться и с терминологией, и с остальным разговором.
Более умная метрика не улучшила каскад
Я обучил метрику, чтобы лучше различать похожие варианты GigaAM и Parakeet. Её собственный показатель AUC вырос с 0,926 до 0,941. WER каскада не улучшился.
В этой постановке даже идеальный выбор среди рассматриваемых замен мог дать на встречах лишь около 0,3 процентного пункта. Полезные и вредные замены часто были одинаково похожи по звучанию. Самой похожести не хватало, чтобы установить правильный ответ.
Попробовал учитывать и уверенность Parakeet. На встречах это убрало 0,2 пункта WER, на IT-речи добавило столько же. Для моего варианта конвейера заметного выигрыша не получилось.
Как я проверял исправления на настоящих встречах
Одного итогового процента мало. Мне нужно было видеть, какие слова меняются и почему. Дальше все пришлось проверить на архиве из 230 000 слов. На это понадобилось около 250 часов работы в фоне.
Папку с расшифровками я сделал git-репозиторием. Каждый шаг обработки сохранялся отдельным коммитом. В diff можно было посмотреть замену вместе с соседними репликами.
Так обнаруживались ошибки, которые за средним WER легко не заметить. VPN превращался в SPN. «Квик» становился Quick. «НПР1» сокращалось до NPR и теряло цифру.
Для рабочего разговора такие изменения могут быть важнее нескольких исправленных обычных слов. Особенно когда речь о названиях систем, идентификаторах и числах.
Так из экспериментов с моделями получился “Рекордер”
Рекордер использует ту же пару моделей: GigaAM даёт основу, Parakeet исправляет термины. Текст появляется сразу после первого прохода GigaAM, а исправления приходят следом, в фоне.
Рекордер записывает звук приложения и микрофон отдельно. Для системного звука используется ScreenCaptureKit. Без виртуального аудиодрайвера и ботов на встречах. Работает для звонков в Zoom, Яндекс Телемост, Google Meet, Teams и других приложений.
Две дорожки пригодились для разделения участников. На одной микрофон, на другой собеседники. Определение говорящих выполняется по дорожкам, поэтому системе не приходится с самого начала разбирать всех в одной смеси.
Итак, как перевести аудио и видео в текст бесплатно и без смс?
Скачайте Рекордер если у вас Mac со страницы приложения. Приложение принимает mp3, m4a, wav, mp4 и mov. Без ограничений длины записи. Можно расшифровать уже сохранённый звонок или перевести речь из видео в текст, не загружая файл во внешний сервис.
Текущий сценарий рассчитан на русскую речь с англицизмами. Не очень подходит для полностью англоязычных встреч.
Если у вас Windows или Linux или вы хотите самостоятельно повторить результат, то для вас есть промт, с которым это сделает ваш кодовый агент. Пишите в комментах что получилось.
Что получилось и что осталось на следующую статью
Я начинал с попытки сохранить детали рабочих встреч. В итоге больше всего времени потратил на проверку ошибок разных моделей, подбор параметров и разметку данных.
Короткий итог: GigaAM лучше справляется с обычным русским разговором, Parakeet помогает с терминами. Их каскад не стал победителем на каждом тесте. Он оказался хорошим компромиссом для встреч, где смешаны обычная речь, технические обсуждения и англицизмы.
Следующий вопрос: можно ли обобщить этот подход, выбирать основу, модели для исправлений и порядок их применения не вручную? С этим я тоже экспериментировал и нашёл хорошие цепочки каскадов. Но это отдельная история с сериями замеров.
Если статья получит отклик, то напишу продолжение.
PS: если у вас есть размеченный датасет звук -> текст и вы готовы им поделиться, то стукните в личку.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.