Windows desktop app that records microphone and system audio with one button, mixes it into a mono WAV, transcribes speech locally with Whisper or GigaAM-v3, sends the transcript to a selected AI provider, and creates tasks in PLANKA, GitHub Issues, Obsidian, or a webhook.
- Fully local speech recognition through Whisper.net.
- Lightweight, self-contained Windows x64 executable: no .NET installation is required for the published build.
- Animated first-run setup: CPU/CUDA runtime, Whisper model, and AI provider are downloaded or checked before the main window opens.
- Ollama, LM Studio, and any OpenAI-compatible API, with optional Bearer token support.
- Multi-project task routing, including safe PLANKA list selection and retryable delivery history.
- Global hotkey, tray mode, microphone/system-audio capture, editable task drafts, and local audio history.
- Windows 10 or 11 x64;
- .NET 8 SDK for development only;
- an available AI provider and at least one completion model;
- for GitHub Issues, GitHub CLI authentication (
gh auth login) or a fine-grained PAT with Issues: write permission.
Whisper runs locally. On first launch, the setup wizard offers CPU or NVIDIA CUDA, a Whisper model, its storage folder, and an AI provider. The default multilingual LargeV3Turbo model is about 1.6 GB. Models are downloaded atomically to Models next to the executable by default. Download progress shows percentage and transferred volume; if CUDA self-test fails, the wizard keeps the reason visible and clearly reports the CPU fallback.
Local service examples:
Invoke-RestMethod http://127.0.0.1:11434/api/version
ollama list
Invoke-RestMethod http://127.0.0.1:1234/v1/modelsdotnet restore Speech2Issues.sln
dotnet run --project src/Speech2Issues.App- Complete the first-run wizard and select Ollama, LM Studio, or an OpenAI-compatible API. The wizard finishes only after a real provider check succeeds.
- In Settings → Audio and hotkey, choose the microphone and system-audio device, model folder, and speech language, then test Whisper. The same page controls how many idle minutes the loaded Whisper model remains in memory;
0unloads it immediately and the default is 5 minutes. - Add shared service credentials in Settings → Connections.
- Create a local project or import a detected project from PLANKA, GitHub, or Obsidian.
- Enable one or more destinations for the project. For PLANKA, allow the target lists and select a fallback list.
- Select the project and press the microphone button. After processing, there are 5 seconds to cancel, edit, or send immediately.
The full 16 kHz mono WAV is transcribed locally. Only the resulting transcript is sent to the AI provider for structured task generation; audio is never uploaded to the provider.
Edit the task-generation prompt under Settings → AI and save it with Save. The prompt applies to all provider accounts. Default restores the original instructions; a blank prompt also uses them. {outputLanguage} is replaced with the selected output language, and the transcript is appended automatically.
Settings supports multiple named accounts for each AI provider and destination. Each account keeps separate settings and DPAPI-protected credentials. Existing settings migrate to a primary account. Projects select their destination accounts explicitly, so switching the active account does not change existing project credentials. Accounts referenced by projects cannot be deleted until their bindings are changed.
Select GigaAM-v3 under Settings → Audio and hotkey → Recognition model for local Russian transcription with punctuation on CPU. No Python or separate server is required. The first check or transcription downloads approximately 232 MB into Models\gigaam-v3, using the sherpa-onnx e2e RNN-T export of GigaAM-v3. Downloads are verified with SHA-256. Long recordings are split at preferably quiet boundaries; model retention and model-folder migration apply to both engines.
- Ollama — native
/api/tags,/api/show, and/api/chatintegration. - LM Studio — OpenAI-compatible API, default URL
http://127.0.0.1:1234/v1; a Bearer token is optional. - OpenAI-compatible API — any HTTP/HTTPS base URL, model ID, and optional Bearer token.
Tokens are stored only in secrets.bin, encrypted with Windows DPAPI for the current user. If a server does not expose /models, its model ID can be entered manually.
- Connections and credentials are shared; repositories, folders, PLANKA lists, and enabled destinations belong to each local project.
- One project can create a task in several destinations at once.
- For PLANKA, AI can choose only from the lists allowed by that project. Unknown IDs are replaced by the configured fallback list and can be corrected in the editor.
- Partial delivery is preserved: a retry from history sends only failed destinations.
Supported destinations:
- PLANKA 2.1.1 — a card in an AI-selected or manually allowed list.
- GitHub Issues — per-project
owner/repoand existing labels only. - Obsidian — Project Manager, TaskNotes, Tasks, or plain Markdown profiles.
- Webhook —
POSTbody{ schemaVersion: 1, source, task }withIdempotency-Key.
Every task includes a hidden speech2issues:<id> marker. Before retrying, the destination searches for that marker to prevent duplicates.
The installed build keeps application data in %LocalAppData%\Speech2Issues; models default to Models beside the executable. The portable ZIP uses Data and Models beside the executable and does not write its application data to %LocalAppData%\Speech2Issues:
settings.json— non-secret settings;secrets.bin— API keys and tokens encrypted with Windows DPAPI;history.db— transcripts, delivery states, and links;Models\— local Whisper GGML models, or a custom folder selected by the user;runtime\— downloaded Windows x64 CPU/CUDA Whisper libraries;components.json— installed component manifest;recordings\— WAV files kept after cancellation or a failed delivery for retry.
Successful audio is deleted. Secrets and audio are not written to logs.
.\build.ps1
.\build-release.ps1 -Version 0.3.0build.ps1 creates the self-contained executable. build-release.ps1 additionally creates an administrator Setup for Program Files, a portable ZIP with portable.flag, and SHA256SUMS.txt. It requires Inno Setup 6. The build fails if the executable exceeds 100 MB or Whisper runtime packages are accidentally bundled. Manual publish equivalent:
dotnet publish src/Speech2Issues.App -c Release -r win-x64 --self-contained true `
-p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true `
-p:IncludeAllContentForSelfExtract=true -p:EnableCompressionInSingleFile=true -o publishdotnet test Speech2Issues.slnOrdinary tests do not create external tasks. Live tests separately validate local Whisper on a sample WAV and task generation with an installed Ollama model:
dotnet test tests/Speech2Issues.Tests --filter Category=LiveWhisper live tests use the small Tiny model. The application default is LargeV3Turbo.
Test real WASAPI capture without contacting an AI provider or creating a task:
dotnet run --project tools/Speech2Issues.AudioSmoke -- 3Transcribe a stored mono WAV without contacting AI or creating tasks:
dotnet run --project tools/Speech2Issues.AudioSmoke -- --transcribe "C:\path\recording.wav" LargeV3Turbo