Lokalne sterowanie głosem w Home Assistant z Whisper i Piper
Część 4 z 6 serii Home Assistant bez chmury

Spis treści
Chmurowe asystenty głosowe, takie jak Amazon Alexa, Google Assistant czy Apple Siri, opierają się na zdalnych serwerach w zakresie detekcji aktywności głosowej, automatycznego rozpoznawania mowy (ASR) oraz przetwarzania języka naturalnego (NLP). Zależność ta generuje opóźnienia, powoduje wrażliwość na awarie internetu i budzi poważne wątpliwości dotyczące prywatności w związku z ciągłym nasłuchem otoczenia. Wdrożenie w pełni lokalnej architektury sterowania głosem w systemie Home Assistant przy użyciu protokołu Wyoming – łączącej mechanizm OpenAI Whisper dla rozpoznawania mowy (STT) oraz Piper dla syntezy mowy (TTS) – umożliwia wykonywanie komend głosowych w czasie poniżej sekundy, całkowicie w obrębie sieci lokalnej.
1. Architektura rozwiązania: Potok głosowy Wyoming
Lokalne przetwarzanie głosu w Home Assistant funkcjonuje jako modułowy, odseparowany potok, w którym strumienie audio są przetwarzane sekwencyjnie bez zapytań do zewnętrznych API:
- Wykrywanie słowa wybudzającego (openWakeWord / microWakeWord): Lekkie modele nieustannie analizują sygnał z mikrofonu – openWakeWord na serwerze Home Assistant, do którego satelita stale strumieniuje dźwięk, a microWakeWord bezpośrednio na lokalnych satelitach sprzętowych (np. układach ESP32-S3) – aby aktywować potok po wykryciu słowa kluczowego.
- Rozpoznawanie mowy (Whisper): Pakiety audio są przesyłane strumieniowo przez protokół Wyoming do lokalnego kontenera Whisper, który transkrybuje mowę na ustrukturyzowany tekst.
- Rozpoznawanie intencji (Home Assistant Assist): Silniki przetwarzania języka naturalnego dopasowują transkrybowany tekst do zdefiniowanych encji, stref i aliasów automatyzacji.
- Synteza mowy (Piper): Ciąg odpowiedzi jest zamieniany na naturalnie brzmiący sygnał audio przez silnik Piper i strumieniowany z powrotem do głośnika satelity.
2. Instalacja dodatków Whisper i Piper krok po kroku
Wdrożenie lokalnych usług głosowych wymaga zainstalowania dedykowanych dodatków kontenerowych w środowisku Home Assistant OS lub nadzorowanym Dockerze:
- Instalacja dodatku Whisper: W sekcji Ustawienia > Dodatki > Sklep z dodatkami należy wyszukać i zainstalować dodatek Whisper. W konfiguracji trzeba wybrać odpowiedni rozmiar modelu:
tiny-int8lubbasedla serwerów opartych wyłącznie na CPU (Raspberry Pi 4/5) bądźmediumdla systemów z akceleracją GPU lub modułami Google Coral TPU. - Instalacja dodatku Piper: Po wyszukaniu i zainstalowaniu dodatku Piper, w zakładce konfiguracji należy wybrać preferowany neuronowy model głosu (np.
pl_PL-darkman-mediumdla języka polskiego) i uruchomić usługę. - Konfiguracja integracji Wyoming: W sekcji Ustawienia > Urządzenia i usługi > Dodaj integrację należy wyszukać Wyoming Protocol i dodać zarówno usługę Whisper (domyślny port
10300), jak i Piper (domyślny port10200).
3. Konfiguracja potoku Assist krok po kroku
Po zintegrowaniu silników przetwarzania należy skonfigurować spójny potok asystenta głosowego:
- Utworzenie potoku głosowego: W sekcji Ustawienia > Asystenci głosowi > Dodaj potok należy nadać precyzyjną nazwę, np.
Lokalny Assist - Polski. - Przypisanie lokalnych silników: Jako silnik mowy na tekst (STT) należy wybrać Whisper, jako agenta konwersacyjnego Home Assistant, a jako silnik tekstu na mowę (TTS) Piper.
- Aktywacja lokalnego słowa wybudzającego: W przypadku detekcji słowa kluczowego na serwerze Home Assistant należy wybrać openWakeWord jako silnik wybudzania i wskazać słowo aktywujące (np.
Okay NabulubHey Jarvis).
Produkcyjny kod YAML dla satelity ESPHome
W celu zbierania dźwięku i strumieniowania odpowiedzi bez użycia sprzętu chmurowego, satelita głosowy ESP32-S3 (np. ESP32-S3-BOX-3) może zostać skonfigurowany przy użyciu poniższego kodu ESPHome:
esphome:
name: "voice-satellite-livingroom"
friendly_name: "Living Room Voice Satellite"
esp32:
board: esp32-s3-devkitc-1
framework:
type: esp-idf
api:
encryption:
key: "GENERATE_YOUR_KEY_HERE"
i2s_audio:
- id: i2s_in
i2s_lrclk_pin: GPIO4
i2s_bclk_pin: GPIO5
- id: i2s_out
i2s_lrclk_pin: GPIO15
i2s_bclk_pin: GPIO16
microphone:
- platform: i2s_audio
id: sat_mic
i2s_audio_id: i2s_in
i2s_din_pin: GPIO6
adc_type: external
pdm: false
speaker:
- platform: i2s_audio
id: sat_speaker
i2s_audio_id: i2s_out
i2s_dout_pin: GPIO17
voice_assistant:
id: va_pipeline
microphone: sat_mic
speaker: sat_speaker
use_wake_word: true
noise_suppression_level: 2
auto_gain: 31dBFS
volume_multiplier: 2.0
4. Podsumowanie i wartość architektoniczna
Co da się osiągnąć dzięki temu poradnikowi: Wdrożenie w pełni autonomicznej, lokalnej architektury sterowania głosem w systemie Home Assistant z wykorzystaniem protokołu Wyoming, silnika STT Whisper, silnika TTS Piper oraz satelitów sprzętowych opartych na ESPHome.
Wynikająca z tego wartość: Interakcja głosowa w inteligentnym domu staje się całkowicie niezależna od zewnętrznych serwerów chmurowych. Prywatne rozmowy oraz telemetria akustyczna pozostają ściśle odizolowane w sieci lokalnej, co eliminuje ryzyko profilowania i pozyskiwania danych. Ponadto rezygnacja z zewnętrznego routingu obniża opóźnienia wykonania komend do poziomu poniżej sekundy i gwarantuje 100-procentową dostępność sterowania głosem podczas awarii połączenia z internetem.
Pytania i odpowiedzi
Czy sterowanie głosem działa w pełni podczas awarii internetu?
Sam potok – od słowa wybudzającego przez Whisper i Assist po Piper – działa, bo żaden jego etap nie opuszcza sieci lokalnej. Wykonać polecenie da się jednak tylko na urządzeniach, którymi Home Assistant steruje sam, lokalnie; integracja przełączająca urządzenie przez chmurę producenta przestaje działać razem z internetem, niezależnie od tego, jak dobrze rozpoznano zdanie. Również zmiana modelu Whisper albo głosu Piper wymaga połączenia, bo dodatki pobierają modele i głosy przy pierwszym użyciu.
Dlaczego Assist nie wykonuje zdania, które Whisper rozpoznał poprawnie?
Dlatego, że wbudowany agent konwersacyjny Home Assistant nie interpretuje dowolnego tekstu. Porównuje rozpoznane zdanie ze stałymi wzorcami zdań oraz z nazwami encji, stref i aliasów. Zdanie, które wymienia lampę z nazwy i ma spowodować jej włączenie, pasuje do wzorca; uwaga w rodzaju „Tu jest za ciemno” nie pasuje do żadnego, nawet jeśli Whisper poprawnie zapisał każde słowo.
Pomagają trzy kroki, w tej kolejności:
- Przejrzenie przebiegu. W ustawieniach asystentów głosowych da się prześledzić każdy przebieg potoku, łącznie z tekstem dostarczonym przez Whisper i z tym, co zrobił z niego Assist. Od razu widać wtedy, czy błąd leży w rozpoznawaniu, czy w dopasowaniu.
- Nadanie aliasów. Encja może nosić kilka nazw, a słowa, które naprawdę padają na co dzień („lampa sufitowa”, „duże światło”), należą właśnie tam.
- Zdefiniowanie własnych zdań. Automatyzacja z wyzwalaczem w postaci zdania reaguje na swobodnie dobrane sformułowania i może potem wykonać dowolne akcje, w razie potrzeby kilka naraz.
Źródła
Home Assistant bez chmury
- Zigbee2MQTT vs. ZHA: Budowa bezawaryjnej sieci Mesh w Home Assistant
- ESPHome i ESP32 w praktyce: Własne czujniki środowiskowe bez chmury
- Wykrywanie obecności 2.0: radary mmWave (LD2410/LD2450) w automatyzacji oświetlenia
- Lokalne sterowanie głosem w Home Assistant z Whisper i Piper
- WireGuard i Tailscale DMZ: Bezpieczny dostęp z zewnątrz do Home Assistant i własnych serwerów
- Lokalny system zarządzania energią: Integracja falowników PV i magazynów energii przez Modbus TCP