{"record":{"id":"f8063a8bdb2d2284","repo":"home-assistant/core","slug":"wake-word-timeout","errorCode":"wake-word-timeout","errorMessage":"Wake word was not detected","messagePattern":"Wake word was not detected","errorType":"exception","errorClass":"WakeWordTimeoutError","httpStatus":null,"severity":"warning","filePath":"homeassistant/components/assist_pipeline/pipeline.py","lineNumber":881,"sourceCode":"        detection. Times out if VAD detects enough silence.\n        \"\"\"\n        async for chunk in audio_stream:\n            if self.abort_wake_word_detection:\n                raise WakeWordDetectionAborted\n\n            self._capture_chunk(chunk.audio)\n            yield chunk.audio, chunk.timestamp_ms\n\n            # Wake-word-detection occurs *after* the wake word was actually\n            # spoken. Keeping audio right before detection allows the voice\n            # command to be spoken immediately after the wake word.\n            if stt_audio_buffer is not None:\n                stt_audio_buffer.append(chunk)\n\n            if wake_word_vad is not None:\n                chunk_seconds = (len(chunk.audio) // sample_width) / sample_rate\n                if not wake_word_vad.process(chunk_seconds, chunk.speech_probability):\n                    raise WakeWordTimeoutError(\n                        code=\"wake-word-timeout\", message=\"Wake word was not detected\"\n                    )\n\n    async def prepare_speech_to_text(self, metadata: stt.SpeechMetadata) -> None:\n        \"\"\"Prepare speech-to-text.\"\"\"\n        # pipeline.stt_engine can't be None or this function is not called\n        stt_provider = stt.async_get_speech_to_text_engine(\n            self.hass,\n            self.pipeline.stt_engine,  # type: ignore[arg-type]\n        )\n\n        if stt_provider is None:\n            engine = self.pipeline.stt_engine\n            raise SpeechToTextError(\n                code=\"stt-provider-missing\",\n                message=f\"No speech-to-text provider for: {engine}\",\n            )\n","sourceCodeStart":863,"sourceCodeEnd":899,"githubUrl":"https://github.com/home-assistant/core/blob/58a3fdb3ea0538617f0a07efcfba6294de64fd59/homeassistant/components/assist_pipeline/pipeline.py#L863-L899","documentation":"WakeWordTimeoutError (code wake-word-timeout) is raised during the WAKE_WORD stage when the voice-activity detector used alongside wake word detection (wake_word_vad) decides the incoming audio is not speech. The VAD runs on every chunk's speech_probability; if process() returns False the pipeline concludes nobody spoke a wake word and aborts the run. This is the expected 'nobody said anything' outcome of a voice pipeline run, not an internal fault.","triggerScenarios":"Calling async_process_wake_word_audio (or PipelineRun starting at PipelineStage.WAKE_WORD) with an audio stream whose chunks have a speech_probability below the VAD threshold, i.e. silence or background noise instead of a spoken wake word.","commonSituations":"Microphone muted or far from the speaker, satellite device picking up only ambient noise, wrong audio format/rate fed to the pipeline so the VAD misreads it, or a timer-driven run that starts recording before the user speaks.","solutions":["Speak the configured wake word directly at the microphone and re-run the pipeline.","Verify the audio reaching the pipeline matches the advertised stt_metadata/wake-word format (16 kHz, 16-bit, mono, AAC/PCM as configured).","If the environment is noisy or detection is too strict, tune or replace the VAD/wake-word engine (e.g. openWakeWord via Wyoming) or adjust its sensitivity settings.","Treat the error as expected idle behavior: listen for PipelineEventType.WAKE_WORD_TIMEOUT in the pipeline events instead of logging it as a failure."],"exampleFix":"# before\nawait pipeline_job.run()  # raises WakeWordTimeoutError on silence\n\n# after\nfrom homeassistant.components.assist_pipeline.error import WakeWordTimeoutError\ntry:\n    await pipeline_job.run()\nexcept WakeWordTimeoutError:\n    _LOGGER.debug(\"No wake word detected; run ended normally\")","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"from homeassistant.components.assist_pipeline.error import WakeWordTimeoutError\ntry:\n    await pipeline_job.run()\nexcept WakeWordTimeoutError:\n    pass  # expected when nobody speaks; not a failure","preventionTips":["Treat wake-word timeouts as normal idle events via the PipelineEventType event stream instead of exceptions.","Ensure the audio format matches the wake-word engine's expectations so the VAD gets valid speech probabilities.","Position microphones away from constant background noise."],"tags":["voice","wake-word","vad","assist-pipeline"],"backgroundTag":null,"analyzedSha":"58a3fdb3ea0538617f0a07efcfba6294de64fd59","analyzedAt":"2026-08-14T20:54:38.818Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}