It doesn't sound as if you're familiar with game loops and delta time.
The timer offers you a node that can fire off an event after the amount of time you issue for it. I believe the options for fixed and idle determine when the timer updates itself internally, and you need not do anything with the fixed_process
function. Fixed ensures a consistent timestep, idle is variable, but they both strive to maintain the target frame rate. So I don't think there will be an issue either way, unless you can detect some sort of millisecond of delay.
If the timer is not set to one shot, it will continually fire it's event. Place the code there, and if it's set to fixed, it should remain synchronized to the fixed time step loop, at whatever framerate you decide on.
There are many ways of achieving the same result.
If you want to do it manually, that is also fine. The loops are doing their best to maintain their timing, and the delta time is really only used for creating frame by frame changes to things like object velocity and such. You're dealing with something at a one second interval, so there are 59 other iterations there where nothing should happen.
Might look something like this:
var time = 0.0
func _ready():
set_fixed_process(true)
func _fixed_process(delta):
time += delta
if(time >= 1):
time -= 1
play_my_sound()