Conversation
QTextEdit::insertHtml() drops a fragment's leading whitespace, so a decode suffix that began with its word space glued onto the previous word. Insert plain text with a colour format instead. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
inferLogProbs() returns the model output for a window; greedyEmissions() applies the same greedy-CTC rule as ctcDecode() and keeps each character's frame and posterior. decode() is unchanged. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Replaces the grow / prefix-extend / 15 s reset loop in decodeLoopDeep(). Re-decode the window every 2 s; show a character only once it was emitted at least holdSec (default 5 s) behind the live edge, cutoff snapped into a blank run; drop the oldest audio but keep hold + 3 s, so there is no reset and no revision is lost. AETHER_DEEPCW_HOLD_S (1-14 s) overrides the hold. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Replays a recorded WAV through 15 s whole-window decodes, the previous grow/reset loop as the panel showed it, and DeepCwCommitter as shipped. EXCLUDE_FROM_ALL; built only on request. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
Windows (MSVC) check at Setup: Windows 11 Pro, Intel Core i9-14900HX, MSVC 2022 Build Tools + Ninja, Qt 6.8.3, fresh worktree, every
One small thing in my own commit: — authored by agent (Claude Code) on behalf of @skerker |
@K5PTB Follow-up to the streaming limitation noted on aethersdr#4817:
decodeLoopDeep()dropped divergent re-decodes and reset every 15 s.On-air test. Both bulletins below were received over the air from W1AW on 17 m on 2026-09-24 with a FlexRadio FLEX-8400 (firmware 4.2.20.41), receive only, recorded, and replayed offline on an Intel i9-14900HX laptop running Ubuntu 24.04.5 LTS (DeepCW on the CPU).
Trade-off: decoded text now appears about 6 s after the audio. The new loop shows a character only once it is 5 s behind the live edge, so on average the text trails the signal by about 6 s (measured 5.9–6.1 s in replay). The previous loop printed each guess as soon as it was decoded. The wait is what lets the model hear what follows a character before showing it, and it's where the accuracy comes from. It's adjustable with
AETHER_DEEPCW_HOLD_S(1–14 s): a 3 s hold gives about 4 s delay and scored 9.2 % CER on ARLD038, against 8.8 % at 5 s (full recording). If you'd rather keep text immediate, the panel fix (51c79dbe) stands on its own.Changes
51c79dbeinsertHtmlQTextEdit::insertHtmldrops a fragment's leading whitespace (Qt 6.8.3, measured), so a suffix starting with its word space merged onto the previous wordb1fd3a83DeepCwEngine::inferLogProbs()+greedyEmissions()(character, frame, posterior)decode()unchangedd59c117dDeepCwCommitterreplaces the grow / prefix-extend / reset loopAETHER_DEEPCW_HOLD_S(1–14 s) overrides the holdf0306533tools/deepcw_replay(EXCLUDE_FROM_ALL)DeepCwCommitterEvidence — character error rate against ground truth text (the W1AW bulletins as ARRL issued them)
CER = character errors (substituted, missing or extra) ÷ ground-truth characters; lower is better.
Two 18 WPM W1AW bulletins recorded on 17 m, replayed offline (same audio per row). All values are CER:
ARLP038's ground truth is the ARRL archive text (issued 2026-09-17, the bulletin W1AW sent that evening); two words differ from what was sent and are scored as sent.
The same sentences side by side (ARLD038; character errors per sentence, a count):
Weaker stretches. To estimate how each decoder copes when the signal weakens (as in fading), we measured the tone-to-noise ratio at the CW pitch every 2 s and sorted each bulletin's characters into quarters by the ratio when each was sent (about 610–665 characters per quarter, bundle audio). Over both bulletins the ratio ranged from about 12 to 30 dB. It's a relative measure on post-AGC audio, not a calibrated SNR.
Both decoders make most of their errors in the weakest stretches; there DeepCW's CER was about 20 %, ggmorse's about 68 %.
Takes without ground truth text — share of output characters that form dictionary words, CW abbreviations, callsigns or numbers (a proxy, not CER; higher is better):
Qt 6.8.3, ONNX Runtime 1.27.0; app built at
f0306533, About verified; the branch's replay decodes the same text as the build used on air. A Windows (MSVC) build check will follow; the change is platform-neutral C++ and Qt — your call whether to wait for it before merging.Proof
Full reproduction of both bulletins at
f0306533— audio, ground truth text, both replay tools, scoring scripts, the weaker-stretches analysis, all outputs;run.shreproduces every number above except the full-recording figures (measured: all outputs identical). Unzip all five into one folder:Not included
— authored by agent (Claude Code) on behalf of @skerker