Twitter Enabled Text to Speech by amandaghassaei
Featured
main2.jpg
Let the world know what you're eating for breakfast with an 80's style vocal synthesizer!  This project uses an Arduino to send your Twitter stream to a voice generator chip called the SpeakJet.  The setup that I use here can also be extended to other applications where you'd want to translate text into speech, some ideas:

-a robot which announces things or responds to its environment by speaking
-some kind of assitive technology for the deaf or handicapped
-at the very least, it's a fun alternative to using the serial monitor to print data from the Arduino

In this setup the Arduino requests and receives information from Twitter via an Ethernet shield, which is directly plugged into a router (the USB connection shown in the picture is being used solely for power, not data transmission).  An intermediary chip called the TTS256 translates serial text data from the Arduino into a series of allophones to send to the SpeakJet.  The output from the SpeakJet is sent to an amplifier and then to a small speaker.

A demo of the SpeakJet's voice can be found here.

Parts List:

(x1) SpeakJet IC Sparkfun COM-09578
(x1) Text to Speech chip for SpeakJet - TTS256 Sparkfun COM-09811
(x1) Arduino Uno Sparkfun DEV-11021
(x1) Arduino Ethernet Shield Sparkfun DEV-09026
(x1) 8ohm Speaker Sparkfun COM-09151

(x1) LM386 Amplifier Digikey LM386N-1/NOPB-ND
(x1) 0.047uF ceramic capacitor Digikey P4307-ND
(x1) 220uF electrolytic capacitor Digikey P15322CT-ND
(x1) 10ohm resistor Digikey CF14JT10R0CT-ND
(x1) 10kOhm potentiometer, linear taper Digikey 987-1308-ND
(x1) LED Digikey 365-1175-ND
(x1) 220ohm resistor Digikey CF14JT220RCT-ND
(x2) 10kOhm resistor Digikey CF14JT10K0CT-ND

Other Materials:

Jumper wire
Solder
USB cable
Ethernet cable
breadboard
 
Remove these adsRemove these ads by Signing Up

Step 1: Wire up the SpeakJet with Arduino

I wired up the SpeakJet similarly to how it is wired in Sparkfun's Arduino shield for the SpeakJet called the "VoiceBox Shield," here is their schematic.  The main difference between the way I set up the SpeakJet and the way it is set up on Sparkfun's shield is the amplifier;  I didn't include an amplifier in my circuit yet as I was just trying to get the chip working with the minimum amount of parts, I'll show how to set up an amplifier in a later step.  Additionally, I was confused by the Jumper labeled "jumper-32-3" in the sparkfun schematic, in my circuit I just hooked digital pin 2 of the Arduino directly to pin 10 of the SpeakJet.  The circuit I set up is shown above, this schematic shown in fig 2 was modified from the original eagle files provided by Sparkfun, I've also included some photos of the breadboard setup for reference.

When you wire up the circuit and upload the code below (written by the Sparkfun folks), the SpeakJet will say "ready" then output the message "All your base are belong to us" in Robot-Speak voice followed by some R2D2-esque beeps, and light up the green LED attached to pin 16.  (Of course, you will need to hook up a speaker between pin 18 of the SpeakJet, labeled "V_OUT" in the schematic above, and GND to hear this message).  I used a small, 8Ohm speaker and only heard the message very faintly (this is why it's good to eventually amplify the output from the SpeakJet before sending it to speakers).  Press the Arduino's reset button (fig 4) to hear the message as many times as you like.
If you want to add you own messages into this code you can use the SpeakJet Dictionary as a reference.  I'll walk you through an example here.  I want to get the SpeakJet to say the phrase "Amanda is rad."  The first thing I do is construct each of the words based on the examples in the SpeakJet dictionary.  For "Amanda" we have:

man= \MM \SLOW \AY \SLOW \NE
duck= \DO \SLOW \UX \KE


Combine these to get

Amanda= \SLOW \UX \MM \SLOW \AY \SLOW \NE \DO \SLOW \UX

"is" is listed in the dictionary:

is = \SLOW \IH \ZZ

for "rad" combine the following:

rabbit=\SLOW \RR \AY \BE \RELAX \IH \TT
red = \RR \SLOW \EH \ED


to get:

rad= \SLOW \RR \AY \ED

Pages 15 and 16 of the SpeakJet User Manual gives all the numerical codes for each of these sounds.  Here is my example transcribed to numerical form:

Amanda = \SLOW \UX \MM \SLOW \AY \SLOW \NE \DO \SLOW \UX
Amanda =      8      134  140      8     132      8     141  175      8     134

is = \SLOW \IH \ZZ
is =      8     129 167

rad = \SLOW \RR \AY \ED
rad =      8     148  132 176


We can set the volume, speed, and other parameters of the speech by calling the numbers 20-23, I copied the following values from the Sparkfun code above:

20, 96, 21, 114, 22, 88, 23, 5,

this sets Volume (20) to 96, Speed (21) to 114, Pitch (22) to 88, and Bend (23) to 5.  You can play around with these numbers to learn more about how they work.  If you read the table on page 15 of the SpeakJet Manual you can find out about other control commands, as well as how to incorporate pauses into your speech. 

Putting this all together, I have the following series of numbers:

{20, 96, 21, 114, 22, 88, 23, 5, 8, 134, 140, 8, 132, 8, 141, 175, 8, 134, 8, 129, 167, 8, 148, 132, 176}

And here is the final code, it is mostly copied straight from the Sparkfun code above (I made the last "a" and "d" in "rad" slow by putting an extra 8 in front of the numbers 132 and 176 to get these parts to sound a bit more clear):
sudeepvnarayanan says: Feb 13, 2013. 7:37 AM
thanks....
am trying to do the same....
hope it works:-)
sudeepvnarayanan says: Jan 23, 2013. 10:21 PM
mam,
i would like to do the same project with pic instead of arduino.
is it possible..?
amandaghassaei (author) says: Feb 4, 2013. 11:18 PM
yes, it's definitely possible, but I don't have any experience with pic sorry!
shahrum123 says: Nov 26, 2012. 4:04 PM
Ma'am,

Thanks for posting such an excellent project. I have a quick question. I am trying to use the system for a robot. The point is that if someone asks the robot a question, I can input the answer in the Serial port monitor of the arduino and then the robot reponds with the answer. I was wondering if the following addtion to our code would work.

void loop()
{
while (Serial.avaiable () >0) {
speakjet.println (Serial.read());
}
}

I am using your project as part of a bigger project to help the blind. If it works I will definetely share with you. Thanks.
amandaghassaei (author) says: Nov 26, 2012. 4:37 PM
the speakjet can only be used to translate text to speech, it cannot translate speech to text, is that what you are trying to do?
shahrum123 says: Nov 26, 2012. 5:43 PM
I am still doing text to speech but instead of putting the text in the program, I want to input the text in the serial port monitor of the arduino.
amandaghassaei (author) says: Nov 26, 2012. 6:19 PM
oh, now I understand, yes this will work.
shahrum123 says: Nov 30, 2012. 11:08 PM
Ma'am. The code does not work. Whenever I input something in the Serial Port monitor it does not output the text to speech conversion. Can you please help?
amandaghassaei (author) says: Dec 2, 2012. 2:46 AM
can you post your code?
shahrum123 says: Nov 26, 2012. 7:08 PM
I am waiting for the parts. I will let you know if it works. Thanks ma'am.
shahrum123 says: Nov 26, 2012. 5:44 PM
Please let me know if you need further clarification
AntzyP says: Nov 15, 2012. 4:09 AM
awesome!

(crowd chants in background) video! video! video!
Trecool771 says: Nov 8, 2012. 1:57 PM
Amanda is rad!
amandaghassaei (author) says: Nov 8, 2012. 2:08 PM
:)
techbitar says: Nov 8, 2012. 12:39 AM
Love it!
TobaTobias says: Nov 5, 2012. 1:57 PM
Great project and very resoursefull! Hopefully I'll be able to do this without the ethernet shield.
Thanks!
amandaghassaei (author) says: Nov 5, 2012. 2:43 PM
cool, what are planning to use it for?
TobaTobias says: Nov 5, 2012. 4:15 PM
I'd like to make a little Robot, I've been searching for weeks ways to send a tweet through arduino and processing, I checked the make it tweet guide but I couldn't find an answer because OAuth had been outdated or something changed in twitters app development. So I recently found a code from Robotgrrl with a new code for processing and it worked, so I just have to write a code for my arduino to connect with processing. Im using a PIR sensor to trigger the sketch. Hopefully I can find a cooler idea, like a robot than just a small simple PIR sensor. But for now the sensor good for tweaking. ;)
amandaghassaei (author) says: Nov 5, 2012. 4:27 PM
cool, do you have a link to the processing code?
TobaTobias says: Nov 6, 2012. 9:04 PM
Sure, here it is;
http://robotgrrl.com/blog/2011/02/21/simple-processing-twitter/
Build_it_Bob says: Nov 6, 2012. 5:20 PM
Way to go Amanda !! Love this !!! I still have a pile of the old radio shack IC's and always dreamed of making them talk . This looks a lot more like something I can handle.
Keep up the awesome work ! Love your style !
Build_it_Bob
binoyxj says: Nov 6, 2012. 5:44 AM
Always wanted to make something like this. Thank you, Amanda.
stringstretcher says: Nov 5, 2012. 11:27 PM
I love your instructables, Amanda. Keep 'em coming! We always learn something from them.
amandaghassaei (author) says: Nov 6, 2012. 1:09 AM
thanks! good to hear!
themoose64 says: Nov 5, 2012. 3:22 PM
This is way to complicated for me to make ( or at least right now -I havent taken a tech class yet) But this is way COOL! Nice work!
amandaghassaei (author) says: Nov 5, 2012. 3:27 PM
it's actually not too hard. If you just follow the schematics closely and copy the code that I've written, you don't really need any electronics experience to get this up and running.
randofo says: Nov 5, 2012. 12:23 PM
This is some good thorough info that you have shared here Amanda.
amandaghassaei (author) says: Nov 5, 2012. 2:43 PM
thanks randy!
Pro

Get More Out of Instructables

Already have an Account?

close

PDF Downloads
As a Pro member, you will gain access to download any Instructable in the PDF format. You also have the ability to customize your PDF download.

Upgrade to Pro today!