Detect callsigns in transcripts, and say whose they are
Under the transcript, headed DETECTED CALLSIGNS:, every callsign heard in it with the name and location on its licence. Finding them is not one regular expression over the text as written. A speech recogniser is poor at callsigns -- they are not words, they are said one character at a time -- so it breaks them wherever the speaker paused and writes the phonetic alphabet down verbatim. The recording that prompted this has "Alright, KU 0W" in it, with a space; spelled out it would have been "kilo uniform zero whiskey". All three forms read back to KU0W. Not inventing them matters more. A run of words is accepted only when none of its parts is an ordinary English word: "or 3. Can you open 4" and "CC1 boy", both from real transcripts here, fit the shape once the punctuation is gone and are not callsigns. A single token said in one breath is still trusted, because W1BOY is a perfectly good callsign, and a lone "a" or "i" cannot start a join or "a B4U player" becomes AB4U. Across the 126 transcripts in the recordings directory that turns three candidates into the one that was actually said. Lookups use the FCC's own licence data at callook.info -- no account, no key, the callsign the only thing sent. They never delay the display: the entry reads "looking up" and fills itself in, and results are cached under ~/.cache so a net recorded night after night is looked up once. --no-lookup contacts nothing and still describes a callsign from its own structure, the ITU prefix giving the country and the digit the US district, which is also all there is to say for callsigns outside the US. --callsigns prints everyone who identified themselves and where they were heard. Also asked: are transcripts appended to, or overwritten, when another transmission arrives on the same frequency? Neither could be shown from reading the code alone, so there are now three tests that run real scans and look at the files. By default each transmission has a transcript of its own -- the timestamp is in the name, so two overs cannot land on one file. With --combine there is one recording per frequency and therefore one transcript, opened for append with the time of each over; a second scan into the same directory adds to it rather than starting it over, which is the case the last of the three tests covers. The browser and callsign tests refuse to reach the network at all. One test did, quietly, and passed -- visible only because the assertion it failed printed a real operator's address. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016PsWPTweCT6pwxKngvVxcg
This commit is contained in:
parent
cc317914e1
commit
739a2faaf4
11 changed files with 1502 additions and 16 deletions
|
|
@ -1,5 +1,5 @@
|
|||
.\" Generated by packaging/make-man.py -- do not edit by hand.
|
||||
.TH BANDSAUNTER 1 "2026-08-22" "bandsaunter 2026-08-22_03" "User Commands"
|
||||
.TH BANDSAUNTER 1 "2026-08-22" "bandsaunter 2026-08-22_04" "User Commands"
|
||||
.SH NAME
|
||||
bandsaunter \- scan, record and identify radio signals with an RTL-SDR
|
||||
.SH SYNOPSIS
|
||||
|
|
@ -877,6 +877,30 @@ to have each one written into the lock\-out list as it is found, so the
|
|||
scanner stops looking at it at all; with
|
||||
.B \-\-save\-lockouts
|
||||
on, that list survives a restart.
|
||||
.SH TRANSCRIPTS
|
||||
Anything the content check identifies as voice is passed to a speech
|
||||
recogniser, and the words are written to a
|
||||
.I _transcription.txt
|
||||
beside the recording. Only voice: running a recogniser over Morse or a data
|
||||
burst costs seconds and produces nothing.
|
||||
.PP
|
||||
One transcript per transmission, and none is ever overwritten \[em] the
|
||||
timestamp is part of the name, so two overs on one frequency cannot land on
|
||||
the same file.
|
||||
.PP
|
||||
With
|
||||
.B \-\-combine
|
||||
there is one recording per frequency, so there is one transcript per
|
||||
frequency, and each over is appended to it with the time it was heard. An
|
||||
unattended receiver keeps adding to that file night after night rather than
|
||||
starting it over.
|
||||
.PP
|
||||
A capture with nothing recognisable in it produces no file at all, rather
|
||||
than a directory of placeholders.
|
||||
.PP
|
||||
.BR saunterbrowse (1)
|
||||
reads these back, and lists any callsigns it finds in them with the licence
|
||||
they belong to.
|
||||
.SH HF RECEPTION
|
||||
These receivers cannot normally tune below about 24 MHz. Below that they can
|
||||
sample the antenna directly instead, which opens up shortwave: broadcast,
|
||||
|
|
|
|||
|
|
@ -30,6 +30,8 @@ saunterbrowse \- read and listen to what a bandsaunter scan collected
|
|||
.RB [ \-\-player
|
||||
.IR CMD ]
|
||||
.RB [ \-\-list ]
|
||||
.RB [ \-\-callsigns ]
|
||||
.RB [ \-\-no\-lookup ]
|
||||
.SH DESCRIPTION
|
||||
A scan leaves a directory of recordings. Beside each one is a JSON file
|
||||
holding what the classifier made of it, and for speech a transcript of what
|
||||
|
|
@ -118,6 +120,14 @@ The command used to play a recording. The path is appended as its last
|
|||
argument. By default the first of these that is installed is used:
|
||||
{players}.
|
||||
.TP
|
||||
.B \-\-callsigns
|
||||
Print every callsign heard in the directory, with the licence it belongs to
|
||||
and where and when it was heard, then exit.
|
||||
.TP
|
||||
.B \-\-no\-lookup
|
||||
Do not contact the licence database. Callsigns are still found and still
|
||||
described from their prefix; only the name and address are missing.
|
||||
.TP
|
||||
.B \-\-list
|
||||
Print one line per recording and exit, without drawing anything. This is what
|
||||
to use over a pipe, in a script, or anywhere there is no terminal.
|
||||
|
|
@ -133,6 +143,46 @@ message says which packages would fix it.
|
|||
.PP
|
||||
Over ssh there is usually no sound server at the far end. The browser and its
|
||||
transcripts work regardless; only Enter has nothing to do.
|
||||
.SH DETECTED CALLSIGNS
|
||||
Under the transcript, headed
|
||||
.BR "DETECTED CALLSIGNS:" ,
|
||||
is every callsign heard in it, with the name and location on the licence.
|
||||
.PP
|
||||
Finding them is not a matter of one regular expression over the text as
|
||||
written. A speech recogniser is poor at callsigns \[em] they are not words,
|
||||
they are said one character at a time \[em] so it breaks them wherever the
|
||||
speaker paused and writes the phonetic alphabet down verbatim. "KU 0W",
|
||||
"K7 RA" and "kilo uniform zero whiskey" are all one callsign each, and all
|
||||
three are read back correctly.
|
||||
.PP
|
||||
False positives are the thing to avoid: a browser that invents callsigns is
|
||||
worse than one that finds none. So a run of words is only accepted when none
|
||||
of its parts is an ordinary English word \[em] "or 3. Can you open 4" fits the
|
||||
shape once the punctuation is gone, and is not a callsign \[em] while a single
|
||||
token said in one breath is trusted, because W1BOY is a perfectly good
|
||||
callsign.
|
||||
.PP
|
||||
The lookup uses the FCC's own licence data, published at callook.info, which
|
||||
needs no account and no key. The callsign is the only thing sent, results are
|
||||
cached under
|
||||
.I ~/.cache/bandsaunter/
|
||||
so the same net is looked up once however many nights it is recorded, and a
|
||||
lookup never delays the display: the entry says "looking up" and fills itself
|
||||
in.
|
||||
.PP
|
||||
.B \-\-no\-lookup
|
||||
contacts nothing at all. Callsigns are still found, and still described from
|
||||
their own structure \[em] the prefix is allocated by the ITU and the digit is
|
||||
the US licensing district, so a callsign says which country and which region
|
||||
it belongs to without any database. Outside the United States that is all
|
||||
there is; callook.info holds US licences only.
|
||||
.PP
|
||||
.B \-\-callsigns
|
||||
prints every callsign in the directory, who it belongs to, and each frequency
|
||||
and time it was heard on, then exits.
|
||||
.PP
|
||||
US amateur licence records are public by law, and include the licensee's
|
||||
address. That is what is shown.
|
||||
.SH TRANSCRIPTS
|
||||
A transcript appears only where a recogniser produced one, which means the
|
||||
capture was judged to be speech and
|
||||
|
|
@ -189,6 +239,14 @@ saunterbrowse \-\-list | grep \-i "mile marker"
|
|||
.RE
|
||||
.PP
|
||||
Search the transcripts from a script.
|
||||
.PP
|
||||
.RS
|
||||
.EX
|
||||
saunterbrowse \-\-callsigns
|
||||
.EE
|
||||
.RE
|
||||
.PP
|
||||
Everyone who identified themselves, and where they were heard.
|
||||
.SH EXIT STATUS
|
||||
0 on a clean exit, 1 when the directory holds no recordings, 2 when it does
|
||||
not exist or there is no terminal to draw on.
|
||||
|
|
|
|||
|
|
@ -328,6 +328,30 @@ to have each one written into the lock\-out list as it is found, so the
|
|||
scanner stops looking at it at all; with
|
||||
.B \-\-save\-lockouts
|
||||
on, that list survives a restart.
|
||||
.SH TRANSCRIPTS
|
||||
Anything the content check identifies as voice is passed to a speech
|
||||
recogniser, and the words are written to a
|
||||
.I _transcription.txt
|
||||
beside the recording. Only voice: running a recogniser over Morse or a data
|
||||
burst costs seconds and produces nothing.
|
||||
.PP
|
||||
One transcript per transmission, and none is ever overwritten \[em] the
|
||||
timestamp is part of the name, so two overs on one frequency cannot land on
|
||||
the same file.
|
||||
.PP
|
||||
With
|
||||
.B \-\-combine
|
||||
there is one recording per frequency, so there is one transcript per
|
||||
frequency, and each over is appended to it with the time it was heard. An
|
||||
unattended receiver keeps adding to that file night after night rather than
|
||||
starting it over.
|
||||
.PP
|
||||
A capture with nothing recognisable in it produces no file at all, rather
|
||||
than a directory of placeholders.
|
||||
.PP
|
||||
.BR saunterbrowse (1)
|
||||
reads these back, and lists any callsigns it finds in them with the licence
|
||||
they belong to.
|
||||
.SH HF RECEPTION
|
||||
These receivers cannot normally tune below about 24 MHz. Below that they can
|
||||
sample the antenna directly instead, which opens up shortwave: broadcast,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
.\" Generated by packaging/make-browse-man.py -- do not edit by hand.
|
||||
.TH SAUNTERBROWSE 1 "2026-08-22" "bandsaunter 2026-08-22_03" "User Commands"
|
||||
.TH SAUNTERBROWSE 1 "2026-08-22" "bandsaunter 2026-08-22_04" "User Commands"
|
||||
.SH NAME
|
||||
saunterbrowse \- read and listen to what a bandsaunter scan collected
|
||||
.SH SYNOPSIS
|
||||
|
|
@ -12,6 +12,8 @@ saunterbrowse \- read and listen to what a bandsaunter scan collected
|
|||
.RB [ \-\-player
|
||||
.IR CMD ]
|
||||
.RB [ \-\-list ]
|
||||
.RB [ \-\-callsigns ]
|
||||
.RB [ \-\-no\-lookup ]
|
||||
.SH DESCRIPTION
|
||||
A scan leaves a directory of recordings. Beside each one is a JSON file
|
||||
holding what the classifier made of it, and for speech a transcript of what
|
||||
|
|
@ -100,6 +102,14 @@ The command used to play a recording. The path is appended as its last
|
|||
argument. By default the first of these that is installed is used:
|
||||
pw-play, paplay, aplay, play, ffplay, mpv.
|
||||
.TP
|
||||
.B \-\-callsigns
|
||||
Print every callsign heard in the directory, with the licence it belongs to
|
||||
and where and when it was heard, then exit.
|
||||
.TP
|
||||
.B \-\-no\-lookup
|
||||
Do not contact the licence database. Callsigns are still found and still
|
||||
described from their prefix; only the name and address are missing.
|
||||
.TP
|
||||
.B \-\-list
|
||||
Print one line per recording and exit, without drawing anything. This is what
|
||||
to use over a pipe, in a script, or anywhere there is no terminal.
|
||||
|
|
@ -115,6 +125,46 @@ message says which packages would fix it.
|
|||
.PP
|
||||
Over ssh there is usually no sound server at the far end. The browser and its
|
||||
transcripts work regardless; only Enter has nothing to do.
|
||||
.SH DETECTED CALLSIGNS
|
||||
Under the transcript, headed
|
||||
.BR "DETECTED CALLSIGNS:" ,
|
||||
is every callsign heard in it, with the name and location on the licence.
|
||||
.PP
|
||||
Finding them is not a matter of one regular expression over the text as
|
||||
written. A speech recogniser is poor at callsigns \[em] they are not words,
|
||||
they are said one character at a time \[em] so it breaks them wherever the
|
||||
speaker paused and writes the phonetic alphabet down verbatim. "KU 0W",
|
||||
"K7 RA" and "kilo uniform zero whiskey" are all one callsign each, and all
|
||||
three are read back correctly.
|
||||
.PP
|
||||
False positives are the thing to avoid: a browser that invents callsigns is
|
||||
worse than one that finds none. So a run of words is only accepted when none
|
||||
of its parts is an ordinary English word \[em] "or 3. Can you open 4" fits the
|
||||
shape once the punctuation is gone, and is not a callsign \[em] while a single
|
||||
token said in one breath is trusted, because W1BOY is a perfectly good
|
||||
callsign.
|
||||
.PP
|
||||
The lookup uses the FCC's own licence data, published at callook.info, which
|
||||
needs no account and no key. The callsign is the only thing sent, results are
|
||||
cached under
|
||||
.I ~/.cache/bandsaunter/
|
||||
so the same net is looked up once however many nights it is recorded, and a
|
||||
lookup never delays the display: the entry says "looking up" and fills itself
|
||||
in.
|
||||
.PP
|
||||
.B \-\-no\-lookup
|
||||
contacts nothing at all. Callsigns are still found, and still described from
|
||||
their own structure \[em] the prefix is allocated by the ITU and the digit is
|
||||
the US licensing district, so a callsign says which country and which region
|
||||
it belongs to without any database. Outside the United States that is all
|
||||
there is; callook.info holds US licences only.
|
||||
.PP
|
||||
.B \-\-callsigns
|
||||
prints every callsign in the directory, who it belongs to, and each frequency
|
||||
and time it was heard on, then exits.
|
||||
.PP
|
||||
US amateur licence records are public by law, and include the licensee's
|
||||
address. That is what is shown.
|
||||
.SH TRANSCRIPTS
|
||||
A transcript appears only where a recogniser produced one, which means the
|
||||
capture was judged to be speech and
|
||||
|
|
@ -171,6 +221,14 @@ saunterbrowse \-\-list | grep \-i "mile marker"
|
|||
.RE
|
||||
.PP
|
||||
Search the transcripts from a script.
|
||||
.PP
|
||||
.RS
|
||||
.EX
|
||||
saunterbrowse \-\-callsigns
|
||||
.EE
|
||||
.RE
|
||||
.PP
|
||||
Everyone who identified themselves, and where they were heard.
|
||||
.SH EXIT STATUS
|
||||
0 on a clean exit, 1 when the directory holds no recordings, 2 when it does
|
||||
not exist or there is no terminal to draw on.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue