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.1.0

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.1.0
File Size Uploaded
ham_parrot-0.1.0.tar.gz 23.3 kB Details

Built distribution (wheel)

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

Total release size: 49.1 kB

Release files / ham_parrot-0.1.0.tar.gz

Download URL ham_parrot-0.1.0.tar.gz
Size 23.3 kB
Tags Source
SHA-256 checksum
How to use checksums
0741ff0b71399e094b0f9554496438f8a7dc7b4225f8c7f176bda062052fcdc3
BLAKE2b-256 checksum
How to use checksums
eaf9d5ee7202b156d4f3079be1cf2861904430d7eadabdf8b3116deabac1951d
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.1.0-py3-none-any.whl

Download URL ham_parrot-0.1.0-py3-none-any.whl
Size 25.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b118d5bcba2a642117dc2423ea316d60b69ad958b98c4152fb8bef3b5a9f94c4
BLAKE2b-256 checksum
How to use checksums
b1bfd67cc8163321d33c06672a0e6398d0bb05bb7dac77f54628a643bc9d16af
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

This release

0.1.0 This release

2 release files

0.0.1

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