Dataset card
TRCS: a synthetic radio-channel benchmark for speech recognition
1,050 audio files that push synthetic speech and non-speech sounds through telephone codecs and noise, with a SHA-256 for every file. It exists to test one failure: speech models writing words that were never spoken.
Self-published, not peer reviewedManifest generated 2026-10-10T21:33:12Z
What it is #
TRCS stands for Tactical Radio Channel Simulator. It has two parts. One tests what a model does when there is nothing to transcribe. The other tests how accuracy falls as audio passes through narrowband telephone codecs and added noise.
The speech is synthetic. The calls are scripted and rendered with a text-to-speech engine, then degraded in software. The channel effects are simulated. Nothing here was captured from a real radio.
Contents #
| Split | Files | What is in it |
|---|---|---|
| hallucination | 90 | 9 conditions × 10 seeds, 2.5 s each. Eight non-speech conditions (digital silence, quiet room, radio squelch burst, white, pink, brown, engine and babble noise) plus one speech control. |
| telephone_grid | 960 | 40 scripted radio calls × 6 audio paths (uncompressed, G.711 μ-law, G.711 A-law, AMR-NB, GSM full-rate, Opus narrowband) × 4 noise levels (clean, 20, 10 and 0 dB). |
Total 2.27 hours and 261 MB, 33 conditions.
Verify it #
The manifest lists a SHA-256 for each file. This checks all of them against what you downloaded. I ran the same check on my copy on 11 October 2026 and found 0 mismatches.
# 1. download the dataset
python3 -m pip install huggingface_hub
python3 -c "from huggingface_hub import snapshot_download; \
snapshot_download('RoamingPigs/trcs-tactical-audio', repo_type='dataset', local_dir='trcs')"
# 2. re-hash every file against the manifest
python3 - <<'PY'
import hashlib, json, pathlib
root = pathlib.Path("trcs")
m = json.loads((root / "provenance_manifest.json").read_text())
bad = [f["filename"] for f in m["files"]
if hashlib.sha256((root / f["relative_path"]).read_bytes()).hexdigest() != f["sha256"]]
print(len(m["files"]), "files,", len(bad), "mismatches")
PYWhat a matching hash proves. The file is the one I listed. It does not prove the audio is realistic or that a model's score on it means anything outside this benchmark. There is no combined root digest yet, only one digest per file.
Known limits #
- Synthetic speech. Real radio speech is faster, more varied and often clipped. Results here may not carry over.
- Simulated channels. The codecs are standard, but the noise and squelch effects are my own models of them.
- The published results used a different configuration. The speech-model run scored 5 utterances at five noise levels including −6 dB. The released files hold 40 utterances at four levels and no −6 dB. The scored audio is not a subset of these files.
- Duplicate files. 18 files are byte-identical copies of another file (digital silence and speech control clips do not vary by seed). That leaves 1,032 distinct digests.
- One author. Nobody else has re-run the benchmark.
Use and licence #
Code is Apache-2.0. Audio fixtures are CC BY 4.0, as stated in the manifest. Please cite the dataset, with its manifest date, if you use it. How to cite.