Put these files in an empty directory. command 'sj' on a Raspberry Pi takes a series of phonemes in SpeakJet mnemonics and converts them to binary SpeakJet codes which it sends to an AtariVox+ on /dev/ttyUSB0 It uses a unix system call to sleep for the duration of each phoneme to reduce the risk of buffer overrun on systems where there is no hardware flow control, but be aware that this hack is only approximate, since some SpeakJet commands can alter the time that an utterance can take and I haven't taken those into account - this is very much just a rough and ready utility for programmers. To generate the SpeakJet mnemonics which this code sends to the AtariVox+ as binary data, the linux-base "festival" text to speech command can be used. It did require some tweaks to extract the phonemes and convert them to SpeakJet format. I've included a "fest2sj" script to invoke festival and extract the results. It's a bit hacky but it works. Examples: $ ./fest2sj hello vectrex \HO \AX \LO \OW \VV \EH \KO \TT \RR \EH \KO \SO $ ./sj \HO \AX \LO \OW \VV \EH \KO \TT \RR \EH \KO \SO HO (184:70) AX (133:70) LO (146:70) OW (137:70) VV (166:70) EH (131:70) KO (195:55) TT (191:50) RR (148:70) EH (131:70) KO (195:55) SO (188:40) 13 bytes sent to AtariVox+ Note that because '\' is a linuc shell escape character to send the next character unmolested, the command above is really: $ ./sj HO AX LO OW VV EH KO TT RR EH KO SO - However I allow a preceding '\' in front of mnemonics, and I print the '\' characters out in the 'fest2sj' command, because that's the format that the "Speakalator Web" program uses, so doing so may make cut & pasting into that program easier for you. As well as converting SpeakJet mnemonics into binary code, the SJ utility will also send the ASCII codes that switch the chip into "SCM" mode to drive the synthesizer directly. This data should be sent as separate parameters, eg $ ./sj \\ 0 0 J 3 2 H 0 1 N rather than the more user-friendly \\0 0J 32H 01N that you might expect. Any single-character parameter will be treated as a Ascii codes and output verbatim. Finally, binary bytes can be output by specifying them in decimal or hex, the latter as two hex digits preceded by \x, eg "\x41" (which is 65 or capital 'A'). Single digit decimal 0 to 9 is ambiguous so I would recommend specifying '\x00' to output a binary zero and '0' for the ascii character '0' (binary 48) Any parameter which is not understood will probably be output as a binary 0 rather than causing an error. I did say that this was rough and ready software, and I found that for my purposes it was more help to just carry on after an error than fail. YMMV. Graham Toal 22 April 2026