Skip to content

Repository files navigation

AETV logo

AETV

Live video that keeps going when the radio channel gets ugly.

Tests Release packages

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.

Two release modes

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.

See it over the channel

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.

Standard channel

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
Standard-channel interview evaluation Standard-channel presenter evaluation Standard-channel canopy evaluation

Wide 8 kHz

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
Wide-channel ocean evaluation Wide-channel forest evaluation Wide-channel flower evaluation

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 and run on Windows

  1. Download the current Windows zip from Releases.
  2. Extract it anywhere.
  3. 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.

What hardware works?

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 cpu

Detailed methodology and current machine results live in docs/performance.md.

First contact

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

V8 audio/video transport

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.

Prepared clips

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.

Run from source

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-gui

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

Build, test, and contribute

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

The 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/AETV

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

Licence

AETV is released under the Artistic License 2.0. Third-party notices are collected in NOTICE.

AC16 and direct SDR trial

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.

About

Autoencoder Television: analog video over HF OFDM for amateur radio

Resources

Stars

6 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages