Assist, czyli asystent głosowy wbudowany w Home Assistanta, może działać bez żadnej usługi w chmurze. Polecenie głosowe przechodzi wtedy na własnym sprzęcie przez cztery etapy: wykrycie słowa aktywacji, zamianę mowy na tekst, agenta konwersacji, który ustala, o co ci chodzi, i zamianę tekstu na mowę, żeby odpowiedzieć. Home Assistant nazywa ten łańcuch potokiem, a na każdym etapie może pracować inny silnik. Sama konfiguracja to kilka kliknięć. O powodzeniu decyduje dobór silników: jeśli na Raspberry Pi wybierzesz niewłaściwy silnik rozpoznawania mowy, na wykonanie każdego polecenia będziesz długo czekać.
Opis zakłada Home Assistant OS, w którym silniki instaluje się jako aplikacje (wcześniej nazywane dodatkami). W innych rodzajach instalacji te same silniki działają w osobnych kontenerach i łączą się przez integrację Wyoming, o czym piszę pod koniec.
Rozpoznawanie mowy: Speech-to-Phrase czy Whisper
Dokumentacja Home Assistanta podaje dwie lokalne możliwości i każda działa zupełnie inaczej.
Speech-to-Phrase nie próbuje zapisać wszystkiego, co mówisz. Rozpoznaje tylko zdania, które zna. Buduje je z szablonów zdań Assista i nazw encji, obszarów oraz pięter udostępnionych asystentowi, a do tego z własnych wyzwalaczy zdaniowych. Aplikacja sama się na nich uczy i powtarza naukę, gdy coś się zmieni. Według dokumentacji rozpoznaje mowę w mniej niż sekundę nawet na Home Assistant Green albo Raspberry Pi 4. Płaci się za to zakresem: działa tylko część poleceń Assista, a otwarte polecenia, takie jak dopisywanie produktów do listy zakupów, nazywanie minutników czy komunikaty nadawane na wszystkie urządzenia głosowe, bez dodatkowej konfiguracji nie zadziałają.
Whisper to otwarty model, który próbuje zapisać wszystko. Dokumentacja podaje, że na Raspberry Pi 4 przetworzenie polecenia trwa około 8 sekund, a na komputerze Intel NUC mniej niż sekundę. Zaleca go tylko wtedy, gdy masz w domu mocny sprzęt albo chcesz wyjść poza sterowanie domem, na przykład podłączając agenta konwersacji opartego na dużym modelu językowym.
Do zwykłego sterowania domem na Raspberry Pi albo Home Assistant Green rozsądnym wyborem jest Speech-to-Phrase. Whisper ma sens na minikomputerze albo na osobnym, mocniejszym komputerze, o czym w ostatniej części.
Przed wyborem sprawdź swój język. Aplikacja Speech-to-Phrase z oficjalnego repozytorium (w chwili pisania wersja 1.4.x) obsługuje 21 języków, w tym polski. Twórcy piszą jednak program od nowa w osobnym repozytorium, a według ich pliku README nowa wersja obsługuje na razie tylko osiem języków: kataloński, czeski, niemiecki, angielski, hiszpański, francuski, włoski i niderlandzki. Polskiego wśród nich nie ma, więc przed każdą kolejną aktualizacją aplikacji przeczytaj listę zmian.
Synteza mowy: Piper
Piper to lokalny silnik zamiany tekstu na mowę od tego samego zespołu. Nazwy głosów mają postać <język>_<REGION>-<nazwa>-<jakość>, na przykład en_US-lessac-medium, który jest domyślnym głosem aplikacji. Polskie głosy to między innymi pl_PL-gosia-medium, pl_PL-darkman-medium i pl_PL-mc_speech-medium. Jakość ma cztery poziomy: x_low i low z próbkowaniem 16 kHz oraz medium i high z próbkowaniem 22,05 kHz. Według dokumentacji aplikacji na Raspberry Pi 4 z rozsądną szybkością działają modele do poziomu medium włącznie, a strona o asystencie lokalnym podaje, że z modelami średniej jakości Raspberry Pi generuje około 1,6 sekundy mowy na sekundę. Zanim wybierzesz głos, posłuchaj próbek na stronie Pipera, bo poszczególne głosy i języki brzmią bardzo różnie.
Aplikacje Whisper, Speech-to-Phrase i Piper są dostępne tylko dla architektur amd64 i aarch64, więc na 32-bitowym systemie ARM ich nie uruchomisz.
Instalacja aplikacji i budowa potoku
- Wejdź w
Ustawienia > Aplikacje > Zainstaluj aplikacjęi zainstaluj Speech-to-Phrase albo Whisper, a potem Piper. - Uruchom obie aplikacje.
- Otwórz
Ustawienia > Urządzenia oraz usługi. Integracja Wyoming powinna pokazać obie usługi jako wykryte. Przy każdej wybierz „Dodaj”. - Wejdź w
Ustawienia > Asystenci głosowii wybierz „Dodaj asystenta”. - Nadaj mu nazwę i wybierz język. Jako agenta konwersacji („Agent konwersacji”) ustaw Home Assistant, w polu „Zamiana mowy na tekst” zainstalowany silnik, a w polu „Zamiana tekstu na mowę” Piper, po czym wybierz głos. Na każdym etapie ustaw język.
Jeśli w Ustawienia > Asystenci głosowi nie widać żadnych asystentów, konfiguracja nie wczytuje ustawień domyślnych. Dokumentacja radzi wtedy dopisać assist_pipeline: do pliku configuration.yaml.
Warto znać jeszcze dwa ustawienia opcjonalne. Pierwsze to użytkownik, w imieniu którego działa asystent (w angielskim interfejsie „Acts as user”). Urządzenie głosowe nie ma własnego użytkownika, a asystent może zrobić tylko to, na co Home Assistant pozwala wybranej osobie. Drugie przyda się, jeśli kiedyś przełączysz agenta konwersacji na duży model językowy: przy opcji „Preferuje lokalną obsługę poleceń” każde polecenie trafia najpierw do lokalnego agenta, a do wybranego agenta dopiero wtedy, gdy lokalny sobie z nim nie poradzi.
W aplikacji Whisper ustaw język (opcja language) wprost. Ustawienie auto działa, ale dokumentacja aplikacji ostrzega, że jest znacznie wolniejsze, bo model przy każdym poleceniu rozpoznaje język od nowa. Domyślne model: auto wybiera tiny-int8 na urządzeniach ARM, takich jak Raspberry Pi 4, a base-int8 na pozostałym sprzęcie. Modele nie trafiają do kopii zapasowych i po przywróceniu kopii są pobierane ponownie.
Udostępnianie urządzeń i dobre nazwy
Assist steruje tylko encjami, które mu udostępnisz. Dokumentacja tłumaczy to ochroną przed przypadkowym sterowaniem urządzeniami wrażliwymi, takimi jak zamki czy bramy garażowe. Otwórz Ustawienia > Asystenci głosowi, przejdź na kartę „Udostępnij” i udostępnij to, czym chcesz sterować głosem.
Nazwy znaczą tu więcej niż na panelu. Assist dopasowuje nazwy encji i obszarów dokładnie w takiej postaci, w jakiej są zapisane w Home Assistancie. Na stronie z rozwiązywaniem problemów jest prosty przykład: jeśli obszar nazywa się „bathroom”, polecenie z „bath” zamiast „bathroom” nie zadziała. Rozwiązaniem są aliasy. Encje, obszary i piętra mogą ich mieć kilka, a Assist traktuje wszystkie aliasy na równi.
Przy Speech-to-Phrase dobre nazwy są jeszcze ważniejsze, bo model zna tylko te, na których się uczył. Po polsku dochodzi odmiana: polskie zdania testowe w repozytorium intencji Home Assistanta używają nazw obszarów i urządzeń w takiej formie, w jakiej są zapisane („włącz światła w Salon”). Jeśli asystent nie rozpoznaje formy, której naturalnie używasz, na przykład „w salonie”, dodaj ją jako alias.
Testy bez mówienia do mikrofonu
Dwa narzędzia oszczędzą ci wiele powtarzania poleceń:
- W
Ustawienia > Narzędzia > Asystentjest analizator zdań. Pokazuje, jaką intencję uruchamia wpisane zdanie i których encji dotyczy, ale niczego nie wykonuje. - W
Ustawienia > Asystenci głosowiotwórz swojego asystenta i wybierz „Debugowanie”. Możesz tu wybrać jedno z wcześniejszych poleceń i obejrzeć każdy jego etap albo przyciskiem „Uruchom potok tekstowy” wpisać polecenie, które Home Assistant naprawdę wykona.
Jeśli wpisane polecenie działa, a wypowiedziane nie, problem leży w rozpoznawaniu mowy albo w dźwięku. Jeśli nie działa nawet tekst, najpierw popraw nazwy, aliasy albo udostępnianie.
Skąd wziąć mikrofon
Potok potrzebuje urządzenia, które słucha. Dokumentacja wymienia aplikację mobilną Home Assistant na Androida i iOS, urządzenie Home Assistant Voice Preview Edition oraz urządzenia głosowe, które budujesz sam w ESPHome.
Słowo aktywacji można wykrywać na dwa sposoby. openWakeWord działa w samym Home Assistancie: urządzenie przesyła dźwięk, a serwer sprawdza, czy padło słowo aktywacji. Według dokumentacji Raspberry Pi 4 poradzi sobie z 5 urządzeniami przesyłającymi dźwięk jednocześnie, a openWakeWord obsługuje na razie tylko angielskie słowa aktywacji. microWakeWord działa na samym urządzeniu, na sprzęcie z ESP32-S3 i na telefonach z Androidem, a strona o słowach aktywacji wymienia dla niego trzy modele: „okay nabu”, „hey jarvis” i „alexa”. W polskim domu słowo aktywacji zostaje więc angielskie, ale polecenie po nim możesz już wydać po polsku.
Asystent rozumie, ale nic nie mówi
Dźwięk odpowiedzi powstaje w Home Assistancie, a urządzenie głosowe pobiera go spod adresu, który poda mu Home Assistant. Jeśli adres jest zły, polecenie się wykona, ale odpowiedzi nie usłyszysz. Sprawdź Ustawienia > System > Sieć: w polu „Sieć lokalna” musi być adres osiągalny dla urządzenia. Dokumentacja zaleca w większości instalacji opcję „Automatycznie”. Jeśli konfigurujesz Home Assistanta w YAML bez default_config:, upewnij się też, że w konfiguracji jest media_source:.
Jeśli urządzenie głosowe na ESPHome źle słyszy albo gra za cicho, strona z rozwiązywaniem problemów pokazuje, jak nagrać to, co naprawdę dociera do Home Assistanta (debug_recording_dir w sekcji assist_pipeline:), i jak dostroić sekcję voice_assistant: w urządzeniu: noise_suppression_level do 4, auto_gain do 31 dBFS i volume_multiplier, który nie ma górnej granicy, ale przy dużych wartościach zniekształca dźwięk. Po zakończeniu usuń nagrania, bo zajmują miejsce na dysku.
Whisper na mocniejszym komputerze
Rozpoznawanie mowy nie musi działać na tym samym komputerze co Home Assistant. Integracja Wyoming potrafi połączyć się z usługą uruchomioną gdzie indziej w sieci lokalnej: dodaj ręcznie integrację Wyoming Protocol i wpisz adres oraz port. Dokumentacja podaje jako przykład Whisper, najbardziej wymagający z tych silników: może działać na komputerze stacjonarnym albo minikomputerze, a Home Assistant zostaje na Raspberry Pi. Polecenia nadal nie wychodzą poza sieć domową, a najwolniejszy etap trafia na sprzęt, który sobie z nim poradzi.