Slimme luidsprekers zoals Google Home en Amazon Alexa sturen alles wat je tegen hen zegt het internet op. Met een Raspberry Pi en Snips bouw je zelf je eigen slimme luidspreker die je privacy respecteert.

Koen Vervloesem

Snips (https://snips.ai) is een platform voor een opensource gedecentraliseerde stemassistent die 'private by design' is  en dat je op een computer zoals een Raspberry Pi 3 draait. De software is grotendeels opensource (https://github.com/snipsco), en het Franse bedrijf dat de stemassistent ontwikkelt, is van plan om de volledige broncode te publiceren. De bedoeling van het project is om een gebruikservaring zoals die van Amazon Echo of Google Assistant te bieden: je spreekt gewoon in natuurlijke taal met je stemassistent. Het grote verschil is dat bij Snips alle benodigde algoritmes om je spraak te herkennen op het apparaat draaien, terwijl de andere stemassistenten je spraak naar centrale servers sturen voor analyse. Snips klopt zich daarom op de borst dat het private by design is. In de Denkwerk van dit nummer van PC-Active lees je wat meer over hoe Snips dit realiseert.

Momenteel spreekt Snips Engels, Frans, Duits en Japans. Binnenkort komen Chinees, Spaans, Arabisch, Russisch, Italiaans, Koreaans, Portugees en Turks eraan, en ook Nederlands staat op de planning. Wil je eerder al een Nederlandstalige Snips, dan kun je overigens ondersteuning via Google Cloud Speech-to-Text (https://cloud.google.com/speech-to-text) toevoegen, maar dan is je privacy natuurlijk niet meer gegarandeerd...

makers kit disassembled white bg croppedDe Snips Maker Kit bevat alles om je eigen slimme luidspreker te maken

Benodigdheden
Snips ondersteunt diverse computerbordjes, maar de best ondersteunde is de Raspberry Pi 3, die ook in de Snips Maker Kit (https://makers.snips.ai/kit) zit. Voor een optimale werking gebruiken we dezelfde hardware als in de Snips Maker Kit: naast de Raspberry Pi 3 ook een ReSpeaker 2-Mics Pi HAT (met twee microfoons en een aansluiting voor een luidspreker) en een luidspreker met jst-stekker. Een micro-sd-kaartje van 4 GB volstaat. Verzeker je er wel van dat de voedingsadapter 5,1 V 2,5 A levert, zoals dat bij de officiële voedingsadapter van de Raspberry Pi Foundation het geval is. Als de Pi te weinig voeding krijgt, draait de processor op een lagere kloksnelheid en volstaan de prestaties mogelijk niet voor Snips.

Daarna dien je Raspbian Stretch Lite (www.raspberrypi.org/downloads/raspbian) te downloaden. De image installeer je dan met Etcher (https://etcher.io) op het micro-sd-kaartje. Steek daarna het micro-sd-kaartje in je Pi, plaats de ReSpeaker 2-Mics Pi HAT op de gpio-header van de Pi en sluit de luidspreker met de jst-stekker aan op de HAT. Als je via ethernet werkt, kun je eenvoudigweg de netwerkkabel aansluiten en de Pi nu opstarten.

Gebruik je wifi, steek dan het micro-sd-kaartje weer in je computer en creëer een bestand wpa_supplicant.conf in het volume met de naam boot. Plaats daarin de volgende code:

country=NL
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="SSID"
    psk="WACHTWOORD"
}

Vul hierin het ssid en het wachtwoord van je wifi-netwerk in en verander (indien nodig) de landcode. Sla het bestand op en maak dan een nieuw bestand in het bootvolume aan, deze keer met de naam ssh. Laat dit bestand leeg. Ontkoppel het bootvolume, steek de micro-sd-kaart nu in je Pi en start hem op.

snips sam init

Sam (Snips Assistant Manager) is een grote hulp bij de installatie en configuratie van Snips

Snips installeren
Je Pi is nu opgestart in Raspbian. Log in via PutTTY (https://bit.ly/2qxAaYw) met als gebruikersnaam pi en wachtwoord raspberry. Het ip-adres van je Pi vind je in de dhcp-leases van je router. Verander daarna het wachtwoord met de opdracht passwd.

We installeren als eerste Node.js. Omdat de versie in de officiële repository van Raspbian te oud is, voegen we een andere repository toe, die versie 10.x bevat:

curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -

Daarna installeren we Node.js:

sudo apt install nodejs

Installeer daarna Sam, de Snips Assistant Manager:

sudo npm install -g snips-sam

Sam kun je ook gebruiken om Snips op andere computers in te stellen, maar wij draaien zowel Sam als Snips op dezelfde Pi. We verbinden Sam daarom eerst met de Pi zelf:

sam connect localhost

Vul je gebruikersnaam (pi) en wachtwoord (dat je eerder zelf hebt veranderd) in en vraag daarna de status op:

sam status

Als alles goed is, krijg je nu te zien dat je Pi "Raspbian GNU/Linux 9 (stretch)" draait en dat het Snips-platform niet is geïnstalleerd. Dat doen we nu met:

sam init

De installatie kan overigens even duren. Als die is voltooid, zie je met sam statusinformatie over allerlei services, waarvan de meeste overigens nog niet draaien.

snips setup audio

Sam helpt je om de audio voor je Snips-installatie te configureren

Audio configureren

Dan moeten we nu de audio configureren. Het ReSpeaker-uitbreidingsbordje heeft nog een driver nodig. Gelukkig kan Sam daar ook mee overweg:

sam setup audio

De eerste vraag die Sam stelt is of je de Snips Maker Kit hebt. Omdat die ook de ReSpeaker 2-Mics Pi HAT bevat, kunnen we hier met Y bevestigend op antwoorden, waarna Sam de benodigde drivers installeert, de juiste configuratie instelt (ook dit kan even duren) en de Pi reboot. Als je een andere configuratie hebt, druk je op N en vraagt Sam je om de juiste luidspreker en microfoon te kiezen.

Als je de ReSpeaker 2-Mics Pi HAT gebruikt, dien je na de reboot opnieuw sam setup audio uit te voeren. Kies deze keer N op de vraag of je de Snips Maker Kit hebt. Stel daarna de ReSpeaker als in- en uitgang voor de audio in.

Test nu of je luidspreker werkt:

sam test speaker

Als je iets hoort, druk dan op enter en test de microfoon:

sam test microphone

Spreek iets in en druk op enter. Als je je opname opnieuw hoort, is je audio correct geconfigureerd.

Als het niet werkt, kijk dan met alsamixer of het volume niet te laag staat. Kom je er nog niet uit, bekijk dan de uitgebreide installatie-instructies (https://bit.ly/2CWIOr3) van Snips.


Demo
Wat we nu hebben geïnstalleerd, is het Snips-platform, maar nog geen slimme assistent. We moeten dus een assistent installeren die van het platform gebruikmaakt. Gelukkig heeft Snips een demo-assistent gemaakt waarmee je eenvoudig het platform kunt evalueren. Installeer deze met de volgende opdracht:

sam install demo

Dit is een eenvoudige demo die vragen naar het weer herkent en die herhaalt. Zeg "Hey Snips", wacht op het herkenningstoontje, en stel dan een vraag, zoals "What's the weather in Paris?". Als alles goed is, antwoordt Snips nu "You asked for the weather in Paris". Je kunt overigens intussen met de opdracht sam watch zien wat Snips op de achtergrond doet en welke vraag hij herkent.

Als je niet graag het herkenningstoontje telkens hoort, dan schakel je dat overigens eenvoudig uit:

sam sound-feedback off

Bekijk nu met sam status nog eens de status. Je ziet nu als geïnstalleerde assistent "SnipsDemoWeatherAssistant", taal Engels en hotword "hey_snips".

snips sam watch

Met de opdracht sam watch krijg je te zien wat Snips in je spraak herkent

Anatomie van een assistent
Nu je met de demo-assistant hebt geverifieerd dat Snips werkt, kun je je eigen assistent maken. Inderdaad, elke Snips-installatie is maatwerk, in tegenstelling tot slimme assistenten zoals Google Assistant en Amazon Alexa. Dat betekent trouwens ook dat de mogelijkheden van je Snips-installatie beperkter zijn: Snips kan alleen overweg met wat je er zelf inbouwt. Alleen op die manier is het mogelijk om Snips volledig lokaal op je Raspberry Pi te laten draaien, zonder al je spraakopdrachten naar de cloud te sturen.

Maar voordat we beginnen met onze eigen assistent te maken, loont het de moeite om even stil te staan bij hoe Snips in elkaar zit. Daarvoor moeten we enkele begrippen kennen. Snips draait een assistent, dat is het geheel van code die je stemopdrachten herkent en ook tegen jou spreekt. Een assistent bestaat uit één of meer apps. Een app is gemaakt om in één specifieke situatie de bedoeling (intent) van de gebruiker te herkennen en op basis daarvan het juiste gedrag (action) te activeren. Apps zijn bijvoorbeeld Smart Lights, Wikipedia, Weather, Music, ...

snips app store

In de Snips App Store vind je allerlei apps voor je stemassistent

In de Snips App Store (https://console.snips.ai/store) vind je allerlei apps die door de makers van Snips of door anderen zijn gepubliceerd. Loop er eens doorheen om te kijken wat de mogelijkheden zijn. Let wel: veel apps hebben geen acties. Die moet je dan zelf definiëren, bijvoorbeeld om een app aan je domoticasysteem te koppelen. Standaard is Only show apps with actions aangevinkt op het moment dat je een assistent gaat aanmaken.

Maak je eigen assistent
Je eigen Snips-assistent maak je aan op de Snips Console (https://console.snips.ai). Maak er een account aan. Daarna krijg je de vraag om een nieuwe assistent te maken. Je kunt dat ook later doen, door op het tabblad My Assistants op Create a New Assistant te klikken. Geef je assistent een naam en kies een taal. Klik daarna op Create en dan op Add Some Apps.

We beginnen met alleen apps toe te voegen die al acties hebben, zodat we minder configuratiewerk hebben en al snel een werkende assistent in huis hebben. Je kunt zoveel apps toevoegen als je wilt. Blader eens door de lijst en kijk eens welke je handig vindt. Klik op een app om meer informatie te zien over de ondersteunde intents, het aantal installaties en de beoordelingen. Klik op Add App om de app aan je assistent toe te voegen. Zo heeft Snips een app om je Philips Hue-verlichting aan te sturen en er zijn apps voor Wikipedia, voor Spotify, Twitter enzovoort. Klik onderaan rechts op het knopje om je geselecteerde apps toe te voegen. Daarna wordt de spraakherkenning getraind op je apps. Je kunt ook nog het wake word veranderen, dat standaard 'Hey Snips' is.

Klik je daarna onderaan rechts op Deploy Assistant, dan krijg je de code te zien die je in PuTTY moet intypen om de assistent op je Pi te installeren. Of klik op het icoontje rechts naast de code om ze naar het klembord te kopiëren, zodat je ze eenvoudig in PuTTY plakt. Overigens moet je eerst met sam login Sam toegang geven tot je Snips Console. Daarna kun je ook altijd met sam install assistant je assistent installeren. Als je meerdere assistenten in je Snips Console hebt, krijg je de vraag welke je wilt installeren. Daarna traint Sam je assistent lokaal op je eigen Pi en installeert het de apps. Sommige apps vragen nu om informatie in te voeren, zoals een Spotify API-sleutel of een locatie.

Misschien krijg je een foutmelding tijdens de installatie van een van de apps, want ze worden niet allemaal even goed onderhouden. Verwijder die dan in de Snips Console en installeer je assistent opnieuw. Als de installatie is voltooid, controleer je met sam status of alle Snips-diensten draaien. Daarna kun je je assistent stemopdrachten geven die door de apps worden herkend en met sam watch bekijk je hoe Snips je spraak herkent.

snips console assistant 3

In Snips Console maak je je eigen stemassistent aan

Pas apps aan
Waarschijnlijk doen de bestaande apps niet helemaal wat je wilt. Klik dan in Snips Console op een app in je assistent en dan op Edit App. Bevestig met Fork dat je de app wilt aanpassen. Daarna kun je de intents en de actions aanpassen.

In het tabblad Intents kun je bij elke intent trainingsvoorbeelden plaatsen die Snips moet herkennen. Je kunt ook slots toevoegen bij een intent. Een slot is iets zoals een variabele in een programmeertaal. In je trainingsvoorbeelden duid je dan ook aan welke woorden die slots vullen.

In het tabblad Actions kun je bij elke intent een bijbehorende actie plaatsen. Dat kunnen code snippets zijn (Python-code die je in de Snips Console invoert), code die je van een project op GitHub haalt of koppelingen met het domoticasysteem Home Assistant (www.home-assistant.io).

snips intent 1

Elke intent (hier searchWeatherForecastTemperature van de app Weather)
heeft trainingsvoorbeelden en optioneel slots.

Integreer in je domoticasysteem
Zelfs de vele apps zonder acties kun je eenvoudig in je domoticasysteem integreren. Voor elke intent die Snips herkent in je spraak, vuurt de ingebouwde mqtt-broker van Snips immers een boodschap af. Als je je domoticasysteem naar die mqtt-broker laat luisteren, kun je het op die herkende intents laten reageren. We tonen je hoe je Home Assistant laat reageren op een uitspraak "Good morning", die de app good_night/good_morning omzet in een intent GoodMorningAndGoodNight.

In configuration.yaml van Home Assistant voeg je de volgende regels toe:

mqtt:
  broker: IP
  port: 1883
snips:
intent_script:
  GoodMorningAndGoodNight:
    action:
      - service: script.opstaan
  NightTime:
    action:
      - service: script.slapen

Hier zie je dat we instellen dat Home Assistant gebruikmaakt van de mqtt-broker van Snips (vul bij IP het ip-adres in van de Pi waarop Snips draait), dat we de component snips activeren en dat Home Assistant op de intents GoodMorningAndGoodNight en NightTime reageert door een script te activeren om op te staan respectievelijk te gaan slapen. In die scripts kun je dan bijvoorbeeld acties zetten om je rolluiken te openen respectievelijk te sluiten.

Kortom, het is iets meer werk om Snips aan de praat te krijgen dan Google Home of de Amazon Echo, maar je kunt deze assistent wel helemaal naar je hand zetten en je privacy is verzekerd. Meer informatie vind je in de Snips-documentatie (https://snips.gitbook.io/documentation).