A GPIB (IEEE-488) speech synthesizer peripheral. Plug it onto the bus, print to it from any GPIB host, and it speaks what you printed through one of three vintage speech ICs.
The hardware is a custom Pi Pico 2 W carrier board with GPIB transceivers + level translation + an iSBX (Intel Multimodule) expansion socket. The speech IC lives on a small daughterboard that plugs into the iSBX socket — swap daughterboards to swap voices. A six-digit TIL311 hex-display daughterboard is also supported as a no-audio bring-up / debug mode that shows the engine's phoneme stream on its displays.
The original use case was a GRiD Compass laptop printing to LPT1; the firmware listens at GPIB address 21 (the GRiD-DOS default printer address) and accepts plain ASCII print jobs. Any GPIB host that knows how to talk to a listener at a configured primary address works.
Each chip is a different daughterboard with a different phoneme
language. The firmware picks one at build time via the SPEECH_MODULE
make variable. Only one chip module is compiled in — there's no
runtime dispatch.
SPEECH_MODULE |
Chip | Text-to-phoneme engine | Notes |
|---|---|---|---|
sp0256 |
Microchip / GI SP0256A-AL2 | tts-c (NRL rules → SP0256 allophones) | Default |
sc01 |
Votrax SC-01A | typentalk (C++ port of the Votrax Type 'N Talk firmware) | |
ssi263 |
Silicon Systems SSI-263 / SC-02 | tts-263 (NRL rules extracted from the Mockingboard Speech Development disk) | |
til311 |
6-digit TIL311 hex display | Same engine as sp0256 |
No audio — phoneme codes scroll across the displays. Useful for bringing up the GPIB / iSBX path without a working speech IC. |
Each chip-module file in firmware/src/ owns its
entire pipeline (text → phonemes → hardware writes), because the three
chips' phoneme code sets are incompatible. Adding a fourth chip means
writing one more speech_<chip>.c against the small contract in
firmware/src/speech_chip.h.
See firmware/PREREQS.md for one-time setup
(toolchain, Pico SDK, TTS engine checkouts). Once that's done:
cd firmware
make SPEECH_MODULE=sp0256 # or sc01 / ssi263 / til311
make flash # picotool loads build/gpib_speech.uf2make always re-runs cmake configure, so changing SPEECH_MODULE
between builds works without make clean.
The TTS engine source checkouts default to ~/projects/pi/tts-c,
~/projects/pi/typentalk, and ~/projects/pi/tts-263. Override via
e.g. make TTS_263_SOURCE_DIR=/some/other/path, or pass an empty
value to make CMake fetch the source from GitHub automatically.
Plug the gpib-speech into your GPIB bus, plug the desired speech daughterboard into its iSBX socket, plug a small speaker into the audio output, and power it. From the GPIB host, send ASCII text to device address 21.
The firmware:
- Buffers incoming bytes until it sees a CR/LF.
- Hands the whole line to the chip's text-to-phoneme engine.
- Streams the resulting phonemes to the speech daughterboard over iSBX.
From a GRiD Compass running GRiD-DOS, that means just:
echo HELLO WORLD > LPT1
From any other GPIB host (Prologix adapter, HP-IB controller, NI-GPIB, etc.), it's whatever your stack's equivalent of "address device 21 as listener, send text" is.
The Pico's USB-C port appears as a USB CDC serial device on the host
(/dev/ttyACM0 on Linux). The firmware emits a per-byte trace of
every GPIB byte received plus the phoneme stream produced by the
text-to-phoneme engine, e.g.:
rx: 0x68 h [EOI]
rx: 0x65 e [EOI]
...
tts: "HELLO" -> HH EH LL OW PA4
make debug-connect from the firmware/ directory opens tio on
/dev/ttyACM0.
| Path | Contents |
|---|---|
firmware/ |
Pi Pico 2 W firmware (Pico SDK + CMake). Build instructions in firmware/PREREQS.md. |
netlist.txt, partlist.txt, schematic-v0.7.pdf, gerbers/ |
Main-board hardware design files (Eagle netlist + fab artifacts). |
netlist-module, partlist-module.txt |
Daughterboard design files. |
Three open-source text-to-phoneme engines do the heavy lifting, all from Scott Baker:
- tts-c — NRL rules → SP0256 allophones
- typentalk — C++ port of the Votrax Type 'N Talk firmware
- tts-263 — NRL rules → SSI-263 phoneme bytes
The GPIB listener/talker state machine was ported from blackgpib, a Pi Pico GPIB peripheral emulator for the GRiD Compass.