Live video that keeps going when the radio channel gets ugly.
AETV sends moving color video over amateur-radio audio paths. It uses a learned video codec and an OFDM waveform designed to fade gracefully as noise and multipath increase—more like analog television than an all-or-nothing video call.
The station app handles camera or file playback, reception, soundcards, FlexRadio network audio, CAT/PTT, public KiwiSDR monitoring, and local channel simulation from one window.
| Mode | Best for | Picture | Radio audio |
|---|---|---|---|
| Standard channel | Typical HF/VHF SSB paths and CPU-only stations | 192×108 at 6 fps | Fits a standard transmit channel |
| Wide 8 kHz | Higher-detail links through FlexRadio or other wide audio paths | 256×144 at 12 fps | 8 kHz occupied bandwidth, 24 kHz audio |
Only these checksum-verified modes appear in the release GUI. Both stations must select the same mode.
These one-second, held-out evaluation grids come from the checksum-pinned release checkpoints. They loop automatically on GitHub; click one to play the higher-quality MP4.
The v8-hf3k-face-gan grids show the source, clean loopback, 18/12/6/0 dB
paths, good and poor multipath, and a measured 40 m-like path at 192×108 and
6 fps.
| Interview motion | Presenter tracking | Canopy detail |
|---|---|---|
![]() |
![]() |
![]() |
The v8-flex8k-ota-rxfix grids show the source, clean loopback, 18/12/6/0 dB
paths, and two multipath fading profiles at 256×144 and 12 fps.
| Moving water | Forest tracking | Fine detail |
|---|---|---|
![]() |
![]() |
![]() |
The Wide 8 kHz model was also exercised over a 40 m FlexRadio path. A 71-GOP off-air receiver-validation sweep and the full measurement notes are in the performance report.
- Download the current Windows zip from Releases.
- Extract it anywhere.
- Run
AETV.exe.
The portable builds include Python and the app libraries, but no model weights
or PyTorch. When neither release mode has a valid model, the first launch opens
Model Manager and asks which checksum-pinned ONNX bundles to download from
AETV/AETV on Hugging Face. Each selected mode
is about 206 MiB and shows download progress. Open File > Model Manager later
to install or verify the other mode. Models are cached in
%LOCALAPPDATA%\AETV\models on Windows and $XDG_CACHE_HOME/aetv/models (or
~/.cache/aetv/models) on Linux. AETV_MODEL_DIR overrides that location.
Windows may show a SmartScreen prompt until release binaries are code-signed.
FFmpeg is included in the portable packages, so opening source videos and
saving received MP4 files do not require a separate system installation.
FlexRadio control, serial PTT, VOX/manual PTT, soundcards, and Hamlib direct rig control are self-contained. Windows packages include the official dynamically loaded Hamlib 4.7.2 runtime under LGPL-2.1-or-later, its licence, and an exact source link. The DLL remains replaceable with an ABI-compatible Hamlib build.
Choose the CPU build for the Standard channel mode. Choose the GPU build for Wide 8 kHz or for extra processing headroom. It uses Windows DirectML, so it can run on current NVIDIA, AMD, and Intel GPUs without bundling the multi-gigabyte CUDA/cuDNN training stack, and it still has a CPU fallback.
Linux, Windows CPU, and Windows GPU packages are built and smoke-tested on
GitHub Actions workers. Run the Release packages workflow manually for
short-lived downloadable artifacts; version tags such as v0.1.2 publish the
files to GitHub Releases.
One GOP represents one second on air, so encode or decode must finish inside one second for live operation.
Measured on a Ryzen 7 5800X (8 cores/16 threads):
| Release mode | Encode | Decode | Result |
|---|---|---|---|
| Standard channel, CPU | 414 ms | 629 ms | Real-time half-duplex transmit and receive |
| Wide 8 kHz, CPU | 1,182 ms | 1,962 ms | Not real time |
Measured on an RTX 4080 with the native CUDA development backend:
| Release mode | Encode | Decode |
|---|---|---|
| Standard channel, CUDA | 13 ms | 19 ms |
| Wide 8 kHz, CUDA | 34 ms | 71 ms |
The redistributable GPU package uses DirectML rather than the CUDA development backend, so timings vary by Windows driver and GPU. Run its included benchmark to measure the deployed backend directly.
For CPU-only use, a recent 8-core/16-thread desktop is a practical baseline for Standard channel mode. Slower machines can still decode recordings, but may not keep up live. Wide 8 kHz should be treated as a GPU mode for now. Run the included benchmark on another rig for a direct answer:
AETV-Benchmark.exe --mode V8 --device cpuDetailed methodology and current machine results live in docs/performance.md.
- Enter your callsign in Settings.
- Pick Standard channel unless both ends have an 8 kHz audio path.
- Select the radio input/output devices and configure CAT/PTT if desired.
- Audio settings can optionally emit or receive an analytic stereo I/Q signal with independent I/Q↔L/R or I/Q↔R/L mappings. Mono remains the default in both directions. Matching TX and RX modes support a direct stereo audio loopback test without RF hardware.
- Use Local loopback first. It exercises the complete modem without keying a radio.
- Confirm your licence, regional band plan, occupied bandwidth, frequency, and power before transmitting.
AETV identifies transmissions, but it cannot decide whether a frequency or bandwidth is legal at your station.
The station application's V8 A/V transport keeps the V8 video codec while placing analog voice below a frequency-shifted V8 waveform. Select the microphone and received program-audio output in the transmit and receive panes. The audio/video power and clip-audio/microphone faders remain active during transmission and are sampled for each GOP. Prepared clips use their edited media-file audio; webcam and screen sends use microphone audio only. Voice is delayed by one GOP so it plays alongside decoded video.
V8 A/V uses 12 kHz audio and requires an approximately 5 kHz transmit and receive passband. A normal 2.7 kHz SSB filter will remove the video branch.
Clip-bank slots, trim points, and framing choices are saved as you edit them. Prepared clips return after restarting AETV once the selected model loads. Unchanged clips reuse cached encoding and previews; changes to the source file, edit, or model trigger preparation again. Keep the original media files available, including for program audio. Clearing the per-user cache rebuilds preparation without removing the saved clip bank.
Source installs are for development; most operators should use the Windows release.
git clone https://github.com/plaingca/AETV.git
cd AETV
uv sync --extra gui --extra train
uv run aetv-guiSource development keeps PyTorch available for native checkpoints and training.
The GUI prefers the same ONNX runtime bundles as the portable packages and
verifies every component's size and SHA-256 before treating a mode as installed.
Set AETV_OFFLINE=1 to disable Model Manager downloads or AETV_MODEL_DIR to
choose the cache location. Command-line tools retain automatic default-model
download behavior unless offline mode is enabled.
The release builders use two isolated environments: a temporary CPU-only Torch
environment exports each checkpoint to fixed-shape ONNX encoder/decoder graphs,
then a clean ONNX Runtime environment freezes the GUI. PyTorch remains in the
train extra and is never copied into an operator package.
uv sync --extra gui --extra train --extra dev
uv run pytest -q
uv run python scripts/benchmark_inference.py --mode V8 --device cpu
./scripts/build_windows.ps1 -Runtime cpu
./scripts/build_linux.shThe build fetches and verifies both pinned training checkpoints, exports the
runtime graphs for an offline packaged smoke test, then removes all model files
before producing the archive. The Linux release CI also installs
appimagetool, and the Linux builder emits both a portable .tar.gz and an
executable .AppImage; local Linux builds must provide appimagetool on
PATH or through APPIMAGETOOL. Use -Runtime gpu for the DirectML build
(-Runtime cuda remains a compatibility alias).
Training can capture and publish a final runtime bundle directly:
uv run python scripts/train.py ... --export-onnx --runtime-name my-model
uv run python scripts/train.py ... --push-onnx-to-hub `
--runtime-name my-model --runtime-repo AETV/AETVHub publication is opt-in and uses the normal HF_TOKEN/Hugging Face login.
The exporter writes a .release.json containing the exact byte counts and
SHA-256 values needed to pin a newly promoted release model.
The modem contract, model experiments, OTA notes, training commands, and hardware integrations are kept in docs so the main page can stay focused on operating the software. Start with the ham operator guide, model index, and propagation planner.
AETV is released under the Artistic License 2.0. Third-party notices are collected in NOTICE.
AC16 (256×144 at 10 fps) is available through Model Manager. AC16 A/V adds mono audio in the first 3.3 kHz of a 20 kHz waveform using the same checkpoint. Direct SDR support includes Pluto transmit and Pluto/RTL-SDR receive, plus experimental HackRF transmit/receive, an RF IQ waterfall, frequency dial, and separate gain controls. See AC16 and SDR operation for setup and portable-runtime details.






