Millis timer question
You have to keep track of time once a button is pressed (LOW). So buttonLowTime is initialized every time you press the button. In the if logic, you first check if the buttonstate is LOW and if the said time has been passed.
But you also mentioned you want to play the audio once. So you need to keep track if you already played the audio. So, a flag, timeoutAudioPlayed has been created to keep track of that. So, now, the 3rd audio will only play if:

The button is pressed
and is pressed for more than said time (BUTTON_LOW_TIME_MAX)
and if the audio hasn't been played.




void fire()
{
  static int buttonLowTime = 0; &lt;-------------------
  static bool timeoutAudioPlayed = true; &lt;---------
  
  int reading = digitalRead(buttonPin);
 
  if (reading != lastButtonState) 
  {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }
 
  if ((millis() - lastDebounceTime) &gt; debounceDelay) 
  {
    if (reading != buttonState) 
    {
      buttonState = reading;
 

      if (buttonState == HIGH) 
      {
        mp3_play (1); //power down sound 
      }
  
      if (buttonState == LOW) 
      {  
        mp3_play (2);  // fire sound
        buttonLowTime = millis(); &lt;-----------
        timeoutAudioPlayed = false; &lt;---------
      }
    }
  }

  // The logic for timeout audio &lt;------------
  if((buttonState == LOW) &amp;&amp; (millis() - buttonLowTime) &gt; BUTTON_LOW_TIME_MAX &amp;&amp; timeoutAudioPlayed == false)
  {
    mp3_play (3);
    timeoutAudioPlayed = true;
  }

  lastButtonState = reading;
}