Hey there, welcome to AIRadioScan. This whole site is basically one giant, ongoing experiment in mashing up old-school radio tech with modern AI.
I wanted to see what would happen if I threw local AI at the chaos of police scanner traffic. Instead of just hosting a standard live audio feed where you have to listen closely through the static, this setup actively "listens" for you. It ingests the raw RF spectrum, runs the audio through local AI to generate real-time transcripts, and automatically groups related dispatches onto the Live Incident Wall.
Since this is a live experiment running on consumer hardware, it's always a work in progress. You might catch the AI hallucinating a weird word or struggling with heavy radio static—that's just part of the fun of pushing the limits of this tech.
Signal → text → incident
Two RTL-SDR receivers on separate hosts, each hopping a
bank of VHF channels inside a single 2.048 MHz tuner window — so every
channel is watched at once, with no scan delay. Squelch and PL/DPL tone decoding happen
at the radio; audio moves over TLS-encrypted MQTT.
A spectral noise gate scores every recording on voice-band energy before anything else runs, so squelch tails and dead carrier never reach the transcriber.
Whisper large-v3, with a local faster-whisper
instance on an RTX 3060 doing the heavy lifting at roughly 6–9×
realtime, plus cloud and CPU tiers behind it so a single outage never creates a blind spot.
Whisper likes to latch onto a phrase and repeat it, so a loop detector collapses runs while protecting the genuine double-reads dispatch actually uses. A 2,418-street Yakima County gazetteer then repairs place names phonetically — "nay cheese" becomes Naches, "Kewich" becomes Cowiche.
Deterministic parsing pulls apparatus and unit IDs, addresses, cross streets, incident natures and determinant codes. Licence plates read over the air are detected and deliberately excluded — they carry a registered owner's address and have no business in an incident.
Transmissions become incidents by rule, never by vibes: a call is opened only by a dispatch that names a unit, a nature and a location, and later traffic attaches only when it shares a hard entity. Time can reject a link, never justify one. Every attachment stores the entity that earned it.
A local Llama 3.1 8B writes the summary — but only ever
over one already-assembled incident, and only from what was actually said. The model never
decides what belongs together.
Monitored channels
| Freq | Assignment | Service |
|---|---|---|
| 154.2575 | Upper Valley Fire Dispatch | Fire |
| 154.3100 | Yakima City Fire Dispatch | Fire |
| 154.3850 | Fire District 5 | Fire |
| 154.4300 | Yakima Fire Operations | Fire |
| 154.7650 | Upper Valley Fire Tac | Fire |
| 155.5300 | Sheriff — Eagle Dispatch | Police |
| 156.0000 | Sheriff — Elephant | Police |
| 156.0150 | Yakima PD Dispatch | Police |
| 156.2100 | Yakima PD Backup | Police |
By the numbers
Counts as of 17 Sep 2026 · times in Pacific
I'm Chad, the guy keeping the servers from catching fire. I'm an amateur radio operator, and you can find me on the airwaves under the call sign KA7HAK.
If you have questions, want to talk radio setups, or caught a hilarious AI transcription fail on the live wall, I'd love to hear from you.
✉ chad@airadioscan.com