Skip to main content

ham-parrot

Voice keyer for ham radio contests. Runs as a long-lived CLI: proxies your microphone straight to the radio the whole time, and when you press Enter it plays back a pre-recorded voice sequence over the air (keying PTT via Hamlib rigctld) so you don't have to shout the same CQ / exchange fifty times an hour.

Install

pipx install ham-parrot
# or, for development:
poetry install

Use

ham-parrot \
    --mic-device "USB Audio" \
    --radio-audio-device "USB Audio" \
    --monitor-enable --monitor-device "MacBook Pro Speakers" \
    --hamlib-ptt localhost:4532 \
    --mic-passthrough-level 100 \
    --playback-level 90

Keys, while running:

  • r — start recording your voice sequence (mic is muted from the air while recording so you don't stomp on yourself). Press r again to stop; the file is saved as ./recording.wav.
  • Enter — key PTT, play recording.wav over the radio (and to your monitor device, if configured), release PTT.
  • q or Ctrl-C — quit.

recording.wav in the current directory is auto-loaded on startup, so a contest run is: record once, then hit Enter every time you need it.

If the radio is already transmitting (PTT reads high on rigctld) when you hit Enter, playback is refused so you don't collide with an ongoing over.

Flags

Flag Meaning
--mic-device Audio input to read your voice from. Same device-hint syntax as --radio-audio-device.
--radio-audio-device Audio output device on this host that feeds the radio's mic / line-in. On Linux this is typically alsa_output.usb-... — do not pass a source / input name.
--monitor-enable Turn on local monitoring (off by default). Monitor plays back only what is being transmitted from the recording / pilot tone — the live mic passthrough is not routed to the monitor to avoid the operator hearing their own voice with headphone lag.
--monitor-device Optional monitor output device (only used when --monitor-enable is set). Leave unset for the OS default.
--hamlib-ptt HOST:PORT rigctld endpoint. Bare --hamlib-ptt defaults to localhost:4532.
--mic-passthrough-level 0-500 Gain (percent, linear) applied to the live mic → radio passthrough. 100 = unity, 200 = +6 dB, 500 = +14 dB. Overshoots past ±1.0 are hard-clipped.
--playback-level 0-500 Gain applied to recording.wav (and the pilot tone) on the radio path. 100 = unity.
--monitor-level 0-500 Gain applied to the local monitor sink, independent of the radio-side gains.
--eq-json PATH Optional 17-band peaking EQ (ISO 1/3-octave centres, 100 Hz – 4 kHz). See eq_examples/flat.json for the required schema and eq_examples/ssb.json for a voice-shaped starting curve.

Audio processing

Everything sent to the radio (mic passthrough, playback, pilot) is filtered:

  • Butterworth bandpass 100 Hz – 4 kHz (4th order per edge → ~48 dB/octave rolloff), always on.
  • Optional 17-band peaking EQ on the ISO 1/3-octave centres, controlled by --eq-json.

The monitor sink is fed the raw source so you can hear what your voice actually sounds like uncoloured; the recording is captured before the filter for the same reason (the shaping happens on-air, not in the file).

Device hints accept: a substring of the OS device name ("USB Audio"), a numeric index (from pactl list short sinks on Linux, or sounddevice's device list elsewhere), or pulse:<name> to force the Pulse path.

License

MIT. See LICENSE.

Metadata

Release files for ham-parrot 0.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ham-parrot 0.0.1
File Size Uploaded
ham_parrot-0.0.1.tar.gz 22.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ham-parrot 0.0.1
File Interpreter ABI Platform
ham_parrot-0.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 48.3 kB

Release files / ham_parrot-0.0.1.tar.gz

Download URL ham_parrot-0.0.1.tar.gz
Size 22.9 kB
Tags Source
SHA-256 checksum
How to use checksums
6ccb5350f0d327eb76b2ed3d2085445892dd48ae5e6466b7ef6419711cb66c5c
BLAKE2b-256 checksum
How to use checksums
d6270a50f71868e2a5d668a0e673a8091180806e7525dce1e730606a9f124e9d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.14

Release files / ham_parrot-0.0.1-py3-none-any.whl

Download URL ham_parrot-0.0.1-py3-none-any.whl
Size 25.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a7852bb7bebe69f512aaa71644c0aace2858391fdbe793279a39b88954d42170
BLAKE2b-256 checksum
How to use checksums
8d736187877566e80479683516d8b2f74202a76050df6bd70512867fd0a09f37
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.14

Release history Release notifications | RSS feed

0.1.1

2 release files

0.1.0

2 release files

This release

0.0.1 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page