Start listening after stopping ringing timer using wake word (#275)

Wake-up after stopping ringing timer using wake words such as "Okay Nabu", "Hey Jarvis" rather than "Stop" to get another command instead of the need to repeat the wake word.
This commit is contained in:
Omar Amin authored and GitHub committed 2026-03-31 00:11:25 +02:00
1 parent 9067648c87
commit 88fb2c5a49
1 file changed
+22 -2
+22 -2
View File
@@ -5,6 +5,7 @@ import hashlib
import logging import logging
import posixpath import posixpath
import shutil import shutil
import threading
import time import time
from collections.abc import Iterable from collections.abc import Iterable
from typing import Dict, List, Optional, Set, Union from typing import Dict, List, Optional, Set, Union
@@ -380,11 +381,30 @@ class VoiceSatelliteProtocol(APIServer):
def wakeup(self, wake_word: Union[MicroWakeWord, OpenWakeWord]) -> None: def wakeup(self, wake_word: Union[MicroWakeWord, OpenWakeWord]) -> None:
if self._timer_finished: if self._timer_finished:
# Stop timer instead # Stop the ringing timer, then start a normal wake-up after a short
# delay so the transition doesn't feel abrupt.
self._timer_finished = False self._timer_finished = False
self._timer_ring_start = None
self.state.active_wake_words.discard(self.state.stop_word.id)
self.unduck() self.unduck()
self.state.tts_player.stop() self.state.tts_player.stop()
_LOGGER.debug("Stopping timer finished sound") _LOGGER.debug("Stopping timer finished sound; will wake up in 1 s")
wake_word_phrase = wake_word.wake_word # type: ignore
def _delayed_wakeup() -> None:
if self.state.muted or self._pipeline_active:
_LOGGER.debug("Delayed wakeup skipped (muted=%s, pipeline_active=%s)", self.state.muted, self._pipeline_active)
return
_LOGGER.debug("Delayed wakeup: playing wakeup sound for %s", wake_word_phrase)
self._pipeline_active = True
self.duck()
self.state.tts_player.play(
self.state.wakeup_sound,
done_callback=lambda: self._on_wakeup_sound_finished(wake_word_phrase),
)
threading.Timer(0.1, _delayed_wakeup).start()
return return
if self.state.muted: if self.state.muted: