A review-first dictation desk for Linux, macOS, and Windows. Speak a draft, inspect the ordered transcript, edit it, then decide what to copy or export.
The project is implemented as one native Rust application. The current main
branch contains the portable core, the CPAL microphone adapter, the explicit
Groq provider boundary, the egui desktop interface, and diagnostic commands.
The old Python runtime was removed from main; historical release assets are
not Rust artifacts and are not used by the current build.
Actual macOS arm64 build, captured locally with no provider key configured.
Most voice-typing tools inject words into whichever application currently has focus. Voice Transcriber gives the words a checkpoint first, which fits prompts, emails, tickets, notes, and other drafts that need review before they are shared.
microphone -> local PCM conversion -> local VAD -> explicit provider -> edit -> copy/export
The default provider path uses Groq Whisper. Silence detection, resampling, the input meter, ordering, and the review document stay local. Completed speech segments cross the cloud boundary only after a key is configured and the user confirms that boundary in Settings.
- Native egui desktop window with a dark, keyboard-friendly review workspace.
- CPAL input discovery on the host backend, opaque device identities, bounded frame queue, level meter, mono downmix, and resampling to 16 kHz PCM16.
- Local WebRTC VAD with minimum speech, silence, and maximum segment limits.
- Groq worker with a bounded request queue, WAV encoding, translation support, ordered request events, and credential-safe error messages.
- Editable transcript with segment states, undo/redo, clear, clipboard copy, text/Markdown export, and opt-in bounded text-only history.
- Non-network diagnostics that can be scripted in CI or support reports:
--doctor,--list-devices,--check-config, and a three-second real--test-microphonesmoke test.
The Rust GUI has been compiled locally on macOS arm64. A real microphone smoke
test has opened a local input and received PCM frames on this Mac. The GitHub
release v1.2.0 publishes Linux x86_64, macOS arm64, and Windows x86_64
archives; their checksums and archive contents were verified, and the downloaded
macOS app reports 1.2.0 through --version and --doctor --json. Linux and
Windows binaries still need runtime and hardware evidence on those platforms.
Provider requests with a user key remain a separate validation gate.
Install Rust 1.95 or newer. On macOS, install Xcode Command Line Tools. On Windows, install the MSVC Rust toolchain and its Visual Studio build tools. On Linux, install the development headers for the audio backend and the windowing stack used by your distribution (usually ALSA/PipeWire plus X11 or Wayland).
git clone https://github.com/OthmaneBlial/audio-capture.git
cd audio-capture
cargo run -- --doctor
cargo run -- --list-devices
cargo runThe first GUI launch may require the operating system's microphone permission. Use the Test microphone button before enabling cloud transcription.
Useful scripted checks:
cargo test --all-targets
cargo clippy --all-targets -- -D warnings
cargo run -- --check-config --json
cargo run -- --test-microphone --jsonThe diagnostic commands never send audio to Groq. --doctor checks local
configuration and input-device availability; it does not perform a provider
probe.
The effective key comes from GROQ_API_KEY when present, otherwise from the
local Settings field. The key is never printed by the application or included
in provider events.
export GROQ_API_KEY="your-key"
cargo runIn Settings, select a language or automatic detection, optionally enable English translation, and explicitly confirm that completed speech is sent to Groq over HTTPS. Without both consent and a plausible key, Start listening stays blocked; Test microphone remains local.
| Data | Rust behavior |
|---|---|
| Microphone frames | Bounded in memory; never written as audio files |
| VAD and input level | Computed locally |
| Completed speech segment | Encoded in memory and sent to Groq only after consent |
| Transcript | Editable in the current desk; copy/export is explicit |
| Optional history | Text only, off by default, bounded and retention-limited |
| API key | Environment or local configuration; excluded from logs/events |
| Analytics | None implemented |
Provider-side processing follows the provider account and current policy. See
docs/PRIVACY.md, docs/DATA-FLOW.md,
and docs/THREAT-MODEL.md before using sensitive audio.
src/config.rs validated settings and atomic persistence
src/audio.rs CPAL devices, conversion, bounded PCM frame queue
src/vad.rs local WebRTC VAD segmentation
src/provider.rs consent gate, bounded Groq worker, safe events
src/transcript.rs ordered review document and undo/redo
src/exports.rs atomic text/Markdown exports
src/history.rs opt-in bounded text history
src/app.rs egui desktop adapter
src/main.rs GUI entry point and diagnostic CLI
The core modules are intentionally independent of egui and microphone access, so storage, ordering, safety limits, and provider contracts can be tested on a machine without a key or an audio device.
Rust release archives are built by .github/workflows/rust-release.yml
for Linux x86_64, macOS arm64, and Windows x86_64. The published v1.2.0
release
contains each native binary and a SHA-256 checksum. The macOS downloaded app
was exercised locally; Linux and Windows release binaries still need runtime
evidence on their respective hosts.
The old Python/GTK package is historical and is not a supported installation
path for the Rust application. Use the current release page and
packaging/native/README.md for the native
archives.
See ROADMAP.md for the implementation order and acceptance
criteria. Do not use an old release asset as a Rust build artifact.
Start with cargo test --locked --all-targets, cargo fmt --all -- --check,
and cargo clippy --locked --all-targets -- -D warnings. Changes that touch audio or the
provider boundary should include deterministic tests and a note about the
platform evidence they require. Never commit API keys, raw recordings,
personal configuration files, or screenshots containing sensitive text.
Bug reports and compatibility reports should include the output of
voice-transcriber --doctor --json and the host OS/audio backend, without
including credentials or recordings. Security reports belong in
SECURITY.md, not in a public issue.
Released under the MIT License.
