Spoken-word study files for the FCC Amateur Radio Technician license exam (Element 2), in the style of the old US citizenship-test prep CDs: question, four choices, a pause to answer, then the answer called out and repeated.
This has turned out to be an effective test study apporahc for millions of people.
One MP3 per subelement — 10 files, 3 h 36 m total, in audio/.
| File | Subelement | Questions | Exam Qs | Length |
|---|---|---|---|---|
| T1-Commissions-Rules.mp3 | Commission's Rules | 68 | 6 | 41:10 |
| T2-Operating-Procedures.mp3 | Operating Procedures | 37 | 3 | 21:41 |
| T3-Radio-Wave-Propagation.mp3 | Radio Wave Propagation | 35 | 3 | 18:47 |
| T4-Amateur-Radio-Practices.mp3 | Amateur Radio Practices | 23 | 2 | 13:22 |
| T5-Electrical-Principles.mp3 | Electrical Principles | 50 | 4 | 21:12 |
| T6-Electronic-and-Electrical-Components.mp3 | Electronic and Electrical Components | 46 | 4 | 19:23 |
| T7-Practical-Circuits.mp3 | Practical Circuits | 44 | 4 | 22:55 |
| T8-Signals-and-Emissions.mp3 | Signals and Emissions | 47 | 4 | 25:21 |
| T9-Antennas-and-Feed-Lines.mp3 | Antennas and Feed Lines | 23 | 2 | 12:13 |
| T0-Safety.mp3 | Safety | 36 | 3 | 20:04 |
All 409 questions. The exam draws 35 questions, using the "Exam Qs" count from each subelement; 26 correct is a pass.
"Which of the following is part of the Basis and Purpose of the Amateur Radio Service?"
"A. Providing personal radio communications for as many citizens as possible."
---- 1.5 seconds of silence ----
"B. Providing communications for international contesting."
---- 1.5 seconds of silence ----
"C. Advancing skills in the technical and communication phases of the radio art."
---- 1.5 seconds of silence ----
"D. All these choices are correct."
---- 4 seconds of silence ----
"The correct answer is C."
"C. Advancing skills in the technical and communication phases of the radio art."
Voice is Zoe (Premium) (macOS, US English female) at 160 wpm. Files carry ID3 title/album/track tags, so they sort correctly as an album on a phone or in a car.
Official NCVEC question pool, 2026–2030 Technician Class, Public Release February 19 2026 (the errata revision — it corrects the wording of T1C01, T5A05, T7A09 and T0A10 from the original December 18 2025 release). Valid for exams from July 1 2026 through June 30 2030. This pool is in teh public domain.
Downloaded from https://ncvec.org/index.php/2026-2030-technician-question-pool
and kept in pool/ alongside the parsed JSON and its SHA-256.
12 questions ask about components in figures T-1, T-2 and T-3 (a schematic,
a block diagram and a component diagram). Audio alone cannot convey these — the
images are in pool/Technician-Diagram-T-*.jpg; look at them while those
questions play, or just memorize the answers.
python3 parse_pool.py pool/tech-2026-2030-feb19-2026.docx \
-o pool/technician-2026-2030.json --expect 409
python3 build_audio.py pool/technician-2026-2030.json -o audio --voice "Zoe (Premium)"A full rebuild takes about two minutes. You only need it to change the voice,
pacing or pause length — the finished MP3s are committed, so a clone is ready to
listen to immediately. The pool .docx, the parsed JSON and the diagrams are
committed too, so any rebuild reproduces the same content exactly.
| Option | Effect |
|---|---|
--voice "Ava (Premium)" |
different voice (say -v '?' lists installed ones) |
--rate 140 |
slower speech (default 160 wpm) |
--pause 6 |
longer answering pause (default 4 s) |
--only T1,T5 |
rebuild just those subelements |
--limit 3 |
short sample for auditioning settings |
--ids |
announce the pool id ("T one A zero one") before each question |
--gap-between-answers 1000 |
tighter spacing between choices (default 1500 ms) |
--group-titles |
also read each group's syllabus line |
--script-only |
write the spoken text without synthesizing |
Voices: these files use Zoe (Premium), downloaded via System Settings →
Accessibility → Spoken Content → System Voice → Manage Voices. Pass the name
exactly as say -v '?' prints it — a downloaded voice registers under a decorated
name, and Ava and Ava (Premium) are two different voices that sound different.
build_audio.py refuses an unknown name rather than letting say fall back to the
system default, and accepts a bare name only when it resolves to exactly one voice.
Other calm female options: Ava (Premium), Allison, Samantha (compact, no download).
Any voice must honor the [[slnc]] and [[char LTRL]] embedded commands — check a
new one with:
say -v NAME -o /tmp/a.aiff "One. [[slnc 4000]] Two." # must be ~4 s longer than without
say -v NAME -o /tmp/b.aiff "[[char LTRL]]c[[char NORM]]" # must be short, and not say "Capital"parse_pool.pyreads the official.docxdirectly and emits structured JSON. It keys off the pool's fixed 7-line question blocks, so the cover page, errata list and syllabus are ignored without hardcoding line offsets.build_audio.pyturns that JSON into asayscript and renders it. Pauses use[[slnc N]]; answer letters use[[char LTRL]]in lowercase, which forces the letter name — uppercase makes the voice announce "Capital A".normalize_for_speech()rewrites the pool's notation so it reads aloud correctly:146.52 MHz→ "megahertz",4:1→ "4 to 1",P = I2 x E→ "P equals I squared times E",5/8→ "five eighths",figure T-1→ "figure T 1",VHF/UHF→ "VHF UHF",-3 dB→ "minus 3 decibels".- The spoken scripts are kept in
audio/scripts/— read them to check exactly what the voice will say, or hand-edit and re-render a single file.
python3 -m unittest -v test_hamaudio33 tests covering the parser (including malformed blocks and wrapped answers), every speech-normalization rule, the question layout, and the real pool: 409 questions, unique ordered IDs, group counts matching the syllabus, the four errata corrections present, and no unspoken symbols left in any question.
The rendered audio was verified with ffmpeg silencedetect: every file contains
exactly one 4-second silence per question (measured 4.00–4.26 s).