3D Printed Sound Bites





Introduction: 3D Printed Sound Bites

After I posted my 3D printed record project, I received an interesting comment from Instructables author rimar2000.  He described an idea he's had for a while about a strip of material that has audio information encoded on it so that it can be played back by quickly sliding a fingernail, credit card, or piece of paper along its surface.  This same basic idea has been implemented in various ways already, here are a few:

talking strip birthday card:

It's even possible to tune rumble strips on a road so that your car turns into a musical instrument as it drives over.  Here is a musical road near MT Fuji, Japan:

another musical road - Lancaster, CA:

The reason rimar2000 suggested this idea to me is because I'd already found a way to convert audio signals into a 3D printable model in my record project.  Using 3D printing it is theoretically possible to convert any piece of audio into a "sound strip," allowing anyone to encode customized messages into this physical format.

I recently found some time to put the code together and print out a few test strips, and unfortunately, I think my process needs a little more refining until it is ready for mass production, but I figured I'd post everything I've started here in case anyone else is interested.  The video below shows the closest I've come so far to reproducing my own voice saying "amanda."  If you know what it's supposed to say, you can kind of make out what's going on here, there are three distinct sections where the sound gets louder - corresponding to the three syllables in the word.

I made this on an Objet Connex500 UV cured resin printer at 300 dpi with 30 micron layers.  It's possible that printing at the max resolution (600dpi with 16 micron layers) might help a little bit, but I haven't had a chance to do it.  It's also possible that other materials or dimensions might help.  I was thinking that tilting the bumps on the surface of the strip so that they are pointing in a 45 degree angle instead of straight up might work better with the angle that the card is hitting them.  If you have any other suggestions please feel free to leave them in the comments.

Step 1: The Code

The main idea behind this project is to take an audio waveform and use it to modulate the height of the surface of a linear strip.  this way, any object passing across the surface will vibrate up and down in the hills and valley of the wave, these vibrations will cause vibrations in the air, which cause us to hear sound.  You will find comments in my code that talk about the specifics of how it works, follow these steps to create your own 3d models:

1.  Download Audacity.

2.  Open an audio file of your choice with Audacity.  Use Effect>Normalize to amplify the signal as much as you can without clipping.  Trim any excess blank space off the beginning an end of the clip, you will want to keep the audio as short as possible.  File>Export this file and save it as a WAV in a folder called "soundBites". 

3.  Download Python 2.5.4.

4.  Copy the Python code below and save it in the soundBites folder, this code converts the information stored in a wav file (audio) into a series of numbers inside a text file (txt).
Copy the file name of the audio file you just saved and paste it into the following line in Python:

             fileName = "your_file_name_here.wav"

Hit Run>RunModule, after a minute or two you will have a .txt file saved in the soundBites folder.

5.  Download Processing.

6.  To export STL from Processing, I used the ModelBuilder Library by Marius Watz.  Download the ModelBuilder library here, I used version 0007a03.

7. Unzip the Modelbuilder library .zip and copy the folder inside called "modelbuilder".  Unzip the processing .zip and go to Processing>modes>java>libraries and paste the "modelbuilder" folder in the "libraries" folder.

8.  Copy the processing sketch below and save it as "soundBites.pde" in the soundBites folder.  You can adjust many parameters in this code: the x/y/z resolution of the printer, the speed that you want to playback, the amplitude of the waves, the thickness of the strip, and more... you can even invert the wave to make it recessed within the strip.
9.  Change the name of the import file in the Processing sketch to match your txt file name:

             String filename = "your_file_name_here.txt";

10.  Hit "Run" in Processing, you should see a file appear in the soundBites folder called "your_file_name.stl", you are now ready for 3d printing.



  • Epilog Challenge 9

    Epilog Challenge 9
  • Science of Cooking

    Science of Cooking
  • Paper Contest 2018

    Paper Contest 2018

We have a be nice policy.
Please be positive and constructive.



Thank you very much for sharing this Amanda!
I just have a problem when running the module in Python, it tells me there is invalid syntax and does´t save the .txt file, so I don´t know how to continue...
Any tip on how to fix this? thank you :)


Thanks for your great project

I try to play with it, but i got trouble with python like following:

File "sound.py", line 21, in <module>
frameOneChannel[i] = frameInt[4*i+1]*2**8+frameInt[4*i] #separate channels and store one channel in new list
IndexError: list index out of range

python ver 2.5.4

any one had this issue??


It means your file is mono, try using an audio program to add the missing channel, so make your audio file stereo, event if its just the same content on each channel. Here is a way of doing that using audacity which is free:


Thanks! I hit the same issue.

commercial way?
Best regards, and congratulations on your work!

Giaccomo Fontanot, Industrial Designer.

printing square waves is the way to go. Are you interested in pursuing this goal in a more

Hi amandaghassaei. Your work is impressive. I am an Industrial Designer, very interested on this issue. I am retina to figure a way to replicate the talking strips from evades ago. I Have a CNC router, and a LOT of interest to see this working. I believe

The sound-strip idea was used at least as far back as 1955 - I remember an advertising novelty from the Schwinn bicycle company. A ridged red plastic ribbon/strip about 1/8 inch wide was tied to the center of a bicycle-wheel shaped disc (as a resonator). Running your fingernail along the strip clearly played "I like Schwinn bikes." I wonder how this was made - it sure was not computers encoding the speech.


Thank you for this instructables.

I am trying to print some words on different objects and find some applications for signaletic projects. So I want to get the wave of my sound, but without the thickness of the strip.

I have followed all your instructions and the .stl is a 15M file for just one word with 483324 triangles written. to big for my CPU.

Is there a way to just have the curve ?

I have tried to change the thickness and different parameters but I still have a big block with more 400.000 triangles, not just the desired curve.

all the best for your different beautifull project and thank you for your works.


change this function:

void drawGrooves(float[] audioData){

int totalSampleNum = audioData.length -1;
float xPosition;
float zPosition;

//draw outer lower edge of groove
for (int sampleNum=0;sampleNum<totalSampleNum;sampleNum++){
if (sampleNum%rateDivisor == 0){
xPosition = speed/samplingRate*sampleNum;//length/sec * sec/samples * sampleNum
zPosition = -depth-amplitude+audioData[sampleNum];
if (invertGroove){
} else {

int lastSampleIndex = 0;
float finalZPosition = 0;
//draw inner lower edge of groove
for (int sampleNum=0;sampleNum<totalSampleNum;sampleNum++){
if (sampleNum%rateDivisor == 0){
xPosition = speed/samplingRate*sampleNum;//length/sec * sec/samples * sampleNum
zPosition = -depth-amplitude+audioData[sampleNum];
if (invertGroove){
finalZPosition = -zPosition;
} else {
finalZPosition = zPosition;
lastSampleIndex = sampleNum;


print("total length: ");
println(" inches");

Very interesting, maybe the combination of lowest amplitude and something to make resonate and amplify like string or membrane would improve. I
If you still didn't found way to get the audiosample value with Processing without the help of the Python script it is very fast easy with the Minim library (already there with the IDE) :

import ddf.minim.*;

Minim minim;
AudioSample sample;
float[] audioDataLeft;
float[] audioDataRight;

void setup() {
minim = new Minim(this);
sample = minim.loadSample("yourFilePathHere");
audioDataLeft = sample.getChannel(BufferedAudio.LEFT);
audioDataRight = sample.getChannel(BufferedAudio.RIGHT);
//etc ... etc ...

etc ...

You'll get the audio data as array of float value between -1 and 1, if I remember well.