PushDictate

Hold Ctrl+Space, speak, release — the text appears where your cursor is blinking. Also in the terminal, where the built-in Windows dictation gives up.

Strg+Leertaste halten, sprechen, loslassen — der Text erscheint dort, wo der Cursor blinkt. Auch im Terminal, wo die Windows-Spracherkennung aufgibt.

Windows 10/11 · Python 3.10+ · MIT licence · your own OpenAI key

Windows 10/11 · Python 3.10+ · MIT-Lizenz · eigener OpenAI-Schlüssel

Why it exists

Windows Speech Recognition and most dictation tools insert text through Windows' text-services layer. That layer is unavailable in console windows, in many Electron apps, and in anything running inside WSL. So exactly when you want to dictate a commit message, a prompt to a coding agent, or a shell command, the built-in dictation stops working.

PushDictate takes a different route: record → transcribe → clipboard → paste. A clipboard paste is accepted by every window that takes text. That single design decision is the whole point of the tool.

Where it works that others don't

TargetWindows dictationPushDictate
Windows Terminal, PowerShell, cmd
WSL / Ubuntu shell
Coding agents in the terminal
VS Code integrated terminal
SSH sessions
Word, Outlook, browsers

Verified in daily use on Windows 11, not in a systematic test series across Windows versions. If a row is wrong on your setup, open an issue and it gets corrected here.

Other push-to-talk dictation tools exist — several open-source projects cover Linux and macOS with local models. PushDictate is the Windows-plus-cloud-API case, so this table compares against the built-in Windows dictation, not against those projects.

Warum es das gibt

Die Windows-Spracherkennung und die meisten Diktierwerkzeuge schreiben über die Text-Services-Schicht von Windows. Die steht in Konsolenfenstern nicht zur Verfügung, in vielen Electron-Apps ebenso wenig, und in allem, was in WSL läuft, erst recht nicht. Genau dann, wenn eine Commit-Nachricht, ein Prompt an einen Coding-Agenten oder ein Shell-Befehl diktiert werden soll, gibt sie auf.

PushDictate geht einen anderen Weg: aufnehmen → transkribieren → Zwischenablage → einfügen. Ein Einfügen aus der Zwischenablage nimmt jedes Fenster an, das Text akzeptiert. Diese eine Entwurfsentscheidung ist der ganze Sinn des Werkzeugs.

Wo es funktioniert und anderes nicht

ZielWindows-DiktatPushDictate
Windows Terminal, PowerShell, cmd
WSL / Ubuntu-Shell
Coding-Agenten im Terminal
Integriertes Terminal in VS Code
SSH-Sitzungen
Word, Outlook, Browser

Im Alltag auf Windows 11 verifiziert, nicht in einer systematischen Messreihe über mehrere Windows-Versionen. Stimmt eine Zeile auf einem anderen System nicht, bitte ein Issue öffnen — dann wird sie hier korrigiert.

Es gibt weitere Push-to-Talk-Diktierwerkzeuge — mehrere Open-Source-Projekte decken Linux und macOS mit lokalen Modellen ab. PushDictate ist der Fall Windows plus Cloud-API, deshalb vergleicht diese Tabelle mit der Windows-Bordfunktion, nicht mit jenen Projekten.

Install

Needs Windows 10 or 11, Python 3.10+ (64-bit) and git. No git? Use Code → Download ZIP on GitHub instead of the first line.

git clone https://github.com/Bubu89/pushdictate.git
cd pushdictate
py -m pip install -r requirements.txt
py pushdictate.py --check

py -m pip rather than plain pip on purpose: on machines with several Python installations, pip often belongs to a different one than py, and the packages land where nothing will look for them. --check reports packages, key and write access before you start anything.

Then start it — wscript start_silent.vbs for everyday use, or python pushdictate.py with a console for debugging.

Installing without a window

The first start opens a setup window. That is right at a desk and useless in a script, over a remote session, or when an agent does the installing — the window waits and nothing is reported. Every step therefore has a window-free path:

py pushdictate.py --set-key sk-...          # write the key into .env
echo sk-... | py pushdictate.py --set-key -  # or from standard input
py pushdictate.py --check --json             # machine-readable status
py pushdictate.py --no-setup                 # fail instead of opening a window

Exit codes: 0 fine, 1 check failed, 2 bad invocation, 3 key missing and no window allowed. A full unattended install is four lines — clone, install, set the key, check.

First start: the setup assistant

PushDictate ships without an API key and never will. Whisper transcription is billed to whoever owns the key, so it has to be yours. On the first launch a window opens and walks you through it:

  1. A button opens the OpenAI key page in your browser
  2. You paste the key into the field
  3. Click Save and start — done

The assistant writes the configuration file itself. No copying, no renaming, no editing config by hand. The key is checked for plausibility before it is stored, so an empty field or a typo gets a clear message instead of a failure three steps later.

Cost: billed per minute of audio. Ten minutes of dictation a day lands in the low single-digit euros per month. Rates change, so check OpenAI's pricing page rather than trusting a number frozen into a web page.

Use it

ActionKey
Start recordingCtrl + Space
Stop and insertSpace

A coloured dot sits at the screen edge: red idle, yellow microphone opening — don't speak yet, green recording, orange transcribing. Wait for green; starting at yellow cuts off your first word. Two low tones mean nothing was inserted.

Right-click the dot for the quick guide at any time.

Installation

Braucht Windows 10 oder 11, Python 3.10+ (64-Bit) und git. Kein git? Dann auf GitHub Code → Download ZIP statt der ersten Zeile.

git clone https://github.com/Bubu89/pushdictate.git
cd pushdictate
py -m pip install -r requirements.txt
py pushdictate.py --check

py -m pip statt bloßem pip mit Absicht: Auf Rechnern mit mehreren Python-Installationen gehört pip oft zu einer anderen als py. Die Pakete landen dann dort, wo niemand sie sucht. --check meldet Pakete, Schlüssel und Schreibrechte, bevor irgendetwas startet.

Danach starten — wscript start_silent.vbs für den Alltag, oder python pushdictate.py mit Konsole zum Debuggen.

Einrichten ohne Fenster

Der erste Start öffnet ein Einrichtungsfenster. Am Schreibtisch ist das richtig, in einem Skript, über eine Fernsitzung oder wenn ein Agent die Installation übernimmt, ist es unbrauchbar — das Fenster wartet, und nichts wird gemeldet. Deshalb hat jeder Schritt einen Weg ohne Fenster:

py pushdictate.py --set-key sk-...           # Schlüssel in .env schreiben
echo sk-... | py pushdictate.py --set-key -  # oder von der Standardeingabe
py pushdictate.py --check --json             # Status maschinenlesbar
py pushdictate.py --no-setup                 # abbrechen statt Fenster öffnen

Rückgabewerte: 0 in Ordnung, 1 Prüfung fehlgeschlagen, 2 Aufruffehler, 3 Schlüssel fehlt und kein Fenster erlaubt. Eine vollständige Installation ohne Zutun sind vier Zeilen — klonen, installieren, Schlüssel setzen, prüfen.

Erster Start: der Einrichtungs-Assistent

PushDictate wird ohne Schlüssel ausgeliefert und wird das auch bleiben. Die Transkription wird dem Schlüssel-Inhaber verrechnet, also muss es der eigene sein. Beim ersten Start öffnet sich ein Fenster, das durchführt:

  1. Eine Schaltfläche öffnet die OpenAI-Schlüsselseite im Browser
  2. Der Schlüssel wird ins Feld eingefügt
  3. Speichern und starten — fertig

Der Assistent legt die Konfigurationsdatei selbst an. Kein Kopieren, kein Umbenennen, kein Hantieren mit Konfigurationsdateien. Vor dem Speichern wird der Schlüssel auf Plausibilität geprüft — ein leeres Feld oder ein Tippfehler bekommt eine klare Meldung, statt drei Schritte später zu scheitern.

Kosten: Abrechnung pro Audiominute. Zehn Minuten Diktat am Tag landen im niedrigen einstelligen Eurobereich pro Monat. Preise ändern sich, deshalb besser die Preisseite von OpenAI ansehen als einer Zahl vertrauen, die auf einer Webseite einbetoniert wurde.

Bedienung

AktionTaste
Aufnahme startenStrg + Leertaste
Beenden und einfügenLeertaste

Am Bildschirmrand sitzt ein farbiger Punkt: rot bereit, gelb Mikrofon öffnet — noch nicht sprechen, grün Aufnahme läuft, orange wird transkribiert. Auf Grün warten; wer bei Gelb anfängt, verliert das erste Wort. Zwei tiefe Töne heißen: nichts eingefügt.

Rechtsklick auf den Punkt öffnet die Kurzanleitung jederzeit.

Privacy

Audio leaves your machine. Recordings go to the OpenAI API for transcription, under your key and OpenAI's terms. No other server is involved: no telemetry, no analytics, no account with the author. The key, your settings, the logs and any queued audio stay on your machine.

If your audio must not reach a third party, a local Whisper model is the right choice and this tool is the wrong one. That is a real limitation, not a detail.

Datenschutz

Die Aufnahme verlässt den Rechner. Sie geht zur Transkription an die OpenAI-API — unter dem eigenen Schlüssel und OpenAIs Bedingungen. Sonst ist kein Server beteiligt: keine Telemetrie, keine Auswertung, kein Konto beim Autor. Schlüssel, Einstellungen, Protokolle und zurückgestellte Aufnahmen bleiben lokal.

Wenn die Audiodaten das Gerät nicht verlassen dürfen, ist ein lokales Whisper-Modell die richtige Wahl und dieses Werkzeug die falsche. Das ist eine echte Einschränkung, keine Fußnote.

Questions

Why does it need my own API key?

Transcription is billed to the key that requests it. A key shipped with the app would bill the author for everyone's dictation and would be revoked within days. Your key stays on your machine.

Does it listen all the time?

No. The microphone opens when you hold the hotkey and closes when you release it. Nothing is recorded in between.

Transcription fails with a connection error.

If Cloudflare WARP is running, its Gateway blocks DNS for the OpenAI API — it is categorised as a tracker. You need to allow it in two places: the Split-Tunnel exclusions and a Gateway allow rule. Either one alone is not enough.

Proper nouns come back misspelled.

Put them into vocab.txt, one per line. The list is passed to the model as a hint and applies immediately, without a restart. Keep it short — an overlong list makes the model guess.

Does it run on macOS or Linux?

No. It uses Windows APIs for the hotkey, the overlay and the audio device handling. For those platforms there are other open-source push-to-talk tools, several of them with local models.

Fragen

Warum braucht es einen eigenen Schlüssel?

Die Transkription wird dem Schlüssel verrechnet, der sie anfordert. Ein mitgelieferter Schlüssel würde dem Autor das Diktat aller Nutzer in Rechnung stellen und wäre binnen Tagen gesperrt. Der eigene Schlüssel bleibt auf dem eigenen Rechner.

Hört es dauernd mit?

Nein. Das Mikrofon öffnet, während die Taste gehalten wird, und schließt beim Loslassen. Dazwischen wird nichts aufgenommen.

Die Transkription scheitert mit einem Verbindungsfehler.

Läuft Cloudflare WARP, blockiert dessen Gateway das DNS für die OpenAI-API — sie ist dort als Tracker eingestuft. Die Freigabe muss an zwei Stellen erfolgen: in den Split-Tunnel-Ausnahmen und als Gateway-Regel. Eines allein reicht nicht.

Eigennamen kommen falsch geschrieben an.

In vocab.txt eintragen, einen pro Zeile. Die Liste geht als Hinweis an das Modell und wirkt sofort, ohne Neustart. Kurz halten — eine überlange Liste verleitet das Modell zum Raten.

Läuft es auf macOS oder Linux?

Nein. Es nutzt Windows-APIs für Tastenkürzel, Overlay und Audiogeräte. Für diese Systeme gibt es andere Open-Source-Werkzeuge, mehrere davon mit lokalen Modellen.