GMRS‑TTY

TTY-style accessibility communicator — GMRS / FRS

Version
1.9.0
Runtime
Python 3.13
Network
None required
License
MIT

Lets hard-of-hearing, deaf, or mute operators participate in voice radio conversations: incoming audio is live-transcribed to a chat log, typed messages are spoken out over the air, and FCC Part 95 ID rules are built into the message flow.

Download .deb (v1.9.0) User manual (PDF)

1.6 GB — bundles Python wheels, the Whisper STT model, and five Piper voices, so a fresh install works with no internet.

Fig. 1 — the chat surface (HTML rendering of the default layout, not a screenshot). Amber pill = saved contact; ✓ = FCC-verified license.

Section 1 — Operation


GMRS-TTY is a desktop app (Python + PySide6) that sits between a GMRS or FRS radio and its operator. Point the radio's audio at a sound card and the app transcribes every transmission into a chat log as it happens; type a reply and the app synthesizes it to speech and keys the radio. The idea traces back to the TTY — the teletypewriter deaf users ran over telephone lines — brought to radio: the author's sister used one, and this is the same conversation model on a different medium.

Everything runs locally. Speech-to-text (faster-whisper), text-to-speech (Piper), and voice activity detection (Silero) are all offline models staged on disk; the core radio workflow never touches the network. The one online feature — FCC callsign verification — is strictly opt-in via a connectivity probe and degrades cleanly when the network is gone.

“This application exists for users with disabilities, so accessibility is a hard design constraint rather than a nice-to-have.” — from the README

The UI targets WCAG 2.1 Level AA: every text color meets contrast, no state is conveyed by color alone, the whole app drives from the keyboard, and every widget is labelled for NVDA / JAWS / Orca / VoiceOver. A rolling audio waterfall below the chat gives deaf and hard-of-hearing operators a visual readout of the channel — squelch breaks, voice formants, and neighbor-channel splatter are visible the moment they arrive.

Section 2 — Receive


The receive pipeline is built around how radio traffic actually behaves, not around clean studio audio.

A monitor toggle routes the raw channel audio to speakers while transcription continues, a listen-only mode blocks every TX path for safe monitoring, and a system-loopback input source transcribes whatever is playing through the computer's own output. The waterfall's FFT runs on its own thread and is designed to hold under 10% CPU on a Raspberry Pi 4.

Section 3 — Transmit


Typed messages go out through Piper, an offline TTS engine with local ONNX voices (five are bundled; speech rate adjusts from 0.70× to 1.50×, with a Test button to audition before saving).

Section 4 — Compliance


FCC Part 95 station-ID rules are enforced by the message flow itself, not left to the operator's memory:

From the README, verbatim: “You are still responsible for legal operation. This app does not replace a valid FCC GMRS license.”

Section 5 — Installation


The release page carries a self-contained .deb (x86-64) that bundles Python wheels, the Whisper model, and five Piper voices — no internet needed after the download.

Table 5-1 — supported platforms
PlatformInstall method
Debian 13 (trixie) / LMDE 7 / Ubuntu 24.10+direct apt install
Ubuntu 22.04 / 24.04, Mint 21–22, Pop!_OSinstall.sh from the release page (adds the deadsnakes PPA for Python 3.13)
Debian 12 (bookworm), Ubuntu 20.04build from source
sudo apt install ./gmrs-tty_1.9.0_amd64.deb
gmrs-tty

First run: open Settings → Configuration and set your callsign, name, location, and voice.

From source

Five steps on any Linux with Python 3.11+: pip install -r requirements.txt, fetch voices with ./scripts/fetch-voices.sh, stage the Whisper model once with python bootstrap_models.py on a connected machine, copy config.example.json to config.json, and run python main.py. For air-gapped targets, copy the Models/ and Voices/ directories along with the source — nothing else is fetched at runtime. Full detail in the README and the user manual.

Section 6 — Specifications


Table 6-1 — general specifications
RuntimePython 3.11+ (3.13 recommended), PySide6 / Qt
Speech-to-textfaster-whisper (CTranslate2), Silero VAD, offline
Text-to-speechPiper, local ONNX voice models, offline
Audio interfaceAny sound card feeding the radio — USB dongle, Signalink, Digirig
PTT hardwareNone (manual / VOX), or a USB-serial FTDI adapter (RTS/DTR line)
RadioAny GMRS or FRS HT, mobile, or SDR with an audio path
Reference targetRaspberry Pi 4 (waterfall budgeted under 10% CPU)
NetworkNot required at runtime; FCC callsign lookup is opt-in when online
AccessibilityWCAG 2.1 Level AA; NVDA / JAWS / Orca / VoiceOver
LicenseMIT; bundled third-party models keep their own licenses (see NOTICES — the libritts voice is CC BY 4.0)

Roadmap: multi-arch Docker image (amd64 + arm64), parallel LoRa-mesh transmit (Meshtastic / Meshcore), Bluetooth HT audio, hamlib CAT/CI-V rig control.