I used a global because it was convenient to call:
Assets::getSound("mySound").play();
Can't you have an object that you pass only where you need it? Almost nothing is "just there" and needs to be global, you can mostly limit the scope.
assets.getSound("mySound").play();
Of course, you now need to think how you store and forward
assets But the approach is much better in the end, because you explicitly state the dependencies in your code. On one side, that makes overall design better -- you begin to reflect where you actually need sounds, instead of just using it anywhere. On the other side, you only have a small interface to the sound, which is less error-prone and can be easily maintained and debugged. For a global variable, it's very annoying to track access, it may happen from anywhere. In multithreaded environments, you additionally need to lock, which introduces more error sources and performance problems.
Some people around here REALLY hate that you used "new" by the way, so maybe consider a unique/shared pointer?
What is the reason not to use automatic variables?
sf::SoundBuffer s;