Text-to-speech with the SpeakJet

SpeakJetTTS_Schematic_0.PNG (7932Bytes)

This how-to article describes an easy way to add unlimited text-to-speech to your Arduino projects (with a bit of modification to my source code below, the PicAxe, Stamp BS2 or almost any other microcontroller can also be used). This article uses the popular SpeakJet speech synthesizer/complex sound IC. However, the SpeakJet can be a bit tricky to program! Wouldn't it be great if you could just send English text to the SpeakJet, and simply have it say what you just typed, without spending so much time looking up the SpeakJet speech codes just to speak a few words? Yes, it actually is possible! I will get to that in a moment...

In Ants original SpeakJet how-to, and in my first blog about the SpeakJet, PhraseALator software is used to help generate the SpeakJet speech codes. This is a bit easier than looking up the speech codes within the SpeakJet user manual, but as many of you who have tried PhraseALator have found out, PhraseALator is limited to the words stored within its dictionary file.

For this how-to article, I will be taking a different approach, one that will provide your SpeakJet projects with the ability to produce unlimited speech. One that can take English text and translate it to speech codes to be directly sent to the SpeakJet (a text-to-speech translator using the the SpeakJet).

You could take either a software approach or a hardware approach to add text-to-speech to the SpeakJet. As I write this, I don't know of an easy software "text-to-speech" solution for the SpeakJet , and I don't have the time to develop one myself (although I am aware of one being developed by LetsMakeRobots member Ro-Bot-X). However, I have run across a hardware solution where someone has already put a text-to-speech algorithm onto an IC! This component is known as the TTS256 Text-to-Code processor which was custom designed for the SpeakJet. By adding this IC to my SpeakJet circuit, we now have text-to-speech capability! Adding speech to your projects becomes almost as easy as adding a few lines of code and typing in what you want it to say. One of the benefits of this approach is that it requires very little from the Arduino or other CPU as far as I/O and memory.

Parts needed: Most of the parts should be available through many large electronics retailers on the web (such as DigiKey, Mouser, or Jameco) or your local electronics parts outlet. Where they are not, I've added links to vendors for the component.

1 - Arduino (Refer to Arduino website on where to buy and how to setup your Arduino. In the prototype project built in this article (seen in my first video), I used an AdaFruit BoArduino, but you could use nearly any Arduino or Freeduino clone.)
1 - SpeakJet
1 - TTS256 text-to-speech processor
1 - LM386N amplifier IC
2 - .01uF capacitors
2 - .1uF capacitor
1 - 10uF electrolytic capacitor
1 - 100uF electrolytic capacitor
1 - 10K resistor
2 - 27K resistors
1 - 10K potentiometer (set to approx middle of range to start)

My schematic is based on information and examples shown in both the SpeakJet (pdf) and TTS256 (pdf) user manuals. The following is the schematic that I built this project from.

SpeakJetTTS.png

See file attachment for a larger image...

The following sketch for the Arduino is an example of how to make this work. As you can see, just regular English text, no more mysterious looking speech codes! The first video demonstrates the sketch below. You can modify the text in the sketch to make it say almost anything you want!


// SpeakJet text-to-speech "All LMR are belong to us" demo

//set up a SoftwareSerial port for Speakjet Shield
//rxPin: the pin on which to receive serial data from TTS256
//txPin: the pin on which to transmit serial data to the TTS256
#include <SoftwareSerial.h>
#define txPin 2
#define rxPin 3
SoftwareSerial sjSerial = SoftwareSerial(rxPin, txPin);

void setup(){
// initialize the serial communications with the TTS256/SpeakJet
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
sjSerial.begin(9600);// set the data rate for the SoftwareSerial port
delay(1000); // wait a second for the Arduino resets to finish (speaks "ready")
sjSerial.println("All L.M.R. are belong to us!"); // send the text to speak to the TTS256
}

void loop()
{}


I have found the TTS256 does a pretty good job with most English words. Some words have to be "creatively misspelled" in order to get them to sound correct. One example I found right away is "robot". Apparently "robot" is an exception to the phonetic rules written into the TTS256 as it comes out sounding more like "raw bot" rather than "row bot". Sometimes when working with small micros such as the Arduino you have to put up with a little quirkiness. :-) For speech in my projects, I can put up with a little misspelling once in awhile!

Also, with the circuit as shown here, it is pretty easy to "overflow" the SpeakJet buffer with too much text (the SpeakJet will either stop speaking, or spews out random words from your text). Adding a few well placed "delay(milliseconds)" functions can help, but you could also monitor the SpeakJets "buffer-half" or "d1/speaking" lines to determine when you are about to overflow.

The photo below and the star in my second video show an Arduino shield PCB I made based on the above circuit. I have added more noise shielding, headphone/speaker connections, busy/buffer-half monitoring and easy switching between the SpeakJet and TTS256 configurations to it. At this point, I don't know how much interest there may be in LMR-land (and beyond) for this shield, but if there are enough people interested in buying one, I can make boards/kits available...

SpkJetShldTTS.jpg

More comments available on my original SpeakJet text-to-speech blog post...

2010 Jan 20 Update:
Revised schematic uploaded...

 

https://www.youtube.com/watch?v=brTbNNFFpdQ

Make Blog
I just saw this myself a few minutes ago. Now this is on Make Blog. Wow!

Where to buy
Where can i buy this shield or just the pcb from??

wow
I really love this project. It seems to be exactly what I’m looking for. Would love to see a kit available with a pcb, I’m a bit of a novice at electronics. Keep up the good work.

Schematic inprovements

Hi droidbuilder

I used your schematic as inspiration when building my speaking robot as my exam project.

I found some improvements by looking at the datasheets (i.e. the reset of TTS256 is active high while the reset of the speakjet is active low. That means you would reset the TTS256 all the time and when you press the reset button then the speakjet would be reset all the time)

I also have a video of the robot running the track while playing sound.

 

 

VIDEO:

See the video of the talking robot at http://vimeo.com/8282296

 

Best regards

Benjamin

Schematic

Benjamin,

Would you mind posting a schematic of a higher resolution, so that we can read it?

Thanks!

Aaron

PCB

Droidbuilder,

I am interested in your PCB for this circuit. I program PICs (not Arduinos), so I have no use for this particular “shield”; however, I am interested in your PCB design - if you’re willing to share it (even just a PDF copy).

Don’t worry; I have no interest in stealing your design and making money from it. I simply want to see if you’ve added any nice features to your PCB that I would like to put in my PIC version PCB.

Either way, I will be designing a PIC board with all the same chips and functionality (just using a different host processor). If anyone is interested, I’ll give you the artwork file when I’m finished. This will work for PICs - not Arduinos.

Thanks!

Aaron

PCB

Although I designed my shield PC board around the Arduino, it should work fine with a PIC. All you would have to do is make a few wire connections to where the Arduino headers go (I only use six pins). The improvements on my board mostly deal with allowing handshaking- those are already well covered in the SpeakJet documentation.

Nothing about my design really is host processor specific. All this requires is a serial connection and power. Throw in a line or two (for the handshake options) and you have it…

 

SpeakJet Shield kit
I am working on making a kit available. I have a very small run of boards in hand now, but documenting everything completely for “consumer use” has been harder than I expected. I also need to look into a possible reset issue another poster mentioned (although I’ve not seen it create any issues yet).

Thanks for pointing that out!

Oops, missed the active-low/active-high thing. I will need to take a closer look. I was about to order another set of boards when I saw your post.

Oddly enough, this doesn’t seem to affect the function that much. The idea was that when the Arduino gets reset, the SJ and TTS256 would also get reset.

Anyway, many thanks.

UPDATE:

AH! Smacking hand on head. The reset scheme on my SpeakJet Shield is a bit different than what I drew for the “abbreviated” schematic I drew for this article - that is why I hadn’t noted the problem. It does warrant some experimenting though, as I really want to be sure my SpeakJet Shield board isn’t going to have issues after I send out to have more PCB’s made.

purchasing the shield
How can we purchase the shield or contact you?

re: purchasing the shield…

I am still working on that. I hope to have a web store available soon (hopefully end of this month) for people to buy boards/kits, download documentation and some sample code. There is a helluva lot work to be done and I’m only one person - plus I’m having to learn how to set all this up as I go!

As far as contacting me - if you are a member here, you can hover the mouse cursor over my user name by my avatar photo, there should be a “contact” link (or at least I think so?)…IF NOT, please reply to this post so I can fix that…

I will post the web store link here and in my blog when I have it ready…

Thanks for your interest!

 

Video
"Page Not Found"

I have boards/kits available

I still have a few of my first run of SpeakJet Shield kits and boards available yet. http://www.droidbuilder.com

The board house had silkscreen problems with my second batch, but another set has been ordered, I should have them in 3-4 weeks…