Мне нужен был голосовой ввод. Не встроенная в ОС диктовка, не облачный 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 (вернуть старое содержимое после вставки), clearpreserve. По умолчанию — 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.

Ссылки

  • GitHub

  • Лицензия: MIT

Комментарии (26)


  1. HRYN
    12.03.2026 15:30

    по-моему у тебя ссылочка на гитхаб не работает)


    1. Noizefan
      12.03.2026 15:30

      ага, вместо - нужно _

      @atatchin


      1. atatchin Автор
        12.03.2026 15:30

        упс, спасибо, поправил


  1. tsem13
    12.03.2026 15:30

    Буфер обмена. Вставка текста через Ctrl+V / Cmd+V требует положить текст в буфер обмена. Но там может быть что-то важное.

    Именно на виндах из коробки есть на диво полезное сочетание win+V и журнал буфера обмена. Советую.


  1. badsynt
    12.03.2026 15:30

    Готовых решений, которые бы устроили, сходу не нашёл. 

    Возможно просто и не хотели подсознательно?

    https://github.com/cjpais/Handy

    Press a shortcut, speak, and have your words appear in any text field.


    1. SigiLSF
      12.03.2026 15:30

      Да сейчас такие вещи на вайбкодить не сложно, и довольно интересно.


    1. Bratken
      12.03.2026 15:30

      +1 за Handy. Нашелся багос, разве что, что при запущенном приложении при активном скролле мышкой (какая-нибудь logitech MX Anywhere 3 с вечным скроллом) винда начинает лагать - лечится сменой api ввода в экспериментальных настройках.

      Разве что модели без впн не качаются. Из мультиязычных Parakeet V3 работает на процессоре очень хорошо. И в 0.7.10 завезли чисто русскоязычную модель. В ноуте есть ryzen 7840h. А на другом ноуте с rtx3060 и whisper large вполне гонять


      1. asharpaev
        12.03.2026 15:30

        а есть ли аналог Handy но с поддержкой openAI API?

        Т.к. у меня на компьютере нет GPU, грузить процессор не хочу. Зато на локальном сервере есть GPU


        1. atatchin Автор
          12.03.2026 15:30

          Кстати, хорошая идея, добавлю в свою тулу тоже. Кода минимум а толку довольно много будет.


    1. WhiteBehemoth
      12.03.2026 15:30

      А он тоже умеет "убрать слова-паразиты и "окультурить" текст?"
      Мне в статье идея связки с LLM понравилась.

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


      1. maxdev
        12.03.2026 15:30

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


    1. atatchin Автор
      12.03.2026 15:30

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


  1. KazakovDenis
    12.03.2026 15:30

    Пользуюсь Whispering, работает отлично


  1. Swanky
    12.03.2026 15:30

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


    1. normal
      12.03.2026 15:30

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


  1. Micha1l
    12.03.2026 15:30

    Прекрасное решение! А для смартфонов что-то подобное возможно?


    1. K0Jlya9
      12.03.2026 15:30

      Это не подходит даже для большинства ПК. Виспер и ллм требуют видеокарту с большим количеством видеопамяти.


      1. atatchin Автор
        12.03.2026 15:30

        На Macbook Air M3 16GB очень юзабельно, даже сам не ожидал. Не хуже десктопа RTX 5070TI + 64RAM.


    1. K0Jlya9
      12.03.2026 15:30

      А что конкретно нужно для смартфона? Чем не устраивает например клавиатура от яндекса, в ней есть распознавание и облагораживание текста, да и в стандартной клавиатуре от гугла оно есть.


  1. monowar
    12.03.2026 15:30

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


  1. Daxifl
    12.03.2026 15:30

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



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


  1. aladkoi
    12.03.2026 15:30

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


    1. atatchin Автор
      12.03.2026 15:30

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


      1. atatchin Автор
        12.03.2026 15:30

        ...там где все равно нейронка потом разберет, что имелось ввиду


  1. oforum
    12.03.2026 15:30

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


    1. atatchin Автор
      12.03.2026 15:30

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