From a78e3f7b0f1e1424de84c00297f4d0da7202d0a2 Mon Sep 17 00:00:00 2001 From: Michael Hansen Date: Mon, 23 Oct 2023 13:34:32 -0500 Subject: [PATCH] Delay import of webrtc to avoid blocking start up if package is missing (#102594) * Delay import of webrtc to avoid blocking start up if package is missing * Update homeassistant/components/assist_pipeline/pipeline.py Co-authored-by: Paulus Schoutsen * Update homeassistant/components/assist_pipeline/vad.py Co-authored-by: Paulus Schoutsen --------- Co-authored-by: Paulus Schoutsen --- homeassistant/components/assist_pipeline/pipeline.py | 12 ++++++++++-- homeassistant/components/assist_pipeline/vad.py | 8 ++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/assist_pipeline/pipeline.py b/homeassistant/components/assist_pipeline/pipeline.py index bb34a223af6..1e1c0b6f495 100644 --- a/homeassistant/components/assist_pipeline/pipeline.py +++ b/homeassistant/components/assist_pipeline/pipeline.py @@ -12,11 +12,13 @@ from pathlib import Path from queue import Queue from threading import Thread import time -from typing import Any, Final, cast +from typing import TYPE_CHECKING, Any, Final, cast import wave import voluptuous as vol -from webrtc_noise_gain import AudioProcessor + +if TYPE_CHECKING: + from webrtc_noise_gain import AudioProcessor from homeassistant.components import ( conversation, @@ -522,6 +524,12 @@ class PipelineRun: # Initialize with audio settings self.audio_processor_buffer = AudioBuffer(AUDIO_PROCESSOR_BYTES) if self.audio_settings.needs_processor: + # Delay import of webrtc so HA start up is not crashing + # on older architectures (armhf). + # + # pylint: disable=import-outside-toplevel + from webrtc_noise_gain import AudioProcessor + self.audio_processor = AudioProcessor( self.audio_settings.auto_gain_dbfs, self.audio_settings.noise_suppression_level, diff --git a/homeassistant/components/assist_pipeline/vad.py b/homeassistant/components/assist_pipeline/vad.py index 30fad1c80d6..9cc5fe9dfc6 100644 --- a/homeassistant/components/assist_pipeline/vad.py +++ b/homeassistant/components/assist_pipeline/vad.py @@ -7,8 +7,6 @@ from dataclasses import dataclass from enum import StrEnum from typing import Final, cast -from webrtc_noise_gain import AudioProcessor - _SAMPLE_RATE: Final = 16000 # Hz _SAMPLE_WIDTH: Final = 2 # bytes @@ -51,6 +49,12 @@ class WebRtcVad(VoiceActivityDetector): def __init__(self) -> None: """Initialize webrtcvad.""" + # Delay import of webrtc so HA start up is not crashing + # on older architectures (armhf). + # + # pylint: disable=import-outside-toplevel + from webrtc_noise_gain import AudioProcessor + # Just VAD: no noise suppression or auto gain self._audio_processor = AudioProcessor(0, 0)