Voice dictation daemon using NVIDIA Parakeet on Apple Silicon
Project description
🐦 Birdword
Contextual voice dictation for macOS. Powered by NVIDIA Parakeet running locally on Apple Silicon via MLX.
Press a hotkey, speak, and your words are transcribed and pasted into whatever app is focused. A small LLM post-processes the transcription to fix errors, using project-specific context from a BIRDWORD.md file.
Getting started
Requires macOS on Apple Silicon (M1+) and Python 3.10+.
# Run with uvx (no install needed)
uvx birdword
# Or run in the background
uvx birdword start
uvx birdword stop
uvx birdword status
Context-aware correction
The key idea behind birdword is contextual transcription correction. When dictating into Terminal.app, birdword detects the focused tab's working directory and looks for a BIRDWORD.md file up the directory tree. This lets you teach birdword your project's domain:
Context detection works with:
- Terminal.app — detects the focused tab's shell working directory
- VS Code / VS Code Insiders — via the Birdword extension, which works with local and remote (SSH) workspaces
Transcription and pasting work in any app.
uvx birdword init
This creates a BIRDWORD.md with the default prompt template. Edit it to add your project's terms, names, and jargon:
---
transcription_model: mlx-community/parakeet-tdt-0.6b-v2
fix_model: mlx-community/Qwen2.5-1.5B-Instruct-4bit
---
Fix transcription errors. Output only the corrected text.
Example 1:
Input: "the java script function isnt working"
Output: "The JavaScript function isn't working."
Example 2:
Input: "check the get ignore file for the repo"
Output: "Check the .gitignore file for the repo."
Example 3:
Input: "we need to refactor the a p i endpoint"
Output: "We need to refactor the API endpoint."
Key terms: MyClass, some_function, PostgreSQL
Names: Alice, Bob
Input: "{{ transcript }}"
Output:
The file is a Jinja template. {{ transcript }} is replaced with the raw transcription. If omitted, the transcript is appended automatically.
The YAML front matter lets you override models per-project. When you dictate into a Terminal tab whose shell is in that directory (or a child), birdword picks up the nearest BIRDWORD.md and uses it.
Hotkeys
| Action | Default |
|---|---|
| Toggle recording | Right ⌘ + Space |
| Hold to record | Hold Right ⌘ for >1s, release to transcribe |
Hotkeys are configurable:
--hold-key KEY Hold key (default: rcmd). Options: rcmd, lcmd, ralt, lalt, rshift, lshift, rctrl, lctrl
--toggle-key KEY Toggle key (default: space). Options: space, return, tab, escape
Options
--model MODEL Transcription model (default: mlx-community/parakeet-tdt-0.6b-v2)
--fix-model MODEL Post-processor model (default: mlx-community/Qwen2.5-1.5B-Instruct-4bit)
--no-fix Disable LLM post-processing
Menu bar
Birdword shows a bird icon in the menu bar:
- ⚪ White — idle
- 🟡 Yellow — connecting mic
- 🔴 Red — listening
- ✨ Sparkles — transcribing
Permissions
Birdword needs three macOS permissions, granted to your terminal app:
- 🎤 Microphone — to record your voice
- 🔐 Accessibility — to paste text and intercept the hotkey
- ⌨️ Input Monitoring — to detect the global hotkey
Birdword checks these on startup and tells you what's missing.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file birdword-0.2.0.tar.gz.
File metadata
- Download URL: birdword-0.2.0.tar.gz
- Upload date:
- Size: 406.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
16b8be7cb8dbc6d967bc921e80e4d76b645287bc1464739e02baaa62608ea410
|
|
| MD5 |
e16d4fdbfde94394040e2d9c28c64972
|
|
| BLAKE2b-256 |
b42cf9ceba472c12ce212fa260a4261e4d7c993b90f7939fa613a1d03f899563
|
Provenance
The following attestation bundles were made for birdword-0.2.0.tar.gz:
Publisher:
main.yaml on tillahoffmann/birdword
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
birdword-0.2.0.tar.gz -
Subject digest:
16b8be7cb8dbc6d967bc921e80e4d76b645287bc1464739e02baaa62608ea410 - Sigstore transparency entry: 1100674066
- Sigstore integration time:
-
Permalink:
tillahoffmann/birdword@0bad3925fa3802f7a0dffb0e8432e971e597061d -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/tillahoffmann
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
main.yaml@0bad3925fa3802f7a0dffb0e8432e971e597061d -
Trigger Event:
push
-
Statement type:
File details
Details for the file birdword-0.2.0-py3-none-any.whl.
File metadata
- Download URL: birdword-0.2.0-py3-none-any.whl
- Upload date:
- Size: 27.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
60f044000512efc564c563e69bad9494d077788991d60a4a57f26228d4f38234
|
|
| MD5 |
51fd1c6f2bd99abdc9fc0684f69ae2a6
|
|
| BLAKE2b-256 |
4c3897788fbabf697a422bce266738279a8f08576358942b62cbcd0859150613
|
Provenance
The following attestation bundles were made for birdword-0.2.0-py3-none-any.whl:
Publisher:
main.yaml on tillahoffmann/birdword
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
birdword-0.2.0-py3-none-any.whl -
Subject digest:
60f044000512efc564c563e69bad9494d077788991d60a4a57f26228d4f38234 - Sigstore transparency entry: 1100674141
- Sigstore integration time:
-
Permalink:
tillahoffmann/birdword@0bad3925fa3802f7a0dffb0e8432e971e597061d -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/tillahoffmann
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
main.yaml@0bad3925fa3802f7a0dffb0e8432e971e597061d -
Trigger Event:
push
-
Statement type: