100% offline, Whisper-powered voice notes from your terminal
Project description
hark 😇
100% offline voice notes from your terminal
Use Cases
- Voice-to-LLM pipelines —
hark | llmturns speech into AI prompts instantly - Meeting minutes — Transcribe calls with speaker identification (
--diarize) - System audio capture — Record what you hear, not just what you say (
--input speaker) - Private by design — No cloud, no API keys, no data leaves your machine
Features
- 🎙️ Instant Recording - One keypress to capture your thoughts
- 🔊 Multi-Source Capture - Record microphone, system audio, or both simultaneously
- ✨ High-Accuracy Transcription - State-of-the-art speech recognition for crystal-clear text
- 🗣️ Speaker Diarization - Automatically identify and label who said what
- 🔒 Complete Privacy - 100% offline processing, your audio never leaves your device
- 📄 Flexible Output - Export as plain text, markdown, or SRT subtitles
- 🌍 Multilingual Support - Transcribe in dozens of languages with automatic detection
- ⚡ Blazing Fast - Hardware-accelerated processing for near real-time results
Installation
pipx install hark-cli
System Dependencies
Ubuntu/Debian:
sudo apt install portaudio19-dev
macOS:
brew install portaudio
Windows:
No system dependencies required. Audio libraries are bundled with the Python packages.
Quick Start
# Record and print to stdout
hark
# Save to file
hark notes.txt
# Use larger model for better accuracy
hark --model large-v3 meeting.md
# Transcribe in German
hark --lang de notes.txt
# Output as SRT subtitles
hark --format srt captions.srt
# Capture system audio (e.g., online meetings)
hark --input speaker meeting.txt
# Capture both microphone and system audio (stereo: L=mic, R=speaker)
hark --input both conversation.txt
Configuration
Hark uses a YAML config file at ~/.config/hark/config.yaml. CLI flags override config file settings.
# ~/.config/hark/config.yaml
recording:
sample_rate: 16000
channels: 1 # Use 2 for --input both
max_duration: 600
input_source: mic # mic, speaker, or both
whisper:
model: base # tiny, base, small, medium, large, large-v2, large-v3
language: auto # auto, en, de, fr, es, ...
device: auto # auto, cpu, cuda
preprocessing:
noise_reduction:
enabled: true
strength: 0.5 # 0.0-1.0
normalization:
enabled: true
silence_trimming:
enabled: true
output:
format: plain # plain, markdown, srt
timestamps: false
diarization:
hf_token: null # HuggingFace token (required for --diarize)
local_speaker_name: null # Your name in stereo mode, or null for SPEAKER_00
Audio Input Sources
Hark supports three input modes via --input or recording.input_source:
| Mode | Description |
|---|---|
mic |
Microphone only (default) |
speaker |
System audio only (loopback capture) |
both |
Microphone + system audio as stereo (L=mic, R=speaker) |
System Audio Capture
System audio capture (--input speaker or --input both) works differently on each platform:
Linux (PulseAudio/PipeWire):
Uses monitor sources automatically. To verify your system supports it:
pactl list sources | grep -i monitor
You should see output like:
Name: alsa_output.pci-0000_00_1f.3.analog-stereo.monitor
Description: Monitor of Built-in Audio
macOS:
Requires BlackHole virtual audio driver:
-
Install BlackHole:
brew install blackhole-2ch
-
Open Audio MIDI Setup (in Applications → Utilities)
-
Click + → Create Multi-Output Device
-
Check both your speakers/headphones AND BlackHole 2ch
-
Set the Multi-Output Device as your default output in System Preferences → Sound
Now hark can capture system audio through BlackHole.
Windows 10/11:
Uses WASAPI loopback automatically. No setup required—just ensure your audio output device is working.
Speaker Diarization
Identify who said what in multi-speaker recordings using WhisperX.
Setup
-
Install diarization dependencies:
pipx inject hark-cli whisperx # Or with pip: pip install hark-cli[diarization]
-
Get a HuggingFace token (required for pyannote models):
- Create account at https://huggingface.co
- Accept model licenses:
- Create token at https://huggingface.co/settings/tokens
-
Add token to config:
# ~/.config/hark/config.yaml diarization: hf_token: "hf_xxxxxxxxxxxxx"
Usage
The --diarize flag enables speaker identification. It requires --input speaker or --input both.
# Transcribe a meeting with speaker identification
hark --diarize --input speaker meeting.txt
# Specify expected number of speakers (improves accuracy)
hark --diarize --speakers 3 --input speaker meeting.md
# Skip interactive speaker naming for batch processing
hark --diarize --no-interactive --input speaker meeting.txt
# Stereo mode: separate local user from remote speakers
hark --diarize --input both conversation.md
# Combine with other options
hark --diarize --input speaker --format markdown --model large-v3 meeting.md
| Flag | Description |
|---|---|
--diarize |
Enable speaker identification |
--speakers N |
Hint for expected speaker count (improves clustering) |
--no-interactive |
Skip post-transcription speaker naming prompt |
Note: Diarization adds processing time. For a 5-minute recording, expect ~1-2 minutes on GPU or ~5-10 minutes on CPU.
Output Format
With diarization enabled, output includes speaker labels and timestamps:
Plain text:
[00:02] [SPEAKER_01] Hello everyone, let's get started.
[00:05] [SPEAKER_02] Thanks for joining. Let me share my screen.
Markdown:
# Meeting Transcript
**SPEAKER_01** (00:02)
Hello everyone, let's get started.
**SPEAKER_02** (00:05)
Thanks for joining. Let me share my screen.
---
_2 speakers detected • Duration: 5:23 • Language: en (98% confidence)_
Interactive Naming
After transcription, hark will prompt you to identify speakers:
Detected 2 speaker(s) to identify.
SPEAKER_01 said: "Hello everyone, let's get started."
Who is this? [name/skip/done]: Alice
SPEAKER_02 said: "Thanks for joining. Let me share my screen."
Who is this? [name/skip/done]: Bob
Use --no-interactive to skip this prompt.
Known Issues
Slow diarization? The pyannote models may default to CPU inference. For GPU acceleration:
pip install --force-reinstall onnxruntime-gpu
See WhisperX #499 for details.
Development
git clone https://github.com/FPurchess/hark.git
cd hark
uv sync --extra test
uv run pre-commit install
uv run pytest
Contributing
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
License
Distributed under the AGPLv3 License.
Acknowledgments
This project would not exist without the hard work of others, first and foremost the maintainers and contributors of the below mentioned projects:
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 hark_cli-0.3.0.tar.gz.
File metadata
- Download URL: hark_cli-0.3.0.tar.gz
- Upload date:
- Size: 352.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: Hatch/1.16.2 cpython/3.12.3 HTTPX/0.28.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e3db94876a7481d4217d80fa1664053d60735e07e620d9497b83dae9f6f11d35
|
|
| MD5 |
9ea9c372f49d7a9b69841da656184854
|
|
| BLAKE2b-256 |
83c56e0f91bd43a1501042dd43c8a961d9337c3bded5bcb6f074fd7442833295
|
File details
Details for the file hark_cli-0.3.0-py3-none-any.whl.
File metadata
- Download URL: hark_cli-0.3.0-py3-none-any.whl
- Upload date:
- Size: 82.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: Hatch/1.16.2 cpython/3.12.3 HTTPX/0.28.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0a93a9f4da88b83d35713df2ffe5ceb276cc1a8de95bacce04c64f3197b94b1a
|
|
| MD5 |
570ea82953b01ae21b1298b04be956dd
|
|
| BLAKE2b-256 |
d5b98c0361646bf1ea52492fc3a996b48c6f95e6222b6c3492c59860156795aa
|