You should use an MCU with PWM generators to do that.

The problem with PWM is that the max resolution is quite low (10-bit) so you are effectively limited to 8-bit PCM.

 - Use a DSP editor like Audacity to export a 16KHz unsigned 8-bit WAV.
 - Import the WAV file as an array of unsigned char.
 - Set your PWM freq to the resonant freq of your speaker (eg. 31250Hz)
 - Set your PWM timer to fire at 16KHz and set the PWM duty cycle to the next array value. 

I use 16KHz sample rate because: 
 - Reduced memory footprint
 - Fewer timer interrupts
 - PWM's limited resolution does not seem to benefit from anything above 16KHz
 - I use piezo speakers directly wired to PWM pins in H-bridge.
 - A separate amp module might benefit from higher sample rates.