I got interested in storing audio snippets in the flash memory of a microcontroller and playing them back. For Arduino this can be done by first converting a WAV file into a raw data array in a header file using Mathieu Brethes' wave2c tool. For playback the most popular option by far seems to be Michael Smith's PCM library, which outputs a 62.5 kHz square wave on Pin 11 with an amplitude that can be changed in 256 discrete steps at a rate of 8 kHz. You can produce discernible sound with no or minimal filtering and amplification of this raw PCM signal. Just apply it across the coil of a loudspeaker and rely on the coil inductance and your ears to do the low-pass filtering.
I'm hoping to improve a bit on all this earlier work and will document my success (or lack thereof) in this project. So far I have modified wave2c to play samples longer than 8 seconds, and I've added bit crushing (optionally reducing the bit depth from 8 to 4, 2 or 1). I've also modified the PCM library to be able to play a sample multiple times, and multiple different samples, and to not use arduinoisms (so that avr-gcc can link without any external dependencies). I've also built a simple active filter that does a good job of removing the 62.5 kHz "carrier wave".
Hint: use more than one AVR to increase quality. Try stereo