VoiceCapture — портативная open-source утилита для голосового ввода на Windows. Записывает речь, транскрибирует через облачные API (Groq, OpenAI Whisper, OpenRouter / Gemini), улучшает текст через LLM и автоматически вставляет результат в активное поле. Поддерживает интеграцию с n8n Webhook для автоматизации обработки голосовых заметок.
⭐ Проект открытый. Fork, Star, PR приветствуются.
- Скачайте
VoiceCapture.exeиз раздела Releases. - Запустите файл — установка не требуется.
- Откройте настройки (⚙️) и введите API-ключ Groq, OpenAI или OpenRouter.
- Зажмите
Ctrl + Win— говорите — отпустите. Текст вставится сам.
| Функция | Описание |
|---|---|
| 🎙️ Голосовой ввод | Нажми Ctrl+Win, говори, отпусти — текст появится в нужном месте |
| 💡 Голосовые заметки | Ctrl+Win+Alt — запись идеи/заметки отдельным потоком |
| 🧠 3 ASR-провайдера | Groq Whisper, OpenAI Whisper, OpenRouter (Gemini) — выбор и авто-fallback |
| LLM-постобработка | Автоисправление пунктуации, грамматики через Groq/OpenAI |
| 🔗 N8N Webhook | Заметки автоматически улетают на ваш N8N workflow |
| 📋 Clipboard | Распознанный текст сразу в буфер + автовставка |
| 📜 История | Последние 50 записей с raw/processed вариантами |
| 🔄 Crash Recovery | Аудио сохраняется и переобрабатывается после сбоя |
| ⚡ Ускорение x2 | Опциональное ускорение аудио для экономии API-трафика |
| 🎛️ Выбор микрофона | Любое аудиоустройство в настройках |
| 🪟 Портативность | Один .exe, без инсталляции, без прав администратора |
| Клавиши | Действие |
|---|---|
Ctrl + Win (удержать) |
Начать запись речи → отпустить = транскрибировать и вставить |
Ctrl + Win + Alt (удержать) |
Записать голосовую заметку (идею) → отправить на N8N или сохранить в список |
Esc |
Отменить текущую запись |
Ctrl + Alt + S |
Показать/скрыть главное окно |
Все горячие клавиши настраиваемые — меняются в разделе «Горячие клавиши» в настройках.
Самая мощная фича для автоматизации. Когда вы нажимаете Ctrl+Win+Alt и диктуете заметку:
- Речь транскрибируется и обрабатывается LLM.
- Результат отправляется POST-запросом на указанный N8N Webhook URL.
- N8N может записать в Notion, отправить в Telegram, создать задачу в Jira — что угодно.
- В N8N создайте Workflow с триггером Webhook.
- Скопируйте URL вида
https://your-n8n.example.com/webhook/abc123. - В VoiceCapture откройте ⚙️ Настройки → раздел «Интеграции».
- Вставьте URL в поле «Webhook N8N (конечная точка)».
- Сохраните.
{
"text": "Текст распознанной и обработанной заметки",
"timestamp": "2026-03-15T10:30:00.000000",
"source": "VoiceCapture"
}- Список идей в главном окне скрывается — всё уходит на сервер.
- При записи статус показывает «Запись → N8N Webhook...».
- После отправки появляется ✅ «Отправлено на N8N Webhook» или ❌ при ошибке (5 сек).
- При пустом поле Webhook — обычный режим: список идей в окне +
logs/ideas.log.
С версии 2.4.0 VoiceCapture поддерживает третий бекенд распознавания — OpenRouter (или любой совместимый прокси). Это даёт доступ к мультимодальным моделям, которые умеют распознавать аудио прямо внутри chat/completions — например google/gemini-3.1-flash-lite-preview (модель по умолчанию).
- Groq и OpenAI используют классический Whisper через
POST /audio/transcriptionsс multipart-файлом. - OpenRouter использует chat/completions и принимает аудио как base64-строку внутри поля
input_audio. - Это позволяет передавать в модель полноценный prompt (не просто список слов), описывая, что именно и как распознавать: имена, термины, стиль, язык, форматирование.
- VoiceCapture записывает аудио с микрофона.
- Аудио кодируется в OGG Vorbis (по умолчанию — самое выгодное сжатие, ~8-10× меньше WAV). Можно выбрать
mp3илиwavв настройках. - Полученные байты кодируются в base64.
- Формируется JSON-запрос на
{OpenRouter Base URL}/chat/completions:
{
"model": "google/gemini-3.1-flash-lite-preview",
"modalities": ["text"],
"messages": [
{
"role": "user",
"content": [
{ "type": "text", "text": "ASR prompt из настроек" },
{ "type": "input_audio", "input_audio": { "data": "<base64>", "format": "ogg" } }
]
}
],
"stream": false
}- Ответ модели извлекается из
choices[0].message.contentи идёт дальше по обычному потоку (LLM-постобработка → буфер обмена → вставка).
- Ручной выбор: в ⚙️ Настройках → «Сервис распознавания» выберите OpenRouter. Все записи пойдут через него.
- Fallback: если выбранный бекенд упадёт (таймаут, 404 от Cloudflare, 429 rate limit), VoiceCapture автоматически попробует остальные в порядке OpenRouter → Groq → OpenAI (выбранный всегда идёт первым). До 5 попыток.
- Получите ключ на openrouter.ai или у своего прокси-провайдера.
- ⚙️ Настройки → OpenRouter API key — вставьте ключ.
- OpenRouter Base URL — впишите endpoint, например
https://openrouter.ai/api/v1или адрес вашего прокси. - OpenRouter ASR model — по умолчанию
google/gemini-3.1-flash-lite-preview, можно поменять на любую совместимую модель OpenRouter. - OpenRouter ASR prompt — (опционально) инструкция модели: «Распознавай техническую речь на русском, сохраняй термины на английском без искажений» и т.п.
- OpenRouter audio format —
ogg(рекомендуется),mp3илиwav.
⚠️ Важно: Ни ключи, ни URL в коде не захардкожены. Всё хранится только в локальномconfig.yaml(который в.gitignore), поэтому репозиторий можно безопасно публиковать на GitHub.
Groq — самый быстрый вариант с щедрым бесплатным планом:
- Зайдите на console.groq.com.
- Зарегистрируйтесь / войдите.
- В разделе «API Keys» создайте новый ключ.
- Вставьте в VoiceCapture: ⚙️ → Groq API key.
| Раздел | Параметр | Описание |
|---|---|---|
| Аудио | Микрофон | Выбор устройства ввода |
| Аудио | Ускорение x2 | Ускоряет аудио перед отправкой (меньше трафика) |
| Сервис распознавания | Backend | Groq, OpenAI или OpenRouter |
| Сервис распознавания | Groq / OpenAI / OpenRouter API Key | Ключи провайдеров (хранятся локально в config.yaml) |
| Сервис распознавания | OpenAI Base URL | Custom endpoint (совместимые API: LM Studio, vLLM) |
| Сервис распознавания | OpenRouter Base URL | Endpoint OpenRouter или совместимого прокси |
| Горячие клавиши | Запись | По умолчанию ctrl+win |
| Горячие клавиши | Запись идеи | По умолчанию ctrl+win+alt |
| Модели ASR | Groq ASR model | По умолчанию whisper-large-v3 |
| Модели ASR | OpenAI ASR model | По умолчанию whisper-1 |
| Модели ASR | OpenRouter ASR model | По умолчанию google/gemini-3.1-flash-lite-preview |
| Модели ASR | Groq / OpenAI / OpenRouter ASR prompt | Подсказка модели: термины, имена, стиль распознавания |
| Модели ASR | OpenRouter audio format | Формат кодирования перед отправкой: ogg (дефолт), mp3, wav |
| Постобработка | Включить | Вкл/выкл LLM-коррекции |
| Постобработка | Сервис | Groq или OpenAI для LLM |
| Постобработка | Модели | LLM-модели для коррекции |
| Постобработка | System Prompt | Инструкция для LLM (можно попросить переводить, писать в стиле и т.д.) |
| Интеграции | Webhook N8N | URL конечной точки N8N для голосовых заметок |
voice2.0/
├── src/
│ ├── main.py # App класс, оркестратор
│ ├── config/
│ │ └── settings.py # Датаклассы настроек, load/save YAML
│ ├── audio/
│ │ └── recorder.py # Запись через sounddevice
│ ├── hotkey/
│ │ └── hotkey_manager.py # Глобальные хоткеи через keyboard
│ ├── recognition/
│ │ ├── groq_api.py # Groq Whisper транскрибация
│ │ ├── openai_api.py # OpenAI Whisper транскрибация
│ │ ├── openrouter_api.py # OpenRouter / Gemini (chat/completions + input_audio)
│ │ └── postprocessor.py # LLM постобработка текста
│ ├── clipboard/
│ │ └── clipboard_manager.py # Копирование и вставка
│ ├── ui/
│ │ ├── floating_window.py # Главное плавающее окно
│ │ ├── settings_dialog.py # Диалог настроек
│ │ ├── history_dialog.py # Окно истории
│ │ └── system_tray.py # Системный трей
│ └── utils/
│ ├── history.py # История распознаваний
│ ├── recovery.py # Восстановление после сбоя
│ └── logger.py # Настройка loguru
├── config.yaml # Конфиг (создаётся автоматически, в .gitignore)
├── build_exe.py # Сборка в .exe через PyInstaller
└── requirements.txt
- Один файл конфига —
config.yamlв корне проекта/рядом с.exe. Нетconfig.local.yaml, нет нескольких файлов. - Каскад из 3 backend-ов — при ошибке основного провайдера автоматически пробует остальные (OpenRouter → Groq → OpenAI), до 5 попыток.
- Два формата вызова ASR — Whisper (multipart) для Groq/OpenAI и chat/completions (base64
input_audio) для OpenRouter. - OGG Vorbis по умолчанию для OpenRouter — сжатие в 8-10 раз компактнее WAV, без внешних зависимостей (через libsndfile).
- Ноль секретов в коде — ни ключи, ни endpoint'ы не захардкожены. Всё только через UI-настройки и
config.yaml(в.gitignore). - Webhook в daemon-потоке — отправка на N8N не блокирует UI и основную обработку.
- Безопасные сигналы Qt — все обращения к UI из воркер-потоков через
pyqtSignal. - PyInstaller onefile — все зависимости упакованы в один
.exe, включая SSL-сертификаты (certifi).
Требования: Python 3.12+, Windows 10/11.
# Клонируем репозиторий
git clone https://github.com/oiv-an/Voice.git
cd voice2.0
# Устанавливаем зависимости
pip install -r requirements.txt
# Запуск в dev-режиме
python src/main.py
# Сборка в .exe
python build_exe.py
# Готовый файл: dist/VoiceCapture.exe| Пакет | Назначение |
|---|---|
PyQt6 |
GUI |
sounddevice + numpy |
Запись аудио |
keyboard |
Глобальные хоткеи |
groq + openai |
API клиенты |
loguru |
Логирование |
pyyaml |
Конфиг |
pyperclip |
Clipboard |
certifi |
SSL-сертификаты для PyInstaller |
- ⌨️ Восстановление горячих клавиш: Добавлена кнопка
⌨в главном окне для ручного полного перезапуска приложения, если Windows перестала доставлятьCtrl+Win, хотя UI остаётся живым. - 🔄 Профилактическая перерегистрация hooks: Глобальные hotkey hooks мягко перерегистрируются каждые 10 минут, если запись не активна.
- 🐛 Исправлен self-restart в PyInstaller onefile: Перезапуск
.exeтеперь идёт через отдельный launcher с очисткой_PYI_*иPYINSTALLER_RESET_ENVIRONMENT=1, чтобы избежать ошибок временной папки_MEI...и проблем подключения после рестарта.
- 🧠 OpenRouter как третий ASR-бекенд: Можно выбрать
OpenRouterв настройках и распознавать через мультимодальные модели OpenRouter (по умолчанию —google/gemini-3.1-flash-lite-preview). - 🎙️ ASR Prompt: У каждого бекенда (Groq, OpenAI, OpenRouter) появилось отдельное поле «ASR prompt» — инструкция модели по распознаванию (термины, имена, стиль).
- 🔄 Расширенный fallback-каскад: При ошибке основного провайдера система автоматически пробует остальные в порядке OpenRouter → Groq → OpenAI (выбранный всегда первый).
- 🗜️ OGG Vorbis для OpenRouter: Аудио перед отправкой сжимается через libsndfile в OGG (в 8-10 раз меньше WAV). В настройках можно выбрать
ogg,mp3илиwav. - 🔐 Ноль секретов в коде: Все ключи и endpoint'ы OpenRouter задаются только через UI-настройки и сохраняются локально в
config.yaml. Репозиторий безопасен для публикации.
- ** N8N Webhook интеграция:** В настройках (раздел «Интеграции») можно указать URL Webhook N8N. При нажатии
Ctrl+Win+Altголосовая заметка транскрибируется и автоматически отправляется POST-запросом на указанный URL. - 🔄 Webhook mode: Если Webhook заполнен — список идей в главном окне скрывается, результат идёт только на сервер. Показывается статус ✅/❌.
- 📍 Статус записи: При записи идеи/Webhook показывается «Запись → N8N Webhook...» или «Запись идеи...» вместо обычного «Запись...».
- 🐛 Исправлено мигание при нажатии
Ctrl+Win+Alt— надпись больше не мигает при добавлении Alt к зажатым Ctrl+Win. Фикс вhotkey_manager.py:_handle_release()теперь проверяет, что Ctrl+Win действительно отпущены, прежде чем останавливать запись.
- Исправлена ошибка SSL: Исправлена проблема с SSL-сертификатами при работе собранного exe-файла.
- Улучшение интерфейса: Если отключен постпроцессинг (LLM), второе текстовое поле скрывается.
- Обслуживание: Кнопка очистки папки RECOVERY в настройках.
- Баг-фикс: Пустые аудиофайлы больше не накапливаются.
- Сохранение размера окна: Размер запоминается между сессиями.
- Фильтрация галлюцинаций LLM: Фразы-заглушки («Продолжение следует...») игнорируются.
- Пустой ввод: Если распознавание вернуло пустой текст — показывается заглушка.
- Исправление зависаний: Устранена критическая ошибка зависания при быстрых хоткеях.
- История распознаваний: Кнопка 🕒 — последние 50 записей с копированием.
- Изменение размера окна: Уголок resize в правом нижнем углу.
- Настраиваемый System Prompt: Поле для редактирования инструкции LLM в настройках.
- Поддержка Groq API.
Pull requests приветствуются. Для крупных изменений — сначала откройте Issue для обсуждения.
- Fork репозитория.
- Создайте feature-ветку:
git checkout -b feature/my-feature. - Commit:
git commit -m 'Add my feature'. - Push:
git push origin feature/my-feature. - Откройте Pull Request.
MIT License. Делайте что хотите.
VoiceCapture is a portable open-source voice typing utility for Windows. Records speech, transcribes via cloud APIs (Groq Whisper, OpenAI Whisper, OpenRouter / Gemini), improves text via LLM, and automatically pastes the result into the active field. Supports n8n Webhook integration for automating voice note processing.
- 🎙️ Voice Input: Hold
Ctrl+Win, speak, release — text appears where you need it. - 💡 Voice Notes:
Ctrl+Win+Alt— records an idea/note in a separate flow. - 🧠 3 ASR Providers: Groq Whisper, OpenAI Whisper, OpenRouter (Gemini) — pick one or let auto-fallback handle failures.
- LLM Post-processing: Auto-corrects punctuation, grammar via Groq/OpenAI.
- 🔗 N8N Webhook: Notes automatically fly to your N8N workflow.
- 📋 Clipboard: Recognized text goes straight to clipboard + auto-paste.
- 📜 History: Last 50 recordings with raw/processed variants.
- 🔄 Crash Recovery: Audio is saved and reprocessed after a crash.
- ⚡ x2 Speedup: Optional audio speedup to save API traffic.
- 🎛️ Microphone Selection: Any audio device in settings.
- 🪟 Portable: Single
.exe, no installation, no admin rights required.
VoiceCapture now supports OpenRouter as a third ASR backend. Unlike Groq/OpenAI (which use classic Whisper multipart upload), OpenRouter sends audio as a base64-encoded input_audio block inside a chat/completions request — so you can use multimodal models like google/gemini-3.1-flash-lite-preview (default).
How it works:
- Audio is encoded to OGG Vorbis (default, ~8-10x smaller than WAV), MP3 or WAV.
- Bytes are base64-encoded and placed into
messages[].content[].input_audio. - Request is POSTed to
{OpenRouter Base URL}/chat/completions. - The model returns the transcription, which continues through LLM post-processing → clipboard → paste.
Manual selection + automatic fallback: pick OpenRouter in settings to use it as the primary ASR. If it fails (timeout, Cloudflare challenge, rate limit), VoiceCapture automatically falls back to Groq and OpenAI in that order.
Zero secrets in code: API keys and Base URLs are never hardcoded — everything is configured through the UI and stored only in the local config.yaml (which is in .gitignore). Safe for open-source publishing.
When you press Ctrl+Win+Alt and dictate a note:
- Speech is transcribed and processed by LLM.
- Result is sent as a POST request to the specified N8N Webhook URL.
- N8N can write to Notion, send to Telegram, create a task in Jira — anything.
Payload sent to Webhook:
{
"text": "Transcribed and processed note text",
"timestamp": "2026-03-15T10:30:00.000000",
"source": "VoiceCapture"
}Setup: Settings (⚙️) → Integrations → N8N Webhook (endpoint) → paste your webhook URL.
- Hotkey recovery: Added a
⌨button to the main window for a full manual app restart when Windows stops deliveringCtrl+Winwhile the UI is still alive. - Scheduled hook refresh: Global hotkey hooks are softly re-registered every 10 minutes when recording is not active.
- PyInstaller onefile self-restart fix: The built
.exenow restarts through a detached launcher that clears_PYI_*variables and setsPYINSTALLER_RESET_ENVIRONMENT=1, avoiding_MEI...temporary directory cleanup errors and broken connectivity after restart.
- OpenRouter as 3rd ASR backend: Pick
OpenRouterin settings and transcribe via multimodal models (default:google/gemini-3.1-flash-lite-preview). - ASR Prompt field: Every backend (Groq, OpenAI, OpenRouter) now has its own "ASR prompt" — an instruction to the recognition model about terms, names, style.
- Extended fallback cascade: On primary provider failure, the system tries remaining backends in order OpenRouter → Groq → OpenAI (user-selected always first). Up to 5 attempts.
- OGG Vorbis for OpenRouter: Audio is compressed via libsndfile to OGG before base64 encoding (~8-10x smaller than WAV).
ogg,mp3,wavare configurable. - Zero hardcoded secrets: All OpenRouter keys and endpoints are UI-configurable and stored locally in
config.yaml. Safe to open-source.
- N8N Webhook integration: Voice notes are automatically sent to N8N webhook URL (configurable in Settings → Integrations).
- Webhook mode: When webhook is set, the ideas list is hidden; results go to server only. Shows ✅/❌ status.
- Recording status: Shows "Recording → N8N Webhook..." or "Recording idea..." instead of generic "Recording...".
- Fixed flickering when pressing
Ctrl+Win+Alt— status label no longer flickers when adding Alt to held Ctrl+Win.
- SSL certificate fix for built exe file.
- UI: second text field hidden when post-processing is disabled.
- Added "Clear RECOVERY folder" button in settings.
- Fixed empty audio files accumulation.
- Window size is now saved between sessions.
- LLM hallucination filtering (placeholder phrases are ignored).
- Empty input placeholder.
- Fixed critical freeze bug on rapid hotkey presses.
- Recognition history with 🕒 button.
- Window resizing via bottom-right corner grip.
- Configurable LLM system prompt in settings.
- Groq API support added.
Requirements: Python 3.12+, Windows 10/11.
git clone https://github.com/oiv-an/Voice.git
cd voice2.0
pip install -r requirements.txt
# Run in dev mode
python src/main.py
# Build .exe
python build_exe.py
# Output: dist/VoiceCapture.exeMIT License.