While your code works and does exactly what you expect it to, I suggest that you look to revise it because it has delays in the ISR which is generally considered a 'bad thing' and can lead to problems in other situations.
In devices such as yours where you have either one or two interrupt levels (and you are using a device with 2 levels but configured to only use one of them), when an ISR is running then no mainline code (i.e. all of the code that isn't in the ISR) cannot run. The hardware will continue but if that also triggers an interrupt, it will not be processed until the ISR code completes. (Your MCU can have high and low priority interrupts where the high priority ISR can interrupt the low priority ISR but that is a more advanced concept and, if you are not clear on what is going on, can lead to further problems.)
Now your ISR will take about 3 seconds to run (1mSec in delays and 3000 times around the loop)which means that no other code can run for those 3 seconds. 3 seconds is an eternity for a microcontroller.
What you normally do in a situation like this is to have the ISR do whatever is needed quickly and in this case that means clear the interrupt flag and set a flag variable of your own, and then leave. In your main loop, you can check to see if your flag has been set and then process the speaker code if it has; remembering to clear your flag as well.
For simple code such as yours, perhaps put the speaker code after the sleep call.
Susan