Door Olaf Weijers

Redacteur

Spraakassistentie zonder cloud

Bescherm je privacy met zelfbouw

16-10-2023 • 06:00

79

Singlepage-opmaak

Software: spraakassistentie van Home Assistant

Home Assistant heeft 2023 uitgeroepen tot ‘the year of the voice’. In januari werd de intentie uitgesproken om Home Assistant dit jaar geschikt te maken voor spraakassistentie. De community heeft samen met de ontwikkelaars de schouders eronder gezet en dat heeft het platform inmiddels aardig wat extra functionaliteit opgeleverd. Zo kun je, weliswaar nog wat beperkt, stappen zetten om zelf een spraakassistent te bouwen en deze aan het platform te koppelen. Een opmerkelijk feitje is daarbij dat de ontwikkeling van de spraakassistent wordt geleid door Michael Hansen, de oorspronkelijke ontwikkelaar

Home Assistant logo (nieuw 2023)

van Rhasspy. Voorheen heeft Hansen gewerkt aan MyCroft.ai. Een privacyvriendelijke spraakassistent die net buiten het bereik van dit artikel is gevallen, omdat de tekst-naar-spraakfunctionaliteit gebruikmaakt van cloudservices en het pakket daarmee niet compleet lokaal te gebruiken is.

Het afgelopen jaar zijn intentieherkenning, spraak-naar-tekstherkenning, een tekst-naar-spraakmodule en ondersteuning voor wakewords toegevoegd. Het pakket ondersteunt inmiddels zo'n vijftig talen. Nabu Casa gaat daarvoor best ver. Zo is voor de ondersteuning van het Hongaars een studio gehuurd met een Hongaarse spreker om de juiste spraakdata te verkrijgen voor de training van het model.

De componenten die het platform nodig heeft voor spraakherkenningsondersteuning, installeer je als add-ons. De lokale spraak-naar-tekstmodule is gebaseerd op Whisper van OpenAI. Van deze module gebruikt Home Assistant een variant, faster-whisper, die geschikt is voor minder krachtige hardware. Op een Raspberry Pi 4 heeft het platform over het algemeen enkele seconden nodig om de aangeboden spraak te herkennen. Met een krachtigere processor, zoals een i5, kunnen prompts vaak binnen een seconde afgehandeld worden. Als je hardware voldoende krachtig is, kan faster-whisper uitgebreidere stemmodellen gebruiken en daarmee nauwkeuriger werken.

Piper en Whisper add-onsPiper en Whisper add-onsPiper en Whisper add-onsPiper en Whisper add-ons

De add-on Piper is een lokale tekst-naar-spraakmodule, waarmee het platform een stem heeft gekregen en daarmee mededelingen en informatie kan communiceren. De stemmen die Piper levert zijn, afhankelijk van de taal, uitgevoerd in diverse varianten. Afhankelijk van je hardware kun je een low of high variant gebruiken. Hoe uitgebreider het model dat je kiest, hoe beter de stem klinkt; de low varianten hebben een lage resolutie en daarmee een telefoonachtige klank. Op het moment van schrijven van dit artikel zijn voor de Nederlandse taal enkel stemvarianten met die lage bitrate beschikbaar, wat wellicht in de loop der tijd verandert.

Beide add-ons zijn dusdanig ‘slank’ te configureren dat je in principe met een Raspberry Pi (4+) al over genoeg kracht beschikt om de spraakassistent te laten functioneren, hoewel je bij langere prompts even geduld moet hebben voordat de spraak is verwerkt. De assistent op krachtigere hardware draaien levert opmerkelijk veel winst op in de verwerkingssnelheid. Het platform reageert dan merkbaar rapper op je commando's dan de commerciële, cloudgekoppelde varianten.

Wakewords

Een van de laatste toevoegingen aan het platform is de ondersteuning voor wakewords. Je kunt kiezen uit twee add-ons: openWakeWord en porcupine1. Porcupine kwam eerder al langs als onderdeel van Rhasspy en levert aan Home Assistant dezelfde functionaliteit: een uitgebreide verzameling wakewords die zo getraind zijn dat ze met veel verschillende stemmen werken. Ook openWakeWord levert een paar vooraf getrainde wakewords, maar geeft je ook de optie zelf een korte zin of woord in te stellen. Dit doe je niet door een aantal spraakopnames aan te bieden, maar je zult zelf een model moeten trainen. Dat kun je op je eigen hardware uitvoeren, maar daarvoor moet je een omgeving opzetten.

Porcupine1 en openWakeWordPorcupine1 en openWakeWordPorcupine1 en openWakeWordPorcupine1 en openWakeWord

Het kan eenvoudiger door gebruik te maken van Googles Colab. In Colab laad je het openWakeWord-trainingsprogramma. Hier geef je je wakeword in een tekstveld in en zet je het model aan de slag. De basis van de training bestaat uit een spraakmodel van Google dat een enorme variatie aan stemmen en klanken bevat. Op basis van dit model wordt Whisper ingezet, de tekst-naar-spraakengine. Whisper genereert tienduizenden verschillende varianten van je wakeword die verschillen in tempo en toonhoogte. De volgende stap is om ruis en storing toe te voegen aan sommige van de varianten om het uiteindelijke spraakmodel beter bestand te maken tegen moeilijke omstandigheden. Dit resulteert uiteindelijk in meer dan 20.000 uur aan wakewords, waarmee een slank model wordt getraind. Na ongeveer een uur ontvang je het getrainde model en kun je dit toevoegen aan openWakeWord. Via Colab trainen is eenvoudig, maar niet gratis. Je ontvangt bij het eerste gebruik een starttegoed dat toereikend is voor de eerste training, voor aanvullende trainingen moet je tegoed bijstorten.

Assist pipeline

Al deze losse componenten combineer je in Home Assistant door een assist pipeline in te stellen. Die pipeline is aardig te vergelijken met de componenten die we eerder al in Rhasspy tegenkwamen. Voor elke stap die de assistent afloopt, stel je hier in welke dienst je wil gebruiken. Dit begint met de gepreksagent.

Home Assistant Assist pipeline
Home Assistant Assist pipeline

De gespreksagent staat aan het hoofd van de assistentie en behandelt de ingekomen tekst. De standaardinstelling is om dit af te laten handelen door de interne assistentiemodule van Home Assistant: het eerdergenoemde Hassil. Het is ook mogelijk om dit te vervangen door alternatieven. Zo kun je bijvoorbeeld de OpenAI conversation-integratie installeren en zo OpenAI aan het hoofd van je spraakassistentie plaatsen. Helaas biedt deze integratie (nog?) geen mogelijkheid tot apparaatbediening vanuit de OpenAI-omgeving.

De volgende stap is het selecteren van een spraak-naar-tekstmodule. Als je een abonnement op Nabu Casa hebt, kun je hier kiezen voor de cloudgebaseerde dienst die bij dit abonnement wordt meegeleverd. Wil je je data echt lokaal houden, dan is faster-whisper op dit moment de enige keuze. Bij Whisper worden verschillende spraakmodellen per taal meegeleverd. Het onderlinge verschil is de foutratio in de woordherkenning. Zo kan de spraak-naar-tekstherkenning op een acceptabele snelheid worden uitgevoerd als je minder krachtige hardware gebruikt of juist veel betere herkenning realiseren, ook bij een lagere audiokwaliteit, als de hardware wel toereikend is.

Satellieten

Met die instellingen ben je grotendeels klaar aan de softwarezijde. Als Piper en Whisper eenmaal aan een assist pipeline zijn gekoppeld, kun je met spraak je vragen stellen via je smartphoneapp of webinterface op de computer.

Atom Echo entiteitsinstellingen
Atom Echo entiteitsinstellingen

Een externe spraakassistent koppelen kan ook als deze het Wyoming-protocol ondersteunt. Op dit moment is dat ingebakken in ESPHome, waarmee je ESP32-microcontrollers makkelijk kunt programmeren om zelf hardwareoplossingen voor je smarthome te bouwen. De ATOM Echo die we in het hoofdstuk hardware hebben besproken, zou hiervoor als (slecht) voorbeeld kunnen dienen. De installatie van de software op de microcontroller is zeer eenvoudig opgezet. Het proces wordt beschreven op deze pagina en stelt niet meer voor dan de controller aan de computer verbinden, de juiste poort selecteren en na het flashen je wifigegevens invullen. De satelliet wordt direct herkend door Home Assistant en verschijnt in de integratiepagina onder de ESPHome-integratie.

Een andere optie is gebruikmaken van een singleboardcomputer zoals we in het hoofdstuk over hardware beschreven. Om een satelliet aan Home Assistant te koppelen, zijn ondersteuning voor Python en een microfoon nodig. Op het moment van schrijven is deze integratie net een dag oud en kreeg ik deze nog niet stabiel aan de gang; de installatiemethode is nog niet gestroomlijnd. Op de GitHub-pagina van het pakket vind je de instructies om Home Assistant Satellite te installeren. Op dit moment is dat nog een verzameling commando's om een virtuele Python-omgeving aan te maken waarin het pakket draait. Dit zal in de toekomst ongetwijfeld gebruiksvriendelijker worden, maar voor nu vereist het ervaring met de terminal.

Beperkingen

Aangepast commando in automatisering
Aangepast commando in automatisering

De spraakassistentie van Home Assistant is nog niet af. De commandoset die herkend wordt, is nog klein, maar je kunt er handmatig zinnen aan toevoegen. Ook de afhandeling van wakewords is op dit moment nog niet ideaal doordat er continu audio wordt verzonden van de satelliet naar de server. Deze punten zijn de volgende stappen die de ontwikkelaars willen aanpakken. Er moet ondersteuning komen voor boodschappenlijstjes, timers en weersvoorspelling. Er wordt ook opnieuw bekeken of ESPHome ondersteuning kan bieden om lokale wakeworddetectie te bieden op ESP-microcontrollers. Naast verbetering op deze punten is ondersteuning voor de Espressif ESP32 S3-Box 3 aangekondigd, die misschien de ideale middenweg is tussen een overbemeten singleboardcomputer en een onaangepaste microcontroller waar je zelf nog alles aan vast moet knopen.