Трей-приложение для Windows: записал голосовую заметку — получил текст с заголовком через несколько секунд.
Работает на OpenRouter + Google Gemini. Данные хранятся локально, никуда не отправляются кроме аудио на транскрибацию.
- Запись прямо в приложении — через микрофон браузера, без сторонних программ
- Загрузка файла — поддерживаются OGG, MP3, WAV, WebM, M4A, AAC, FLAC (до 25 МБ)
- Автоматический заголовок — модель генерирует краткий заголовок на русском
- История и поиск — все транскрибации сохраняются локально в SQLite, есть полнотекстовый поиск и пагинация
- Настройки в приложении — API ключ и модель меняются без редактирования файлов
- Восстановление аудио — если транскрибация упала, аудиофайл сохраняется и доступен для повторной попытки
- Трей — приложение живёт в системном трее, окно открывается по клику
- Скачать
VoiceTranscriber.exeиз Releases - Запустить — при первом запуске автоматически откроется панель настроек
- Ввести API ключ OpenRouter и нажать Save
Больше ничего не нужно. Данные и настройки хранятся в папке рядом с .exe.
Требования: Python 3.11+, uv
git clone https://github.com/pyramidheadshark/milvm_stt.git
cd milvm_stt
uv sync
uv run python tray.pyОткрыть панель настроек — кнопка ⚙ в заголовке окна.
| Параметр | Описание |
|---|---|
| API Key | Ключ OpenRouter. Получить на openrouter.ai/keys |
| Model | ID модели OpenRouter с поддержкой аудио. По умолчанию — google/gemini-2.5-flash-lite-preview-09-2025 |
Изменения применяются сразу, без перезапуска.
Альтернативно — через .env в папке с .exe:
OPENROUTER_API_KEY=sk-or-v1-...
MODEL=google/gemini-2.5-flash-lite-preview-09-2025
PORT=8000Список моделей с поддержкой аудио: openrouter.ai/models?input_modalities=audio
Модель по умолчанию: google/gemini-2.5-flash-lite-preview-09-2025
| Тип токенов | Цена |
|---|---|
| Аудио | $0.30 / 1M |
| Текст (выход) | $0.40 / 1M |
Заметка 1–2 минуты ≈ $0.001–0.003. При активном использовании (20 заметок/день) — около $1–2 в месяц.
uv sync
make dev # веб-режим с hot-reload
make tray # трей-приложение
make build # собрать .exeПолный список команд: make help
uv run pytest --cov=. -q81 тест, покрытие 95%. CI запускается на каждый push: ruff + mypy + pytest.
git tag v0.X.Y && git push origin v0.X.YGitHub Actions автоматически соберёт .exe и опубликует GitHub Release.
Правила версий: PATCH — фиксы и мелкие улучшения, MINOR — новые фичи, MAJOR — breaking changes.
├── tray.py # точка входа — системный трей + окно pywebview
├── main.py # FastAPI: все эндпоинты
├── config.py # конфигурация, write_settings, reload_config
├── paths.py # разрешение путей (dev / PyInstaller bundle)
├── services/
│ ├── transcriber.py # OpenRouter API, retry, парсинг ответа
│ └── storage.py # SQLite, история, failed audio
├── templates/
│ └── index.html # весь UI — vanilla JS, без сборки
├── assets/ # иконки
├── tests/ # 81 тест
└── .github/workflows/
├── ci.yml # lint + typecheck + test
└── release.yml # build .exe → GitHub Release
Стек: FastAPI · pywebview · pystray · aiosqlite · httpx · Jinja2 · uv · PyInstaller
Поток транскрибации:
микрофон → MediaRecorder (WebM/Opus)
→ POST /transcribe
→ base64 + input_audio → OpenRouter API
→ парсинг TITLE / TEXT
→ SQLite + возврат в UI
При ошибке API аудио сохраняется как FAILED_*.ogg — доступно для скачивания из UI.