{"record":{"id":"57fa7f5c9b225c4b","repo":"home-assistant/core","slug":"duplicate-wake-up-detected","errorCode":"duplicate_wake_up_detected","errorMessage":"Duplicate wake-up detected for {wake_up_phrase}","messagePattern":"Duplicate wake-up detected for (.+?)","errorType":"exception","errorClass":"DuplicateWakeUpDetectedError","httpStatus":null,"severity":"info","filePath":"homeassistant/components/assist_pipeline/pipeline.py","lineNumber":815,"sourceCode":"            ) from src_error\n\n        _LOGGER.debug(\"wake-word-detection result %s\", result)\n\n        if result is None:\n            wake_word_output: dict[str, Any] = {}\n        else:\n            # Avoid duplicate detections by checking cooldown\n            last_wake_up = self.hass.data[DATA_LAST_WAKE_UP].get(\n                result.wake_word_phrase\n            )\n            if last_wake_up is not None:\n                sec_since_last_wake_up = time.monotonic() - last_wake_up\n                if sec_since_last_wake_up < WAKE_WORD_COOLDOWN:\n                    _LOGGER.debug(\n                        \"Duplicate wake word detection occurred for %s\",\n                        result.wake_word_phrase,\n                    )\n                    raise DuplicateWakeUpDetectedError(result.wake_word_phrase)\n\n            # Record last wake up time to block duplicate detections\n            self.hass.data[DATA_LAST_WAKE_UP][result.wake_word_phrase] = (\n                time.monotonic()\n            )\n\n            if result.queued_audio:\n                # Add audio that was pending at detection.\n                #\n                # Because detection occurs *after* the wake word was actually\n                # spoken, we need to make sure pending audio is forwarded to\n                # speech-to-text so the user does not have to pause before\n                # speaking the voice command.\n                audio_chunks_for_stt.extend(\n                    EnhancedAudioChunk(\n                        audio=chunk_ts[0],\n                        timestamp_ms=chunk_ts[1],\n                        speech_probability=None,","sourceCodeStart":797,"sourceCodeEnd":833,"githubUrl":"https://github.com/home-assistant/core/blob/58a3fdb3ea0538617f0a07efcfba6294de64fd59/homeassistant/components/assist_pipeline/pipeline.py#L797-L833","documentation":"DuplicateWakeUpDetectedError raised inside PipelineRun.wake_word_detection when the same wake word phrase is detected again within WAKE_WORD_COOLDOWN seconds of the last detection (tracked per-phrase in hass.data[DATA_LAST_WAKE_UP] using time.monotonic). It is a normal, informational control-flow signal that suppresses echo/double-trigger, not a fault.","triggerScenarios":"The detector fires twice for one utterance (echoing mic, sensitive model threshold), or the user says the wake word again within the cooldown window; the phrase's last wake-up timestamp is newer than WAKE_WORD_COOLDOWN, so the run aborts before starting STT.","commonSituations":"Speaker playing TTS that contains the wake phrase re-triggering detection; loud environments causing repeated detections; aggressive sensitivity settings on the wake word model.","solutions":["Treat it as expected: catch DuplicateWakeUpDetectedError and simply drop the run (the standard pipeline already does this).","Lower mic gain or wake word sensitivity if false double-detections are frequent.","Keep the wake word out of TTS responses/media to avoid self-triggering.","Do not shorten the cooldown below your TTS tail length if you customize it."],"exampleFix":"# before\nresult = await run.wake_word_detection(stream, chunks)  # may raise unhandled\n# after\nfrom homeassistant.components.assist_pipeline.pipeline import DuplicateWakeUpDetectedError\ntry:\n    result = await run.wake_word_detection(stream, chunks)\nexcept DuplicateWakeUpDetectedError:\n    return  # ignore echo within cooldown","handlingStrategy":"fallback","validationCode":"import time\n\nlast = hass.data[DATA_LAST_WAKE_UP].get(phrase)\nif last is not None and (time.monotonic() - last) < WAKE_WORD_COOLDOWN:\n    return  # skip run, duplicate within cooldown","typeGuard":null,"tryCatchPattern":"Catch DuplicateWakeUpDetectedError explicitly (before generic WakeWordDetectionError handlers) and abort the run quietly - it is informational, not a failure.","preventionTips":["Tune mic gain / detection sensitivity to reduce echo double-triggers.","Avoid speaking the wake phrase in TTS announcements.","Respect the built-in cooldown window rather than retrying immediately."],"tags":["home-assistant","assist-pipeline","wake-word","deduplication","voice"],"backgroundTag":null,"analyzedSha":"58a3fdb3ea0538617f0a07efcfba6294de64fd59","analyzedAt":"2026-08-14T20:54:38.818Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}