You know, reading the little blue error that pops up when you spawn would have helped you a bit.
You need to know the difference between the server and the client, and how they are both different machines that run at the same time and interact with each other via various means known as console commands, usermessages, networked vars, and datatables.
PlayerInitialSpawn is purely serverside, and since surface.PlaySound is purely clientside, you need the player who just spawned to play it in such a way that no other player will hear it.
This is what people consider the “noob way” of doing it, but it does the job well, and is not exploitable as long as you use it properly.
[lua]function FirstSpawn( ply )
ply:SendLua(“surface.PlaySound ( ‘sound/Blabla2.wav’ )”)
hook.Add( “PlayerInitialSpawn”, “DoWelcomeSound”, FirstSpawn )
resource.AddSingleFile( “sound/Blabla2.wav” )[/lua]
SendLua sends some Lua code to a player and makes them execute it clientside. You should use it ONLY for short pieces of code like this one. If you want to run longer code on a client, you should consider using usermessages (http://wiki.garrysmod.com/?title=Usermessages). It’s a little bit hard to understand at first but if you keep practicing, it’s easy as piss.
Also, make sure the path to your sound is correct. Sounds are usually placed in the sound folder.