I have about 40 fonts on my card and I could not tell you what is in most of them.
Somewhere in there is the line I want, sitting in a file called quote17.wav, and
the only way to find it is to play them one at a time until I hit it. Last month I
finally got sick of doing that, so I transcribed the whole card and made it
searchable by what the files actually say. The scripts are on GitHub under MIT. I
am putting them here in case anyone else wants them.
How it was made, and what I checked
I wrote this with an AI assistant. The guidelines here ask about that, and I would
rather say it in the second paragraph than have someone dig it out later.
What it means in practice is that nothing went in untested. Every tool ran against
my own card first: 1,212 files across 43 fonts, roughly 53 minutes of audio. The
saber those came off is assembled and running. Anything the batch tool wrote got
SHA256-checked against its source afterwards rather than assumed.
You do not have to believe any of that. There is a script in the repo that builds a
fake card in a temp folder and runs the whole toolchain against it, including a real
apply and rollback on disk:
python .claude/skills/run-lightsaber-toolkit/driver.py
18 checks, about half a minute, and it needs no saber and no model download. So you
can find out whether the thing works before pointing it at hardware you care about.
There are 33 tests as well. If either falls over on your machine I would rather hear
about it.
What it does
Font authors do not document their files, so most of this is about finding out what
you already own.
$ python tools/search.py "i am your father"
3.9s IWVader/quote17.wav
"I am your father."
play IWVader/quote17.wav
That last line pastes straight into the serial monitor if you want to hear it.
When I do not know what I am looking for, report.py dumps the whole card instead,
one table per font, every spoken file with its text:
## IWVader
| File | Sec | ? | Line |
|---|---:|:-:|---|
| `quote09.wav` | 0.8 | | Good. |
| `quote13.wav` | 7.7 | | Impressive. Most impressive. |
| `quote15.wav` | 4.4 | | If you only knew the power of the dark side. |
One warning if you try this. Whisper will hand you a confident, fluent sentence for
audio that contains no speech in it at all. Point it at a blade hum and it invents
something. So doubtful lines get marked rather than deleted, because genuinely odd
speech gets flagged the same way and I did not want to lose real lines on suspicion.
There is an optional second pass using CLAP, which scores a fixed list of labels
instead of generating text and therefore cannot make anything up. The two are wrong
in opposite directions. That is the only reason running both is worth the bother.
Changing files goes through a batch tool that previews first, keeps a .bak of
whatever it replaces, and rolls back. It flatly refuses to overwrite an existing
file if the batch did not ask for a backup, which in my experience means the batch
is stale or I already ran it once.
There is also a docs/ folder of hardware things that cost me an evening each. The
two USB ports where only one of them carries data. The driver that kept getting
silently reclaimed by a background service belonging to completely unrelated
hardware. Why presets.ini quietly overrides your config and survives a reflash. If
I am honest that folder is probably worth more than the code, since it needs no GPU
and nothing installed.
What it will not do
It reads whatever it likes off the saber and only ever writes to the SD card. It
never touches firmware. Flashing is already solved by people who know what they are
doing, and docs/flashing.md just points at them rather than competing.
Scope
Tested on exactly one saber: Proffieboard v2.2, single button, ProffieOS 7.15,
Windows 11. The card tools should be fine on any Proffie card. The PowerShell and
the driver instructions are Windows-only. Everything else I would guess works
elsewhere and I have not checked.
Credit
All of this sits on top of other people’s work. Proffieboard and ProffieOS are
Fredrik Hubinette’s. My saber is actually built with Fett263’s prop file and config
generator. NoSloppy’s SoundFontNamingConverter solves a different problem and is the
right tool when naming conversion is what you need.
The fonts are not mine and are not in the repo. .gitignore has kept audio out of
it since the first commit, because font licensing is murky and anything committed
once stays in history forever.
Happy to be told I have got something wrong.