Мне нужен был голосовой ввод. Не встроенная в ОС диктовка, не облачный API — а простая и главное локальная штука: зажал клавишу, сказал, отпустил, текст появился в активном окне.
Готовых решений, которые бы устроили, сходу не нашёл. Сделал свое. Может, кому будет полезно.
Как устроено
Микрофон → Whisper (локально) → LLM-трансформация (опционально) → вставка в активное окно

Whisper транскрибирует. Ollama (у меня gemma3:12b) обрабатывает результат — что именно делает LLM, целиком определяется промптом. Дефолтный убирает слова-паразиты, расставляет пунктуацию, поправляет регистр. Но через кастомный промпт можно переформатировать текст в email, перевести на другой язык, привести к стилю документации — короче, как настроите. Оба шага работают локально. LLM-трансформацию можно отключить, тогда вставляется сырой текст от Whisper.
Платформы
Рассчитано на GPU. Один самодостаточный скрипт на платформу.
Платформа |
Whisper-бэкенд |
GPU |
|---|---|---|
Windows / Linux |
faster-whisper |
NVIDIA CUDA |
macOS |
mlx-whisper |
Apple Silicon (Metal) |
Два скрипта вместо одного — осознанное решение. Разным платформам нужны разные бэкенды Whisper, разные механизмы вставки, разные аудио-особенности. Каждый скрипт — самодостаточный, ~400–560 строк, читается за 10 минут. Идея в том чтобы, просмотрев один файл + список зависимостей, можно было валидировать код, который слушает ваш микрофон.
Несколько деталей, которые оказались важны
Пребуфер. Если начать запись по нажатию клавиши, первое слово часто теряется — человек начинает говорить раньше, чем палец дожимает кнопку, микрофон не сразу оживает и так далее. Поэтому микрофон пишет в кольцевой буфер постоянно (последние 0.5 секунды), и при старте записи этот буфер подклеивается в начало. Первое слово не обрезается.
Буфер обмена. Вставка текста через Ctrl+V / Cmd+V требует положить текст в буфер обмена. Но там может быть что-то важное. Поэтому есть три политики: restore (вернуть старое содержимое после вставки), clear, preserve. По умолчанию — restore.
Горячая клавиша. По умолчанию Alt (Windows/Linux) или Option (macOS). Дефолты удобны, но могут конфликтовать — стоит переназначить на что-то вроде Pause или комбинацию. У меня стоит Pause. Push-to-talk: зажал — говоришь — отпустил — текст пошёл на транскрипцию.
Скорость
На NVIDIA GPU 16GB (large-v3 + gemma3:12b) и Apple Silicon M3 16GB (large-v3-turbo + qwen2.5:14b) — результаты схожие:
Этап |
Время |
|---|---|
Whisper |
1–3 с |
LLM-трансформация |
1–3 с |
Итого |
2–6 с |
Большие пассажи подольше, но всё ещё юзабельно.
Где использую
В основном — для набора сообщений в чатах и AI-ассистентах (Cursor, ChatGPT, Slack). Фокус на текстовое поле, зажал клавишу, сказал, отпустил — текст вставился, Enter отправился. Настройка KEYS_AFTER_PASTE позволяет отправить любую клавишу после вставки (или не отправлять ничего).
Попробовать
git clone https://github.com/sancau/whisper-ptt.git cd whisper-ptt python -m venv venv source venv/bin/activate pip install -r requirements-cuda.txt # или requirements-apple-silicon.txt cp .env.example-cuda .env # или .env.example-apple-silicon python whisper_ptt_cuda.py # или whisper_ptt_apple_silicon.py
Для преобладания русского языка (в эпизодами английского) у меня в .env настроено вот так:
WHISPER_PTT_WHISPER_LANGUAGE=ru WHISPER_PTT_WHISPER_INITIAL_PROMPT=Russian speech with possible English tech terms.
Ссылки
Лицензия: MIT
Комментарии (26)

tsem13
12.03.2026 15:30Буфер обмена. Вставка текста через Ctrl+V / Cmd+V требует положить текст в буфер обмена. Но там может быть что-то важное.
Именно на виндах из коробки есть на диво полезное сочетание win+V и журнал буфера обмена. Советую.

badsynt
12.03.2026 15:30Готовых решений, которые бы устроили, сходу не нашёл.
Возможно просто и не хотели подсознательно?
https://github.com/cjpais/Handy
Press a shortcut, speak, and have your words appear in any text field.

Bratken
12.03.2026 15:30+1 за Handy. Нашелся багос, разве что, что при запущенном приложении при активном скролле мышкой (какая-нибудь logitech MX Anywhere 3 с вечным скроллом) винда начинает лагать - лечится сменой api ввода в экспериментальных настройках.
Разве что модели без впн не качаются. Из мультиязычных Parakeet V3 работает на процессоре очень хорошо. И в 0.7.10 завезли чисто русскоязычную модель. В ноуте есть ryzen 7840h. А на другом ноуте с rtx3060 и whisper large вполне гонять

WhiteBehemoth
12.03.2026 15:30А он тоже умеет "убрать слова-паразиты и "окультурить" текст?"
Мне в статье идея связки с LLM понравилась....что именно делает LLM, целиком определяется промптом. Дефолтный убирает слова-паразиты, расставляет пунктуацию, поправляет регистр. Но через кастомный промпт можно переформатировать текст в email, перевести на другой язык, привести к стилю документации — короче, как настроите. Оба шага работают локально.

maxdev
12.03.2026 15:30В разделе экспериментальных функций можно включить постобработку ИИшкой с возможностью заданием промпта.

atatchin Автор
12.03.2026 15:30Вполне возможно, что вы отчасти правы. Велосипеды, там, где это не вредно для дела, я люблю и этого не стесняюсь. Если речь о работе, то критерии, очевидно, будут иными. Но конкретно в данном случае есть как минимум один важный для меня лично контраргумент. Мысль была в том, чтобы реализовать push-to-talk максимально прямо и тупо — так, чтобы код можно было прочитать за 5 минут. Возможно, я параноик, но, посмотрев на Handy, я подумал: «либо мне нужно читать весь этот код, либо психологически для меня это то же самое, что облачный сервис».

Swanky
12.03.2026 15:30Буквально на днях себе создал аналогичное приложение, правда пока под макос на М1. Сделано на расте, т.к., имхо, питон слишком плох для этого, попробовал собрать и под винду, но там надо баги править, чуть позже добавлю ) скачать можно https://boosty.to/whisper_typer , туда же и для остальных ОС буду выкладывать (хочу для стимдека собрать)

normal
12.03.2026 15:30спасибо, а nVidia parakeet смотрели? вроде она по всем параметрам лучше Whisper.

monowar
12.03.2026 15:30Как раз сегодня прикрутил к своему проекту speech_to_text - пакет распознавания речи. Без особых заморочек.

Daxifl
12.03.2026 15:30Я себе сделал свою штуку для андроида. Ибо решал свою проблему. Люблю в тг, например, общаться короткими ГС до 20 секунд. Но понимаю, как утомительно может быть слушать кучу ГС, а транскрипция от ТГ либо заставляет ждать, либо у собеседника нету премиума. Сделал для себя и для родного человека. Пользуюсь - радуюсь.








Ну и да, чисто для себя я еще сделал деление текста по абзацам, потому что это чисто мой стиль писания, когда есть одна пустая строка между предложениями. Но сейчас я у себя ее отключил. НУ и еще функционал касательно считывания эмоциональности.. Я записываю голос из корня, поэтому могу в два потока делать обработку. И текст ТАМ, ГДЕ НУЖНО, делается эмоциональным, если он соответствуетю
Введите текст

aladkoi
12.03.2026 15:30faster-whisper самое неудачное решение, очень плохо распознает русскую речь. Для этого лучше использовать gigaam

atatchin Автор
12.03.2026 15:30Спасибо, посмотрю. Цель была сделать тулу чтобы "уже сегодня" работала, и могу сказать что меня вполне устроило качество распознавания. По крайней мере для нужд промтинга, там где все равно нейронка потом что имелось ввиду, вполне юзабельно.

oforum
12.03.2026 15:30С учётом того, как вы уже решаете UX‑мелочи, не думали добавить лёгкий слой кастомизации «под контекст окна» — например, разные LLM‑промпты/языки/форматирование в зависимости от активного приложения (чат, IDE, почта), чтобы не переключать настройки руками каждый раз?

atatchin Автор
12.03.2026 15:30Тут вопрос в том чтобы скрипт оставался небольшим, иначе опять же потеряется смысл проекта. Но идея такая посещала. Только я бы не шел в сторону implicit зависимости от окна (легко наступить на грабли). Скорее это может быть несколько профайлов на разных хоткеях. Пользователь нажал так - получил форматирование под почту, нажал эдак - под IDE. Что-то в этом духе...
HRYN
по-моему у тебя ссылочка на гитхаб не работает)
Noizefan
ага, вместо - нужно _
@atatchin
atatchin Автор
упс, спасибо, поправил