A practical, Part 97-aware architecture and implementation sequence for integrating an on-prem Small Language Model (SLM) with a Linux-based repeater controller stack.
This document describes a repeatable workflow for deploying a Small Language Model (SLM) alongside an amateur radio repeater controller in a Linux environment. The intent is to improve operational ergonomics (sysop assistance, configuration support, incident response, and status automation) while maintaining clear compliance boundaries for transmissions over the amateur service.
Operating principle: Treat the SLM as a control-plane assistant first, and only a radio-plane transmitter by explicit, tightly bounded design.
In practice: log, summarize, and recommend automatically; transmit automatically only for well-defined, policy-allowed announcements such as station ID and pre-approved telemetry, under control operator responsibility.
Before integrating AI with RF, write down what the system is allowed to do. In the United States, Part 97 provides key constraints on transmissions, including prohibited transmissions and requirements for station identification.1, 2 The FCC also publishes operational guidance for amateur communications and operations.3
Practical compliance pattern: Separate the system into (1) a receive-side intelligence pipeline (STT → log → summarize) and (2) a bounded transmit pipeline (allowlisted events → pre-approved phrases → optional TTS).
This is a technical design choice that reduces the risk of accidental prohibited content transmission.
The safest integration pattern is to run the repeater controller and the SLM as separate services connected by a narrow, policy-checked interface.
RF Rx audio + COR/COS
|
v
[Repeater controller: AllStar/app_rpt or SvxLink]
| \
| audio tap (ALSA/UDP) \ control adapter (commands/events)
v v
[STT service] ---> [Local log store / vector index] ---> [SLM service]
| ^ |
| | |
+---- alerts/metrics -----+------ policy guardrails ----+
|
v
[TX actions: allowlist only]
(play pre-approved audio / TTS)
| Option | Strengths | SLM integration “hooks” |
|---|---|---|
| AllStarLink | Widely used VoIP-linked repeater/node ecosystem built on Asterisk + app_rpt.6, 7 | DTMF command model (standard commands), Asterisk interfaces, audio playback and telemetry patterns.8 |
| SvxLink | Linux repeater controller / EchoLink stack with flexible configuration and modules.4, 5 | ALSA/UDP audio devices and module configuration (e.g., DTMF handling) provide control integration points.5, 9 |
You can run both stacks in parallel (e.g., SvxLink for local RF control and AllStar for linking) but you should only introduce that complexity if you already have strong operational reasons to do so.
This workflow assumes you already have a functioning repeater controller and RF chain. The SLM is added incrementally, starting with passive observation and moving toward bounded automation.
Your SLM cannot reason about on-air activity unless you give it structured inputs. Start with (a) received audio and (b) explicit events (COR/COS changes, transmitter keyed, link state changes).
alsa:…, oss:…, or udp:… in configuration.9STT provides the most value early because it is passive and supports logging, summaries, and searchable incident timelines.
| STT option | What it is | When to choose |
|---|---|---|
| whisper.cpp | High-performance C/C++ inference implementation of Whisper ASR with CPU-only support and quantization options.12 | You want strong accuracy on mixed conditions, can afford more CPU, and prefer a mature offline pipeline. |
| Vosk | Offline speech recognition toolkit with APIs and a variety of language models.13 | You want lower compute overhead, real-time streaming integration, and controllable vocabulary adaptation. |
Best practice: Store the raw audio locally for a short window (e.g., 24–72 hours) and keep longer-term text summaries. This provides auditability without indefinite retention of audio.
For small, on-prem models, prefer runtimes designed for local inference and quantized weights.
The SLM should not directly execute shell commands, key transmitters, or change configurations. Instead, implement a narrow adapter that exposes a small set of tools that the SLM can request, and enforce a strict allowlist.
link.connect(node), link.disconnect(node), status.read(), announce.play(template_id).If you choose to transmit AI-generated audio, do so conservatively. The simplest, safest path is template selection (pre-recorded voice files) instead of unconstrained generation.
Regardless of tier, ensure station identification timing remains correct and cannot be suppressed by the AI.2
Use controller-native mechanisms first; do not “hack around” them. Examples include:
For repeaters, “suitable” hardware is defined less by peak performance and more by reliability, manageability, and environmental tolerance. Your design should assume unattended operation, power cycling, and intermittent network reachability.
| Pattern | What it looks like | Why it works |
|---|---|---|
| Short-depth 1U edge server | Example: Supermicro SYS-5019D-4C-FN8TP (Xeon D-class CPU, M.2 support, PCIe expansion).16 | High reliability, better NIC options, and “appliance-like” behavior for remote sites. |
| Entry 1U enterprise server | Example: Dell PowerEdge R240 (1U, iDRAC management; deeper chassis).17 | Strong remote management and parts ecosystem; good for climate-controlled racks and club sites. |
| 1U + low-power GPU (optional) | Low-profile, low-power GPU such as NVIDIA T400 (30 W class) in a compatible chassis.18 | Can accelerate certain inference backends while staying within modest thermal/power budgets. |
Practical recommendation: If you are deploying to a mountaintop or unattended site, prioritize (1) short-depth chassis, (2) low power draw, (3) out-of-band management, and (4) “simple-to-restore” images over raw compute.
Keep each component small and observable. A simple split that scales from “passive logging” to “bounded automation” looks like this:
| Service | Responsibilities | Failure impact |
|---|---|---|
| controller | AllStar/app_rpt or SvxLink: RF control, IDs, linking, telemetry. | Critical. Must continue operating without SLM/STT. |
| audio-tap | Copies Rx audio (and optionally Tx audio) to a local stream for processing. | Non-critical. Logging may be degraded; RF remains functional. |
| stt | Transcribes audio to text (whisper.cpp or Vosk), timestamps segments. | Non-critical. Summaries/search unavailable if down. |
| slm | Summarizes, classifies, suggests actions; requests tool calls via a strict schema. | Non-critical. RF remains functional if down. |
| policy-gateway | Allowlist, rate limits, human-approval gates, and command execution adapter. | Important for safety. Should fail closed (no actions). |
| announcer | Plays pre-approved audio or bounded TTS into controller audio path. | Should fail safe (no unexpected TX audio). |
If your site includes APRS or packet workflows, Dire Wolf is a common Linux packet modem/TNC component that can be integrated into the same observability and event pipeline.15
Note: This document is technical guidance, not legal advice. Consult the primary FCC rules and qualified counsel for formal interpretations.
Print tip: Use your browser’s print dialog, select “Letter” paper, and ensure margins are not overridden (the stylesheet defines 1-inch margins via @page).