python-voiceio 0.3.13__tar.gz → 0.4.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. {python_voiceio-0.3.13/python_voiceio.egg-info → python_voiceio-0.4.1}/PKG-INFO +74 -40
  2. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/README.md +67 -35
  3. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/pyproject.toml +7 -5
  4. {python_voiceio-0.3.13 → python_voiceio-0.4.1/python_voiceio.egg-info}/PKG-INFO +74 -40
  5. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/python_voiceio.egg-info/SOURCES.txt +19 -0
  6. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/python_voiceio.egg-info/requires.txt +5 -0
  7. python_voiceio-0.4.1/tests/test_adjudicate.py +288 -0
  8. python_voiceio-0.4.1/tests/test_audio_quality.py +138 -0
  9. python_voiceio-0.4.1/tests/test_audit.py +297 -0
  10. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_autocorrect.py +56 -3
  11. python_voiceio-0.4.1/tests/test_autocorrect_state.py +51 -0
  12. python_voiceio-0.4.1/tests/test_concurrency_lockdown.py +254 -0
  13. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_config.py +1 -1
  14. python_voiceio-0.4.1/tests/test_correct_batch.py +129 -0
  15. python_voiceio-0.4.1/tests/test_ibus_pending.py +38 -0
  16. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_ibus_typer.py +57 -0
  17. python_voiceio-0.4.1/tests/test_postcorrect.py +163 -0
  18. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_prebuffer.py +46 -0
  19. python_voiceio-0.4.1/tests/test_retention.py +99 -0
  20. python_voiceio-0.4.1/tests/test_security_hardening.py +238 -0
  21. python_voiceio-0.4.1/tests/test_snapshots.py +54 -0
  22. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_streaming.py +117 -1
  23. python_voiceio-0.4.1/tests/test_transcriber.py +127 -0
  24. python_voiceio-0.4.1/tests/test_vocabulary.py +162 -0
  25. python_voiceio-0.4.1/tests/test_wizard.py +228 -0
  26. python_voiceio-0.4.1/voiceio/__init__.py +1 -0
  27. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/app.py +380 -90
  28. python_voiceio-0.4.1/voiceio/audit.py +409 -0
  29. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/autocorrect.py +257 -4
  30. python_voiceio-0.4.1/voiceio/autocorrect_state.py +184 -0
  31. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/cli.py +466 -91
  32. python_voiceio-0.4.1/voiceio/config.py +363 -0
  33. python_voiceio-0.4.1/voiceio/consent.py +57 -0
  34. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/corrections.py +37 -3
  35. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/demo.py +2 -2
  36. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/feedback.py +8 -5
  37. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/health.py +13 -4
  38. python_voiceio-0.4.1/voiceio/history.py +181 -0
  39. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/ibus/engine.py +18 -8
  40. python_voiceio-0.4.1/voiceio/ibus/pending.py +43 -0
  41. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/llm_api.py +37 -0
  42. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/platform.py +121 -0
  43. python_voiceio-0.4.1/voiceio/postcorrect.py +207 -0
  44. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/postprocess.py +6 -0
  45. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/prompt.py +10 -2
  46. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/recorder.py +41 -11
  47. python_voiceio-0.4.1/voiceio/retention.py +97 -0
  48. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/service.py +71 -0
  49. python_voiceio-0.4.1/voiceio/snapshots.py +78 -0
  50. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/streaming.py +89 -5
  51. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/transcriber.py +81 -7
  52. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/typers/ibus.py +49 -8
  53. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/typers/ydotool.py +40 -2
  54. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/vad.py +22 -3
  55. python_voiceio-0.4.1/voiceio/vocabulary.py +186 -0
  56. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/wizard.py +443 -84
  57. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/worker.py +23 -3
  58. python_voiceio-0.3.13/tests/test_transcriber.py +0 -69
  59. python_voiceio-0.3.13/tests/test_vocabulary.py +0 -71
  60. python_voiceio-0.3.13/voiceio/__init__.py +0 -1
  61. python_voiceio-0.3.13/voiceio/config.py +0 -196
  62. python_voiceio-0.3.13/voiceio/history.py +0 -64
  63. python_voiceio-0.3.13/voiceio/vocabulary.py +0 -59
  64. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/LICENSE +0 -0
  65. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/python_voiceio.egg-info/dependency_links.txt +0 -0
  66. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/python_voiceio.egg-info/entry_points.txt +0 -0
  67. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/python_voiceio.egg-info/top_level.txt +0 -0
  68. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/setup.cfg +0 -0
  69. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_app_wiring.py +0 -0
  70. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_backend_probes.py +0 -0
  71. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_cli.py +0 -0
  72. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_clipboard_read.py +0 -0
  73. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_commands.py +0 -0
  74. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_corrections.py +0 -0
  75. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_fallback.py +0 -0
  76. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_health.py +0 -0
  77. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_hints.py +0 -0
  78. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_history.py +0 -0
  79. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_llm.py +0 -0
  80. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_llm_api.py +0 -0
  81. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_numbers.py +0 -0
  82. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_platform.py +0 -0
  83. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_postprocess.py +0 -0
  84. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_prompt.py +0 -0
  85. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_recorder_integration.py +0 -0
  86. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_robustness.py +0 -0
  87. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_tts.py +0 -0
  88. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_vad.py +0 -0
  89. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/tests/test_wordfreq.py +0 -0
  90. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/__main__.py +0 -0
  91. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/backends.py +0 -0
  92. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/clipboard_read.py +0 -0
  93. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/commands.py +0 -0
  94. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/hints.py +0 -0
  95. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/hotkeys/__init__.py +0 -0
  96. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/hotkeys/base.py +0 -0
  97. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/hotkeys/chain.py +0 -0
  98. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/hotkeys/evdev.py +0 -0
  99. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/hotkeys/pynput_backend.py +0 -0
  100. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/hotkeys/socket_backend.py +0 -0
  101. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/ibus/__init__.py +0 -0
  102. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/llm.py +0 -0
  103. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/models/__init__.py +0 -0
  104. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/models/silero_vad.onnx +0 -0
  105. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/numbers.py +0 -0
  106. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/pidlock.py +0 -0
  107. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/sounds/__init__.py +0 -0
  108. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/sounds/commit.wav +0 -0
  109. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/sounds/start.wav +0 -0
  110. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/sounds/stop.wav +0 -0
  111. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/tray/__init__.py +0 -0
  112. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/tray/_icons.py +0 -0
  113. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/tray/_indicator.py +0 -0
  114. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/tray/_pystray.py +0 -0
  115. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/tts/__init__.py +0 -0
  116. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/tts/base.py +0 -0
  117. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/tts/chain.py +0 -0
  118. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/tts/edge_engine.py +0 -0
  119. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/tts/espeak.py +0 -0
  120. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/tts/piper_engine.py +0 -0
  121. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/tts/player.py +0 -0
  122. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/typers/__init__.py +0 -0
  123. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/typers/base.py +0 -0
  124. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/typers/chain.py +0 -0
  125. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/typers/clipboard.py +0 -0
  126. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/typers/pynput_type.py +0 -0
  127. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/typers/wtype.py +0 -0
  128. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/typers/xdotool.py +0 -0
  129. {python_voiceio-0.3.13 → python_voiceio-0.4.1}/voiceio/wordfreq.py +0 -0
@@ -1,20 +1,18 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-voiceio
3
- Version: 0.3.13
4
- Summary: Speak → text, locally, instantly.
3
+ Version: 0.4.1
4
+ Summary: Voice dictation for Linux. Speak → text, locally, instantly.
5
5
  Author: Hugo Montenegro
6
6
  License-Expression: MIT
7
7
  Project-URL: Homepage, https://github.com/Hugo0/voiceio
8
8
  Project-URL: Repository, https://github.com/Hugo0/voiceio
9
9
  Project-URL: Issues, https://github.com/Hugo0/voiceio/issues
10
10
  Project-URL: Changelog, https://github.com/Hugo0/voiceio/releases
11
- Keywords: voice,speech-to-text,whisper,linux,windows,dictation,wayland,ibus
11
+ Keywords: voice,speech-to-text,whisper,linux,dictation,wayland,ibus
12
12
  Classifier: Development Status :: 4 - Beta
13
13
  Classifier: Environment :: X11 Applications
14
14
  Classifier: Intended Audience :: End Users/Desktop
15
15
  Classifier: Operating System :: POSIX :: Linux
16
- Classifier: Operating System :: Microsoft :: Windows
17
- Classifier: Operating System :: MacOS
18
16
  Classifier: Programming Language :: Python :: 3
19
17
  Classifier: Topic :: Multimedia :: Sound/Audio :: Speech
20
18
  Requires-Python: >=3.11
@@ -42,6 +40,10 @@ Requires-Dist: edge-tts>=6.1.0; extra == "tts-cloud"
42
40
  Provides-Extra: dev
43
41
  Requires-Dist: pytest>=7.0; extra == "dev"
44
42
  Requires-Dist: pytest-mock; extra == "dev"
43
+ Provides-Extra: linux
44
+ Requires-Dist: pystray>=0.19; extra == "linux"
45
+ Requires-Dist: Pillow>=10.0; extra == "linux"
46
+ Requires-Dist: piper-tts>=1.2.0; extra == "linux"
45
47
  Dynamic: license-file
46
48
 
47
49
  # voiceio
@@ -61,15 +63,24 @@ Dynamic: license-file
61
63
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
62
64
  [![Downloads](https://img.shields.io/pepy/dt/python-voiceio)](https://pepy.tech/projects/python-voiceio)
63
65
 
64
- Speak text, locally, instantly.
66
+ Voice dictation for Linux. Local, yours, and it learns how you speak.
65
67
 
66
68
  https://github.com/user-attachments/assets/9cf5d1ac-b4bb-4cf8-b775-7a66dc16b376
67
69
 
70
+ Open-source, sovereign voice input/output. Your speech is transcribed on your own machine, everything it learns about you stays in local files you own, and it gets better the more you use it.
71
+
72
+ - **Local & sovereign** — speech is transcribed on-device with [faster-whisper](https://github.com/SYSTRAN/faster-whisper); audio never leaves the machine. Your history, retained audio, corrections, and vocabulary all live in plain local files (JSONL / TOML / txt) you can read, edit, and delete. Zero telemetry. The one honest nuance: two *optional, off-by-default* features send text (never audio) to a cloud LLM you configure yourself — final-transcript polish (`[postcorrect]`) and the weekly correction-mining review.
73
+ - **Improves with use — automatically** — every utterance teaches it your words and names. See [How it learns](#how-it-learns).
74
+ - **Linux-first & hackable** — Wayland/X11, GNOME/KDE/sway/i3, chosen automatically by chain-and-probe backends. It's plain Python you can read in an afternoon and [contribute to](CLAUDE.md).
75
+
76
+ > **Linux-first.** voiceio is developed and tested daily on Linux (GNOME/Wayland). Windows and macOS ship as **experimental, untested** targets — the code paths exist but are unmaintained and likely broken. See [Experimental platforms](#experimental-platforms).
77
+
68
78
  ## Quick start
69
79
 
70
80
  ```bash
71
- # 1. Install system dependencies (Ubuntu/Debian)
72
- sudo apt install pipx ibus gir1.2-ibus-1.0 python3-gi python3-dev portaudio19-dev
81
+ # 1. Install system dependencies (Ubuntu/Debian). build-essential + python3-dev
82
+ # are needed to compile evdev (no prebuilt wheel); portaudio for the mic.
83
+ sudo apt install pipx build-essential python3-dev portaudio19-dev ibus gir1.2-ibus-1.0 python3-gi
73
84
 
74
85
  # 2. Install voiceio
75
86
  pipx install python-voiceio
@@ -80,11 +91,14 @@ voiceio setup
80
91
 
81
92
  That's it. Press **Ctrl+Alt+V** (or your chosen hotkey) to start dictating.
82
93
 
94
+ **Installing with an AI agent?** Point it at [INSTALL.md](INSTALL.md) — a terse,
95
+ copy-pasteable runbook (`voiceio setup --defaults` / `--answers '{json}'`, no TTY needed).
96
+
83
97
  <details>
84
98
  <summary><strong>Fedora</strong></summary>
85
99
 
86
100
  ```bash
87
- sudo dnf install pipx ibus python3-gobject python3-devel portaudio-devel
101
+ sudo dnf install pipx gcc gcc-c++ make python3-devel portaudio-devel ibus ibus-libs python3-gobject
88
102
  pipx install python-voiceio
89
103
  voiceio setup
90
104
  ```
@@ -94,36 +108,17 @@ voiceio setup
94
108
  <summary><strong>Arch Linux</strong></summary>
95
109
 
96
110
  ```bash
97
- sudo pacman -S python-pipx ibus python-gobject portaudio
98
- # Note: Arch includes Python headers by default with the python package
111
+ sudo pacman -S python-pipx base-devel portaudio ibus python-gobject
112
+ # base-devel provides gcc/make; the python package ships headers.
99
113
  pipx install python-voiceio
100
114
  voiceio setup
101
115
  ```
102
116
  </details>
103
117
 
104
118
  <details>
105
- <summary><strong>Windows</strong></summary>
119
+ <summary><strong>Windows / macOS (experimental)</strong></summary>
106
120
 
107
- ```powershell
108
- # Option A: Install with pip (requires Python 3.11+)
109
- pip install python-voiceio
110
- voiceio setup
111
-
112
- # Option B: Download the installer from GitHub Releases (no Python needed)
113
- # https://github.com/Hugo0/voiceio/releases
114
- # Also available as a portable .zip if you prefer no installation.
115
- ```
116
-
117
- Windows uses pynput for hotkeys and text injection. No extra system dependencies required.
118
- </details>
119
-
120
- <details>
121
- <summary><strong>macOS</strong></summary>
122
-
123
- ```bash
124
- pipx install python-voiceio
125
- voiceio setup
126
- ```
121
+ See [Experimental platforms](#experimental-platforms) below — these builds are untested and unmaintained.
127
122
  </details>
128
123
 
129
124
  <details>
@@ -152,7 +147,35 @@ hotkey → mic capture → whisper (local) → text at cursor
152
147
  pre-buffered streaming IBus / clipboard
153
148
  ```
154
149
 
155
- Press your hotkey to start recording (1s pre-buffer catches the first syllable). Text streams into the focused app as an underlined preview. Press again to commit. Transcription runs locally via [faster-whisper](https://github.com/SYSTRAN/faster-whisper), text is injected through IBus (any GTK/Qt app) with clipboard fallback for terminals.
150
+ Press your hotkey to start recording (1s pre-buffer catches the first syllable). Text streams into the focused app as an underlined preview. Press again to commit. Transcription runs locally via [faster-whisper](https://github.com/SYSTRAN/faster-whisper), text is injected through IBus (any GTK/Qt app) with clipboard fallback for terminals. It runs in real time on a modern CPU and ships with model tiers from `tiny` to `large-v3`.
151
+
152
+ ## How it learns
153
+
154
+ Most dictation tools transcribe the same way on day 100 as on day 1. voiceio adapts to *you* — your jargon, names, and accent — entirely from data that never leaves your machine.
155
+
156
+ ```mermaid
157
+ flowchart LR
158
+ subgraph live ["every utterance"]
159
+ A["🎙️ dictate"] --> B["store audio + raw text\n+ confidence (local)"]
160
+ A --> C["hotwords + recent context\nbias the Whisper decoder"]
161
+ A --> D["optional LLM pass fixes\nmisheard proper nouns"]
162
+ end
163
+ subgraph weekly ["weekly, in the background"]
164
+ E["mine history for recurring errors\n→ learn corrections + vocabulary\n(safety-gated, multi-vote)"] --> F["teacher model replays your audio\n→ audits what was learned"]
165
+ F -->|"bad rule"| G["auto-retired"]
166
+ F -->|"quality regressed"| H["whole week rolled back"]
167
+ end
168
+ B --> E
169
+ F -->|"confirmed"| C
170
+ ```
171
+
172
+ 1. **Capture** — every utterance stores its audio, raw text, and confidence in local files.
173
+ 2. **Bias** — your vocabulary and recent context steer the Whisper decoder (hotwords / prompt) on every recording.
174
+ 3. **Contextual fix** — an optional LLM pass repairs misheard proper nouns using surrounding context.
175
+ 4. **Mine** — a weekly background job scans your history for recurring errors and auto-learns corrections and vocabulary. Multi-vote adjudication and a protected-languages guard (for bilingual users) keep it safe; it never asks you to triage.
176
+ 5. **Audit** — a teacher model (a larger Whisper) replays your retained audio to verify what was learned. Bad rules are retired automatically, and a system-level drift metric rolls back an entire week of learning if quality regressed.
177
+
178
+ Rules are always **probationary, never tenured** — anything that stops helping is dropped. Your only touchpoint is an occasional desktop notification telling you what was learned.
156
179
 
157
180
  ## Features
158
181
 
@@ -202,7 +225,7 @@ voiceio uninstall Remove all system integrations
202
225
  `voiceio setup` handles everything interactively. To tweak later, edit the config file or override at runtime:
203
226
 
204
227
  - Linux/macOS: `~/.config/voiceio/config.toml`
205
- - Windows: `%LOCALAPPDATA%\voiceio\config\config.toml`
228
+ - Windows: `%LOCALAPPDATA%\voiceio\config\config.toml` (see [Experimental platforms](#experimental-platforms))
206
229
 
207
230
  ```bash
208
231
  voiceio --model large-v3 --language auto -v
@@ -224,12 +247,12 @@ voiceio logs # check debug output
224
247
  | Hotkey doesn't work on Wayland | `sudo usermod -aG input $USER` then log out and back in |
225
248
  | Transcription too slow | Use a smaller model: `voiceio --model tiny` |
226
249
  | Want to start fresh | `voiceio uninstall` then `voiceio setup` |
227
- | Windows: antivirus blocks hotkeys | pynput uses global keyboard hooksadd an exception for voiceio |
228
- | Windows: no sound feedback | Check `voiceio logs` for audio device info |
229
- | macOS issues | Experimental — consider [aquavoice.com](https://aquavoice.com/) or contribute a PR |
250
+ | Windows / macOS issues | These platforms are experimental and untested see [Experimental platforms](#experimental-platforms) |
230
251
 
231
252
  ## Platform support
232
253
 
254
+ voiceio targets **Linux**. That's what it's developed and tested against.
255
+
233
256
  | Platform | Status | Text injection | Hotkeys | Streaming preview |
234
257
  |----------|--------|---------------|---------|-------------------|
235
258
  | Ubuntu / Debian (GNOME, Wayland) | **Tested daily** | IBus | evdev / GNOME shortcut | Yes |
@@ -237,11 +260,22 @@ voiceio logs # check debug output
237
260
  | Fedora (GNOME) | Supported | IBus | evdev / GNOME shortcut | Yes |
238
261
  | Arch Linux | Supported | IBus | evdev | Yes |
239
262
  | KDE / Sway / Hyprland | Should work | IBus / ydotool / wtype | evdev | Yes |
240
- | Windows 10/11 | Experimental | pynput / clipboard | pynput | Type-and-correct (no preedit) |
241
- | macOS | Experimental | pynput / clipboard | pynput | Type-and-correct (no preedit) |
242
263
 
243
264
  voiceio auto-detects your platform and picks the best available backends. Run `voiceio doctor` to see what's working on your system.
244
265
 
266
+ ## Experimental platforms
267
+
268
+ Windows and macOS code paths exist, but they are **experimental, untested, and unmaintained** — the maintainer only develops on Linux, so they may be broken at any given time. No parity with Linux is promised. Contributions are welcome, but please don't file bugs expecting a fix.
269
+
270
+ | Platform | Status | Text injection | Hotkeys | Streaming preview |
271
+ |----------|--------|---------------|---------|-------------------|
272
+ | Windows 10/11 | Experimental / untested | pynput / clipboard | pynput | Type-and-correct (no preedit) |
273
+ | macOS | Experimental / untested | pynput / clipboard | pynput | Type-and-correct (no preedit) |
274
+
275
+ - **Windows:** `pip install python-voiceio` then `voiceio setup` (pynput handles hotkeys + text injection; no system deps). Prebuilt installers may appear on [GitHub Releases](https://github.com/Hugo0/voiceio/releases).
276
+ - **macOS:** `pipx install python-voiceio` then `voiceio setup`. If it doesn't work for you, consider [aquavoice.com](https://aquavoice.com/) or contribute a PR.
277
+ - Config lives at `%LOCALAPPDATA%\voiceio\config\config.toml` (Windows) or `~/.config/voiceio/config.toml` (macOS).
278
+
245
279
  ## Uninstall
246
280
 
247
281
  ```bash
@@ -275,7 +309,7 @@ Contributions welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) and [open issues](
275
309
  - [x] Voice commands — "new line", "new paragraph", "scratch that", punctuation by name
276
310
  - [x] Custom vocabulary / personal dictionary (bias Whisper via `initial_prompt`)
277
311
  - [x] Smart punctuation & capitalization post-processing
278
- - [x] Windows support
312
+ - [x] Windows support (experimental, untested)
279
313
  - [x] System tray icon with animated states
280
314
  - [x] Auto-stop on silence
281
315
 
@@ -15,15 +15,24 @@
15
15
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
16
16
  [![Downloads](https://img.shields.io/pepy/dt/python-voiceio)](https://pepy.tech/projects/python-voiceio)
17
17
 
18
- Speak text, locally, instantly.
18
+ Voice dictation for Linux. Local, yours, and it learns how you speak.
19
19
 
20
20
  https://github.com/user-attachments/assets/9cf5d1ac-b4bb-4cf8-b775-7a66dc16b376
21
21
 
22
+ Open-source, sovereign voice input/output. Your speech is transcribed on your own machine, everything it learns about you stays in local files you own, and it gets better the more you use it.
23
+
24
+ - **Local & sovereign** — speech is transcribed on-device with [faster-whisper](https://github.com/SYSTRAN/faster-whisper); audio never leaves the machine. Your history, retained audio, corrections, and vocabulary all live in plain local files (JSONL / TOML / txt) you can read, edit, and delete. Zero telemetry. The one honest nuance: two *optional, off-by-default* features send text (never audio) to a cloud LLM you configure yourself — final-transcript polish (`[postcorrect]`) and the weekly correction-mining review.
25
+ - **Improves with use — automatically** — every utterance teaches it your words and names. See [How it learns](#how-it-learns).
26
+ - **Linux-first & hackable** — Wayland/X11, GNOME/KDE/sway/i3, chosen automatically by chain-and-probe backends. It's plain Python you can read in an afternoon and [contribute to](CLAUDE.md).
27
+
28
+ > **Linux-first.** voiceio is developed and tested daily on Linux (GNOME/Wayland). Windows and macOS ship as **experimental, untested** targets — the code paths exist but are unmaintained and likely broken. See [Experimental platforms](#experimental-platforms).
29
+
22
30
  ## Quick start
23
31
 
24
32
  ```bash
25
- # 1. Install system dependencies (Ubuntu/Debian)
26
- sudo apt install pipx ibus gir1.2-ibus-1.0 python3-gi python3-dev portaudio19-dev
33
+ # 1. Install system dependencies (Ubuntu/Debian). build-essential + python3-dev
34
+ # are needed to compile evdev (no prebuilt wheel); portaudio for the mic.
35
+ sudo apt install pipx build-essential python3-dev portaudio19-dev ibus gir1.2-ibus-1.0 python3-gi
27
36
 
28
37
  # 2. Install voiceio
29
38
  pipx install python-voiceio
@@ -34,11 +43,14 @@ voiceio setup
34
43
 
35
44
  That's it. Press **Ctrl+Alt+V** (or your chosen hotkey) to start dictating.
36
45
 
46
+ **Installing with an AI agent?** Point it at [INSTALL.md](INSTALL.md) — a terse,
47
+ copy-pasteable runbook (`voiceio setup --defaults` / `--answers '{json}'`, no TTY needed).
48
+
37
49
  <details>
38
50
  <summary><strong>Fedora</strong></summary>
39
51
 
40
52
  ```bash
41
- sudo dnf install pipx ibus python3-gobject python3-devel portaudio-devel
53
+ sudo dnf install pipx gcc gcc-c++ make python3-devel portaudio-devel ibus ibus-libs python3-gobject
42
54
  pipx install python-voiceio
43
55
  voiceio setup
44
56
  ```
@@ -48,36 +60,17 @@ voiceio setup
48
60
  <summary><strong>Arch Linux</strong></summary>
49
61
 
50
62
  ```bash
51
- sudo pacman -S python-pipx ibus python-gobject portaudio
52
- # Note: Arch includes Python headers by default with the python package
63
+ sudo pacman -S python-pipx base-devel portaudio ibus python-gobject
64
+ # base-devel provides gcc/make; the python package ships headers.
53
65
  pipx install python-voiceio
54
66
  voiceio setup
55
67
  ```
56
68
  </details>
57
69
 
58
70
  <details>
59
- <summary><strong>Windows</strong></summary>
71
+ <summary><strong>Windows / macOS (experimental)</strong></summary>
60
72
 
61
- ```powershell
62
- # Option A: Install with pip (requires Python 3.11+)
63
- pip install python-voiceio
64
- voiceio setup
65
-
66
- # Option B: Download the installer from GitHub Releases (no Python needed)
67
- # https://github.com/Hugo0/voiceio/releases
68
- # Also available as a portable .zip if you prefer no installation.
69
- ```
70
-
71
- Windows uses pynput for hotkeys and text injection. No extra system dependencies required.
72
- </details>
73
-
74
- <details>
75
- <summary><strong>macOS</strong></summary>
76
-
77
- ```bash
78
- pipx install python-voiceio
79
- voiceio setup
80
- ```
73
+ See [Experimental platforms](#experimental-platforms) below — these builds are untested and unmaintained.
81
74
  </details>
82
75
 
83
76
  <details>
@@ -106,7 +99,35 @@ hotkey → mic capture → whisper (local) → text at cursor
106
99
  pre-buffered streaming IBus / clipboard
107
100
  ```
108
101
 
109
- Press your hotkey to start recording (1s pre-buffer catches the first syllable). Text streams into the focused app as an underlined preview. Press again to commit. Transcription runs locally via [faster-whisper](https://github.com/SYSTRAN/faster-whisper), text is injected through IBus (any GTK/Qt app) with clipboard fallback for terminals.
102
+ Press your hotkey to start recording (1s pre-buffer catches the first syllable). Text streams into the focused app as an underlined preview. Press again to commit. Transcription runs locally via [faster-whisper](https://github.com/SYSTRAN/faster-whisper), text is injected through IBus (any GTK/Qt app) with clipboard fallback for terminals. It runs in real time on a modern CPU and ships with model tiers from `tiny` to `large-v3`.
103
+
104
+ ## How it learns
105
+
106
+ Most dictation tools transcribe the same way on day 100 as on day 1. voiceio adapts to *you* — your jargon, names, and accent — entirely from data that never leaves your machine.
107
+
108
+ ```mermaid
109
+ flowchart LR
110
+ subgraph live ["every utterance"]
111
+ A["🎙️ dictate"] --> B["store audio + raw text\n+ confidence (local)"]
112
+ A --> C["hotwords + recent context\nbias the Whisper decoder"]
113
+ A --> D["optional LLM pass fixes\nmisheard proper nouns"]
114
+ end
115
+ subgraph weekly ["weekly, in the background"]
116
+ E["mine history for recurring errors\n→ learn corrections + vocabulary\n(safety-gated, multi-vote)"] --> F["teacher model replays your audio\n→ audits what was learned"]
117
+ F -->|"bad rule"| G["auto-retired"]
118
+ F -->|"quality regressed"| H["whole week rolled back"]
119
+ end
120
+ B --> E
121
+ F -->|"confirmed"| C
122
+ ```
123
+
124
+ 1. **Capture** — every utterance stores its audio, raw text, and confidence in local files.
125
+ 2. **Bias** — your vocabulary and recent context steer the Whisper decoder (hotwords / prompt) on every recording.
126
+ 3. **Contextual fix** — an optional LLM pass repairs misheard proper nouns using surrounding context.
127
+ 4. **Mine** — a weekly background job scans your history for recurring errors and auto-learns corrections and vocabulary. Multi-vote adjudication and a protected-languages guard (for bilingual users) keep it safe; it never asks you to triage.
128
+ 5. **Audit** — a teacher model (a larger Whisper) replays your retained audio to verify what was learned. Bad rules are retired automatically, and a system-level drift metric rolls back an entire week of learning if quality regressed.
129
+
130
+ Rules are always **probationary, never tenured** — anything that stops helping is dropped. Your only touchpoint is an occasional desktop notification telling you what was learned.
110
131
 
111
132
  ## Features
112
133
 
@@ -156,7 +177,7 @@ voiceio uninstall Remove all system integrations
156
177
  `voiceio setup` handles everything interactively. To tweak later, edit the config file or override at runtime:
157
178
 
158
179
  - Linux/macOS: `~/.config/voiceio/config.toml`
159
- - Windows: `%LOCALAPPDATA%\voiceio\config\config.toml`
180
+ - Windows: `%LOCALAPPDATA%\voiceio\config\config.toml` (see [Experimental platforms](#experimental-platforms))
160
181
 
161
182
  ```bash
162
183
  voiceio --model large-v3 --language auto -v
@@ -178,12 +199,12 @@ voiceio logs # check debug output
178
199
  | Hotkey doesn't work on Wayland | `sudo usermod -aG input $USER` then log out and back in |
179
200
  | Transcription too slow | Use a smaller model: `voiceio --model tiny` |
180
201
  | Want to start fresh | `voiceio uninstall` then `voiceio setup` |
181
- | Windows: antivirus blocks hotkeys | pynput uses global keyboard hooksadd an exception for voiceio |
182
- | Windows: no sound feedback | Check `voiceio logs` for audio device info |
183
- | macOS issues | Experimental — consider [aquavoice.com](https://aquavoice.com/) or contribute a PR |
202
+ | Windows / macOS issues | These platforms are experimental and untested see [Experimental platforms](#experimental-platforms) |
184
203
 
185
204
  ## Platform support
186
205
 
206
+ voiceio targets **Linux**. That's what it's developed and tested against.
207
+
187
208
  | Platform | Status | Text injection | Hotkeys | Streaming preview |
188
209
  |----------|--------|---------------|---------|-------------------|
189
210
  | Ubuntu / Debian (GNOME, Wayland) | **Tested daily** | IBus | evdev / GNOME shortcut | Yes |
@@ -191,11 +212,22 @@ voiceio logs # check debug output
191
212
  | Fedora (GNOME) | Supported | IBus | evdev / GNOME shortcut | Yes |
192
213
  | Arch Linux | Supported | IBus | evdev | Yes |
193
214
  | KDE / Sway / Hyprland | Should work | IBus / ydotool / wtype | evdev | Yes |
194
- | Windows 10/11 | Experimental | pynput / clipboard | pynput | Type-and-correct (no preedit) |
195
- | macOS | Experimental | pynput / clipboard | pynput | Type-and-correct (no preedit) |
196
215
 
197
216
  voiceio auto-detects your platform and picks the best available backends. Run `voiceio doctor` to see what's working on your system.
198
217
 
218
+ ## Experimental platforms
219
+
220
+ Windows and macOS code paths exist, but they are **experimental, untested, and unmaintained** — the maintainer only develops on Linux, so they may be broken at any given time. No parity with Linux is promised. Contributions are welcome, but please don't file bugs expecting a fix.
221
+
222
+ | Platform | Status | Text injection | Hotkeys | Streaming preview |
223
+ |----------|--------|---------------|---------|-------------------|
224
+ | Windows 10/11 | Experimental / untested | pynput / clipboard | pynput | Type-and-correct (no preedit) |
225
+ | macOS | Experimental / untested | pynput / clipboard | pynput | Type-and-correct (no preedit) |
226
+
227
+ - **Windows:** `pip install python-voiceio` then `voiceio setup` (pynput handles hotkeys + text injection; no system deps). Prebuilt installers may appear on [GitHub Releases](https://github.com/Hugo0/voiceio/releases).
228
+ - **macOS:** `pipx install python-voiceio` then `voiceio setup`. If it doesn't work for you, consider [aquavoice.com](https://aquavoice.com/) or contribute a PR.
229
+ - Config lives at `%LOCALAPPDATA%\voiceio\config\config.toml` (Windows) or `~/.config/voiceio/config.toml` (macOS).
230
+
199
231
  ## Uninstall
200
232
 
201
233
  ```bash
@@ -229,7 +261,7 @@ Contributions welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) and [open issues](
229
261
  - [x] Voice commands — "new line", "new paragraph", "scratch that", punctuation by name
230
262
  - [x] Custom vocabulary / personal dictionary (bias Whisper via `initial_prompt`)
231
263
  - [x] Smart punctuation & capitalization post-processing
232
- - [x] Windows support
264
+ - [x] Windows support (experimental, untested)
233
265
  - [x] System tray icon with animated states
234
266
  - [x] Auto-stop on silence
235
267
 
@@ -4,20 +4,18 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "python-voiceio"
7
- version = "0.3.13"
8
- description = "Speak → text, locally, instantly."
7
+ version = "0.4.1"
8
+ description = "Voice dictation for Linux. Speak → text, locally, instantly."
9
9
  readme = "README.md"
10
10
  license = "MIT"
11
11
  requires-python = ">=3.11"
12
12
  authors = [{ name = "Hugo Montenegro" }]
13
- keywords = ["voice", "speech-to-text", "whisper", "linux", "windows", "dictation", "wayland", "ibus"]
13
+ keywords = ["voice", "speech-to-text", "whisper", "linux", "dictation", "wayland", "ibus"]
14
14
  classifiers = [
15
15
  "Development Status :: 4 - Beta",
16
16
  "Environment :: X11 Applications",
17
17
  "Intended Audience :: End Users/Desktop",
18
18
  "Operating System :: POSIX :: Linux",
19
- "Operating System :: Microsoft :: Windows",
20
- "Operating System :: MacOS",
21
19
  "Programming Language :: Python :: 3",
22
20
  "Topic :: Multimedia :: Sound/Audio :: Speech",
23
21
  ]
@@ -39,6 +37,10 @@ tray = ["pystray>=0.19", "Pillow>=10.0"]
39
37
  tts = ["piper-tts>=1.2.0"]
40
38
  tts-cloud = ["edge-tts>=6.1.0"]
41
39
  dev = ["pytest>=7.0", "pytest-mock"]
40
+ # Convenience bundle for a full Linux install (tray icon + local TTS). The core
41
+ # Linux deps (evdev, sounddevice) are already unconditional; system packages
42
+ # (IBus, PortAudio, a C toolchain) are installed separately — see README.
43
+ linux = ["pystray>=0.19", "Pillow>=10.0", "piper-tts>=1.2.0"]
42
44
 
43
45
  [project.urls]
44
46
  Homepage = "https://github.com/Hugo0/voiceio"
@@ -1,20 +1,18 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-voiceio
3
- Version: 0.3.13
4
- Summary: Speak → text, locally, instantly.
3
+ Version: 0.4.1
4
+ Summary: Voice dictation for Linux. Speak → text, locally, instantly.
5
5
  Author: Hugo Montenegro
6
6
  License-Expression: MIT
7
7
  Project-URL: Homepage, https://github.com/Hugo0/voiceio
8
8
  Project-URL: Repository, https://github.com/Hugo0/voiceio
9
9
  Project-URL: Issues, https://github.com/Hugo0/voiceio/issues
10
10
  Project-URL: Changelog, https://github.com/Hugo0/voiceio/releases
11
- Keywords: voice,speech-to-text,whisper,linux,windows,dictation,wayland,ibus
11
+ Keywords: voice,speech-to-text,whisper,linux,dictation,wayland,ibus
12
12
  Classifier: Development Status :: 4 - Beta
13
13
  Classifier: Environment :: X11 Applications
14
14
  Classifier: Intended Audience :: End Users/Desktop
15
15
  Classifier: Operating System :: POSIX :: Linux
16
- Classifier: Operating System :: Microsoft :: Windows
17
- Classifier: Operating System :: MacOS
18
16
  Classifier: Programming Language :: Python :: 3
19
17
  Classifier: Topic :: Multimedia :: Sound/Audio :: Speech
20
18
  Requires-Python: >=3.11
@@ -42,6 +40,10 @@ Requires-Dist: edge-tts>=6.1.0; extra == "tts-cloud"
42
40
  Provides-Extra: dev
43
41
  Requires-Dist: pytest>=7.0; extra == "dev"
44
42
  Requires-Dist: pytest-mock; extra == "dev"
43
+ Provides-Extra: linux
44
+ Requires-Dist: pystray>=0.19; extra == "linux"
45
+ Requires-Dist: Pillow>=10.0; extra == "linux"
46
+ Requires-Dist: piper-tts>=1.2.0; extra == "linux"
45
47
  Dynamic: license-file
46
48
 
47
49
  # voiceio
@@ -61,15 +63,24 @@ Dynamic: license-file
61
63
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
62
64
  [![Downloads](https://img.shields.io/pepy/dt/python-voiceio)](https://pepy.tech/projects/python-voiceio)
63
65
 
64
- Speak text, locally, instantly.
66
+ Voice dictation for Linux. Local, yours, and it learns how you speak.
65
67
 
66
68
  https://github.com/user-attachments/assets/9cf5d1ac-b4bb-4cf8-b775-7a66dc16b376
67
69
 
70
+ Open-source, sovereign voice input/output. Your speech is transcribed on your own machine, everything it learns about you stays in local files you own, and it gets better the more you use it.
71
+
72
+ - **Local & sovereign** — speech is transcribed on-device with [faster-whisper](https://github.com/SYSTRAN/faster-whisper); audio never leaves the machine. Your history, retained audio, corrections, and vocabulary all live in plain local files (JSONL / TOML / txt) you can read, edit, and delete. Zero telemetry. The one honest nuance: two *optional, off-by-default* features send text (never audio) to a cloud LLM you configure yourself — final-transcript polish (`[postcorrect]`) and the weekly correction-mining review.
73
+ - **Improves with use — automatically** — every utterance teaches it your words and names. See [How it learns](#how-it-learns).
74
+ - **Linux-first & hackable** — Wayland/X11, GNOME/KDE/sway/i3, chosen automatically by chain-and-probe backends. It's plain Python you can read in an afternoon and [contribute to](CLAUDE.md).
75
+
76
+ > **Linux-first.** voiceio is developed and tested daily on Linux (GNOME/Wayland). Windows and macOS ship as **experimental, untested** targets — the code paths exist but are unmaintained and likely broken. See [Experimental platforms](#experimental-platforms).
77
+
68
78
  ## Quick start
69
79
 
70
80
  ```bash
71
- # 1. Install system dependencies (Ubuntu/Debian)
72
- sudo apt install pipx ibus gir1.2-ibus-1.0 python3-gi python3-dev portaudio19-dev
81
+ # 1. Install system dependencies (Ubuntu/Debian). build-essential + python3-dev
82
+ # are needed to compile evdev (no prebuilt wheel); portaudio for the mic.
83
+ sudo apt install pipx build-essential python3-dev portaudio19-dev ibus gir1.2-ibus-1.0 python3-gi
73
84
 
74
85
  # 2. Install voiceio
75
86
  pipx install python-voiceio
@@ -80,11 +91,14 @@ voiceio setup
80
91
 
81
92
  That's it. Press **Ctrl+Alt+V** (or your chosen hotkey) to start dictating.
82
93
 
94
+ **Installing with an AI agent?** Point it at [INSTALL.md](INSTALL.md) — a terse,
95
+ copy-pasteable runbook (`voiceio setup --defaults` / `--answers '{json}'`, no TTY needed).
96
+
83
97
  <details>
84
98
  <summary><strong>Fedora</strong></summary>
85
99
 
86
100
  ```bash
87
- sudo dnf install pipx ibus python3-gobject python3-devel portaudio-devel
101
+ sudo dnf install pipx gcc gcc-c++ make python3-devel portaudio-devel ibus ibus-libs python3-gobject
88
102
  pipx install python-voiceio
89
103
  voiceio setup
90
104
  ```
@@ -94,36 +108,17 @@ voiceio setup
94
108
  <summary><strong>Arch Linux</strong></summary>
95
109
 
96
110
  ```bash
97
- sudo pacman -S python-pipx ibus python-gobject portaudio
98
- # Note: Arch includes Python headers by default with the python package
111
+ sudo pacman -S python-pipx base-devel portaudio ibus python-gobject
112
+ # base-devel provides gcc/make; the python package ships headers.
99
113
  pipx install python-voiceio
100
114
  voiceio setup
101
115
  ```
102
116
  </details>
103
117
 
104
118
  <details>
105
- <summary><strong>Windows</strong></summary>
119
+ <summary><strong>Windows / macOS (experimental)</strong></summary>
106
120
 
107
- ```powershell
108
- # Option A: Install with pip (requires Python 3.11+)
109
- pip install python-voiceio
110
- voiceio setup
111
-
112
- # Option B: Download the installer from GitHub Releases (no Python needed)
113
- # https://github.com/Hugo0/voiceio/releases
114
- # Also available as a portable .zip if you prefer no installation.
115
- ```
116
-
117
- Windows uses pynput for hotkeys and text injection. No extra system dependencies required.
118
- </details>
119
-
120
- <details>
121
- <summary><strong>macOS</strong></summary>
122
-
123
- ```bash
124
- pipx install python-voiceio
125
- voiceio setup
126
- ```
121
+ See [Experimental platforms](#experimental-platforms) below — these builds are untested and unmaintained.
127
122
  </details>
128
123
 
129
124
  <details>
@@ -152,7 +147,35 @@ hotkey → mic capture → whisper (local) → text at cursor
152
147
  pre-buffered streaming IBus / clipboard
153
148
  ```
154
149
 
155
- Press your hotkey to start recording (1s pre-buffer catches the first syllable). Text streams into the focused app as an underlined preview. Press again to commit. Transcription runs locally via [faster-whisper](https://github.com/SYSTRAN/faster-whisper), text is injected through IBus (any GTK/Qt app) with clipboard fallback for terminals.
150
+ Press your hotkey to start recording (1s pre-buffer catches the first syllable). Text streams into the focused app as an underlined preview. Press again to commit. Transcription runs locally via [faster-whisper](https://github.com/SYSTRAN/faster-whisper), text is injected through IBus (any GTK/Qt app) with clipboard fallback for terminals. It runs in real time on a modern CPU and ships with model tiers from `tiny` to `large-v3`.
151
+
152
+ ## How it learns
153
+
154
+ Most dictation tools transcribe the same way on day 100 as on day 1. voiceio adapts to *you* — your jargon, names, and accent — entirely from data that never leaves your machine.
155
+
156
+ ```mermaid
157
+ flowchart LR
158
+ subgraph live ["every utterance"]
159
+ A["🎙️ dictate"] --> B["store audio + raw text\n+ confidence (local)"]
160
+ A --> C["hotwords + recent context\nbias the Whisper decoder"]
161
+ A --> D["optional LLM pass fixes\nmisheard proper nouns"]
162
+ end
163
+ subgraph weekly ["weekly, in the background"]
164
+ E["mine history for recurring errors\n→ learn corrections + vocabulary\n(safety-gated, multi-vote)"] --> F["teacher model replays your audio\n→ audits what was learned"]
165
+ F -->|"bad rule"| G["auto-retired"]
166
+ F -->|"quality regressed"| H["whole week rolled back"]
167
+ end
168
+ B --> E
169
+ F -->|"confirmed"| C
170
+ ```
171
+
172
+ 1. **Capture** — every utterance stores its audio, raw text, and confidence in local files.
173
+ 2. **Bias** — your vocabulary and recent context steer the Whisper decoder (hotwords / prompt) on every recording.
174
+ 3. **Contextual fix** — an optional LLM pass repairs misheard proper nouns using surrounding context.
175
+ 4. **Mine** — a weekly background job scans your history for recurring errors and auto-learns corrections and vocabulary. Multi-vote adjudication and a protected-languages guard (for bilingual users) keep it safe; it never asks you to triage.
176
+ 5. **Audit** — a teacher model (a larger Whisper) replays your retained audio to verify what was learned. Bad rules are retired automatically, and a system-level drift metric rolls back an entire week of learning if quality regressed.
177
+
178
+ Rules are always **probationary, never tenured** — anything that stops helping is dropped. Your only touchpoint is an occasional desktop notification telling you what was learned.
156
179
 
157
180
  ## Features
158
181
 
@@ -202,7 +225,7 @@ voiceio uninstall Remove all system integrations
202
225
  `voiceio setup` handles everything interactively. To tweak later, edit the config file or override at runtime:
203
226
 
204
227
  - Linux/macOS: `~/.config/voiceio/config.toml`
205
- - Windows: `%LOCALAPPDATA%\voiceio\config\config.toml`
228
+ - Windows: `%LOCALAPPDATA%\voiceio\config\config.toml` (see [Experimental platforms](#experimental-platforms))
206
229
 
207
230
  ```bash
208
231
  voiceio --model large-v3 --language auto -v
@@ -224,12 +247,12 @@ voiceio logs # check debug output
224
247
  | Hotkey doesn't work on Wayland | `sudo usermod -aG input $USER` then log out and back in |
225
248
  | Transcription too slow | Use a smaller model: `voiceio --model tiny` |
226
249
  | Want to start fresh | `voiceio uninstall` then `voiceio setup` |
227
- | Windows: antivirus blocks hotkeys | pynput uses global keyboard hooksadd an exception for voiceio |
228
- | Windows: no sound feedback | Check `voiceio logs` for audio device info |
229
- | macOS issues | Experimental — consider [aquavoice.com](https://aquavoice.com/) or contribute a PR |
250
+ | Windows / macOS issues | These platforms are experimental and untested see [Experimental platforms](#experimental-platforms) |
230
251
 
231
252
  ## Platform support
232
253
 
254
+ voiceio targets **Linux**. That's what it's developed and tested against.
255
+
233
256
  | Platform | Status | Text injection | Hotkeys | Streaming preview |
234
257
  |----------|--------|---------------|---------|-------------------|
235
258
  | Ubuntu / Debian (GNOME, Wayland) | **Tested daily** | IBus | evdev / GNOME shortcut | Yes |
@@ -237,11 +260,22 @@ voiceio logs # check debug output
237
260
  | Fedora (GNOME) | Supported | IBus | evdev / GNOME shortcut | Yes |
238
261
  | Arch Linux | Supported | IBus | evdev | Yes |
239
262
  | KDE / Sway / Hyprland | Should work | IBus / ydotool / wtype | evdev | Yes |
240
- | Windows 10/11 | Experimental | pynput / clipboard | pynput | Type-and-correct (no preedit) |
241
- | macOS | Experimental | pynput / clipboard | pynput | Type-and-correct (no preedit) |
242
263
 
243
264
  voiceio auto-detects your platform and picks the best available backends. Run `voiceio doctor` to see what's working on your system.
244
265
 
266
+ ## Experimental platforms
267
+
268
+ Windows and macOS code paths exist, but they are **experimental, untested, and unmaintained** — the maintainer only develops on Linux, so they may be broken at any given time. No parity with Linux is promised. Contributions are welcome, but please don't file bugs expecting a fix.
269
+
270
+ | Platform | Status | Text injection | Hotkeys | Streaming preview |
271
+ |----------|--------|---------------|---------|-------------------|
272
+ | Windows 10/11 | Experimental / untested | pynput / clipboard | pynput | Type-and-correct (no preedit) |
273
+ | macOS | Experimental / untested | pynput / clipboard | pynput | Type-and-correct (no preedit) |
274
+
275
+ - **Windows:** `pip install python-voiceio` then `voiceio setup` (pynput handles hotkeys + text injection; no system deps). Prebuilt installers may appear on [GitHub Releases](https://github.com/Hugo0/voiceio/releases).
276
+ - **macOS:** `pipx install python-voiceio` then `voiceio setup`. If it doesn't work for you, consider [aquavoice.com](https://aquavoice.com/) or contribute a PR.
277
+ - Config lives at `%LOCALAPPDATA%\voiceio\config\config.toml` (Windows) or `~/.config/voiceio/config.toml` (macOS).
278
+
245
279
  ## Uninstall
246
280
 
247
281
  ```bash
@@ -275,7 +309,7 @@ Contributions welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) and [open issues](
275
309
  - [x] Voice commands — "new line", "new paragraph", "scratch that", punctuation by name
276
310
  - [x] Custom vocabulary / personal dictionary (bias Whisper via `initial_prompt`)
277
311
  - [x] Smart punctuation & capitalization post-processing
278
- - [x] Windows support
312
+ - [x] Windows support (experimental, untested)
279
313
  - [x] System tray icon with animated states
280
314
  - [x] Auto-stop on silence
281
315