I think the problem is you are initializing your MemoryStream
with a buffer, and then writing that same buffer to the stream. So, the stream starts off with a given buffer of data, and then you're overwriting it with an identical buffer, but in the process you're also changing the current position within the stream to the very end.
byte[] soundBytes = Convert.FromBase64String(str);
MemoryStream ms = new MemoryStream(soundBytes, 0, soundBytes.Length);
// ms.Position is 0, the beginning of the stream
ms.Write(soundBytes, 0, soundBytes.Length);
// ms.Position is soundBytes.Length, the end of the stream
SoundPlayer ses = new SoundPlayer(ms);
// ses tries to play from a stream with no more bytes to consume
ses.Play();
Remove the call to ms.Write()
and see if it works.