Henrik Dæhli i Knowit har laget en Bysykkel-app til Google Home. 📸: Ole Petter Baugerød Stokke
Henrik Dæhli i Knowit har laget en Bysykkel-app til Google Home. 📸: Ole Petter Baugerød Stokke Vis mer

OK Google, kan jeg sykle til jobb i dag?

Slik lagde jeg min egen app til Google-assistenten.

Denne høsten ble Google-assistenten endelig lansert på norsk! Jeg var så heldig å få en invitasjon til betaprogrammet til Google-assistenten, og har hatt gleden av å kunne snakke med den på norsk siden begynnelsen av april. Jeg må si jeg har blitt imponert, både som bruker og utvikler.

Google satser tungt på kunstig intelligens, og en av hovedsatsingene er Google-assistenten. Under Google I/Os keynote tidligere i år fikk vi en forsmak på Google Duplex og hvor kraftig dette kan være.

At produkter som Google Home og Pixel-telefonene ikke har blitt lansert i Norge tidligere, har vært begrunnet med at Google-assistenten ikke har snakket norsk. Denne lanseringen endrer på dette slik at også vi får være med på denne viktige teknologiske reisen.

Forstår meg, faktisk

Google har i mange år forberedt infrastrukturen sin på å kunne identifisere språket du snakker på, tolke hva du sier og gi deg et fornuftig svar i sanntid. For at samtalekvaliteten skal oppleves naturlig bør ikke forsinkelsen være på mer enn 150–200 millisekunder én vei. Nå er ikke Google-assistenten helt der ennå, og den lille kunstpausen man må vente før man får svar gjør at man fremdeles merker at det er en maskin, og ikke et menneske man snakker med. Også tonefallet kan til tider være litt unaturlig, spesielt på den norske versjonen.

Jeg har tidligere avskrevet de taleassistentene jeg har prøvd etter kort tid fordi jeg stort sett har følt meg som han i reklamen til Rema 1000 som ikke kommer inn døra etter å ha vært hos tannlegen. Det er her Google-assistenten revolusjonerer; den har en mye høyere treffprosent på å forstå hva jeg faktisk sier. I tillegg har den fått noe som ingen andre taleassistanter jeg tidligere har prøvd, nemlig kontekst.

📸: Henrik Dæhli
📸: Henrik Dæhli Vis mer

Hjemme har jeg gått til anskaffelse av en en Google Chromecast og en Google Home Mini.

Chromecasten har jeg gitt navnet “TV” slik at jeg kan si: “Ok, Google sett TV på pause”. Når jeg er klar til å se videre kan jeg utelate “TV” fordi den husker at det TV som er pauset. Jeg kan da bare si “Ok Google, fortsett”, og filmen fortsetter der jeg slapp når popkorn er ferdig poppet, uten at jeg må finne frem verken fjernkontroll eller telefon.

Det er kanskje som smarthuskontroll at Google-assistenten har hatt sitt største bruksområde hittil. Folk styrer alt fra lys, robotstøvsugere og annet med assistenten. En fiffig funksjon ikke alle er klar over er at de fleste nyere TV-er støtter HDMC-CEC-standarden som lar deg styre TV-en via HDMI. Har du en Chromecast koblet til TV kan du f.eks. slå den på bare ved å si “Ok Google, slå på TV”, og tilsvarende for av. Om noen år har kanskje fjernkontrollen samme plassering i historiebøkene som fasttelefonen?

Åpne bysykkel-data

Jeg er en ivrig bruker av Oslo Bysykkel, og synes måten de har fornyet bysykkelordningen i Oslo har vært svært fremoverlent. En relativt bra mobilapp, og ikke minst åpne data og API-er! Dessverre sliter de med kapasiteten og det er alltid kjedelig å komme til et tomt sykkelstativ når man skal ut å sykle. For å ikke snakke om den følelsen når du har syklet til jobb, og alle bysykkelstativene i området er fulle når du kommer frem.

Jeg har til og med opplevd å stå i en slags selvorganiserende kø ved et sykkelstativ for å vente på at det kommer inn sykler på stativet.

Den åpenbare løsningen på disse kapasitetsproblemene er er selvsagt å øke kapasiteten. Nå er ikke det gjort i en fei, og det er ikke sikkert det er mulig heller med måten man har organisert byen på, der alle reiser samme vei samtidig.

De som følger Oslo Bysykkel på Facebook vet hvor mange frustrerte brukere det er der ute som ikke får brukt abonnementet sitt fordi det er tomt for sykler.

Jeg tror derfor god teknologi og gode løsninger i det minste kan fjerne noe av frustrasjonen til disse brukerne.

Før Ruter fikk sanntidsdata på bussene sine var det svært frustrerende å stå og vente på bussen. Har den akkurat gått? Hvorfor kommer den ikke til oppsatt tid? Står den fast i kø, eller kommer den ikke i det hele tatt? Spørsmålene var mange, og minuttene var lange, mens man sto der og ventet.

📸: Henrik Dæhli
📸: Henrik Dæhli Vis mer

I dag kan man se sanntidsdata på de fleste holdeplasser, og på mobiltelefonen. Selv om man venter nøyaktig like mange minutter som før oppleves ventetiden mye kortere fordi man vet.

Dette tror jeg også kan være tilfellet for Oslo Bysykkel. Hva om du kan stå opp og si, “Ok Google, god morgen”, så får du lest opp dagens nyheter, værmelding og dagens agenda fra kalenderen din før den avslutter med følgende: “Akkurat nå er det det 7 ledige sykler ved Kværnerbyen. Du bør gå hjemmefra kl 7:14 for rekke siste sykkel.”

Jeg savner også en funksjonalitet der man angir hvilket stativ man skal sykle til når man tar ut en sykkel. Da kan man faktisk stå om morgenen på Kværnerbyen og se i appen “Vi forventer sykler inn om 5 og 7 minutter.”, og ikke stå der i uvisshet om det kommer en sykkel eller ikke. I tillegg kan de som er på vei til et stativ få følgende beskjed: “Det er stor trafikk til Sukkerbiten, du bør vurdere å parkere sykkelen på Jernbanetorget som er nærmeste stativ med ledig kapasitet”.

Voice User Interface

Så hvordan kommer Google-assistenten inn i dette bildet?

Da jeg ble med i betaprogrammet til den norske Google-assistenten i april kjente jeg fort at jeg ville utvikle noe selv.

Jeg undersøkte litt hvordan man kommer i gang, og det skal sies at det er en liten bøyg for å komme i gang. Men når man først har fått på plass oversikten er det lekende lett å lage noe.

Google har tatt seg av alt det vanskelige med maskinlæring og talegjenkjenning.

Det er egentlig veldig lite som er nytt sammenlignet med å utvikle en vanlig app, bortsett fra at grensesnittet er naturlig tale eller tekst som kobles til metoder.

«Selv om det meste er likt er det likevel én stor forskjell.»

Selv om det meste er likt er det likevel én stor forskjell. De som vil merke den største endringen er interaksjonsdesigneren som må lære seg en disiplin som nok er relativt ubevandret for de fleste: Voice User Interface (VUI).

Det er her utvikling for assistenten skiller seg vesentlig fra vanlig app-utvikling, og det er her man må legge innsatsen for å lage en god app.

Google har heldigvis laget mye bra dokumentasjon!

Du bør tenke gjennom hva slags personlighet appen din skal ha. Skal den være formell, humoristisk, kort eller verbos? Skal du ha en datagenerert stemme? Dame eller herre?

Hva slags personlighet du velger avhenger mye av hva slags applikasjon du lager. Skal det være en assistent som hjelper deg å være effektiv vil du kanskje ha en formell assistent som er “to the point”. Skal du lage en underholdingsapplikasjon så er det helt andre forventninger til den du snakker med.

Selv om brukerne vet at de snakker med en maskin vil de likevel danne seg et bilde av at de snakker med en person. Det er noe man ikke gjør når man bruker en vanlig app. Det er derfor viktig at personligheten er konsistent og gjennomtenkt gjennom hele samtalen.

Dette vil vi bygge

Siden Oslo Bysykkel har et åpent API hvor man til enhver tid kan sjekke status på stativene tenkte jeg at jeg kunne lage en assistent som hjelper meg med å sjekke om jeg kan bruke bysykkel til jobb.

Selv om Oslo Bysykkel har en app til telefonen hvor man kan sjekke status på stativene i dag, synes jeg den ikke fungerer optimalt for mitt bruk. Før jeg bestemmer meg for å sykle sjekker jeg følgende:

  1. Er det nok ledige sykler på mitt nærmeste stativ til at det ikke er tomt når jeg kommer dit om ca 10 minutter.
  2. Er det nok ledige låser på et av stativene i nærheten av jobben til at jeg med høy sannsynlighet får satt fra meg sykkelen.

Nr. 2 ønsker jeg også å sjekke underveis slik at jeg kan bytte transportmiddel i nærheten av et stativ dersom situasjonen har endret seg på destinasjonen etter at jeg har startet sykkelturen.

Å få til dette med appen til Oslo Bysykkel er litt knotete fordi det innebærer en del scrolling i kartet.

Jeg ønsket derfor å lage en assistent jeg kunne spørre om følgende:

  1. “Kan jeg sykle til jobb?” og
  2. “Er det noen ledige låser ved jobben?”

I tillegg mulighet for å spørre om ledige sykler og låser på ethvert stativ.

Det er først når assistenten utfører sammensatte oppgaver i én kommando den virkelig gir effektivitet. Når jeg spør om jeg kan sykle til jobb sjekker den først om det er nok ledige sykler på stativet der jeg bor, før den sjekker den om det er nok ledige låser på stativene jeg har definert i nærheten av arbeidsplassen min. Dette kan jeg spørre om mens jeg smører matpakker til barna, og kan da ta en avgjørelse om jeg heller skal gå til bussholdeplassen.

«Jeg slipper å scrolle frem og tilbake i et kart.»

Dette løser selvsagt ikke kapasitetsproblemene til Oslo Bysykkel, men jeg slipper å scrolle frem og tilbake i et kart og trykke på hvert eneste stativ jeg vil sjekke.

Dialogflow og intents

Så hvordan lager du en Google-assistent som sjekker status på bysykkelstativene?

For å lage dialogen, det vil si selve kommandoene du skal kunne utføre, bruker man et verktøy som heter Dialogflow.

Her er det noen viktige begrep du må lære seg for å utvikle i Dialogflow:

  • Agent
  • Intent
  • Entity
  • Fullfillment

Agenten er den delen av applikasjonen din som tolker tale. Agenten kobler det brukeren sier til en intent. Intenten mapper det brukeren sier til en respons.

📸: Dialogflow
📸: Dialogflow Vis mer

Det første du bør gjøre når du skal lage en applikasjon med tale som brukergrensesnitt er å tenke gjennom hva applikasjonen skal gjøre, og finne ut hva brukerne kommer til å si. Det kan være lurt å sette opp et flytskjema som viser hvordan man tenker seg at samtalen skal foregå.

For hver kommando må du lage en intent i Dialogflow. I intenten setter man opp et sett med treningssetninger som du forventer at brukerne kommer til å si.

For intenten min som finner ut om jeg kan sykle til jobb var disse:

  • “Kan jeg sykle til jobb?”
  • “Kan jeg sykle til jobb i dag”
  • “Er det mulig å ta sykkel til jobben?
  • “Sykle til jobb?”

Disse setningene brukes i utgangspunktet som treningsdata for maskinlæringen til Dialogflow, så jo flere setninger du har jo bedre blir assistenten din til å treffe riktig intent. I mitt tilfelle har jeg så få treningssetninger at Dialogflow sannsynligvis velger å bruke regelbasert gramatikkmatching fremfor AI for å finne riktig intent.

Etter hvert som du får mange brukere på løsningen vil man se at andre snakker med litt andre setninger og ord enn det du selv har brukt for å utføre den samme handlingen. I Dialogflow er det mulig å se hvilke setninger som ikke treffer noen intents, eller som treffer feil. Her kan det være lurt å følge med for å forbedre treningssetningene dine. Dette kan man enkelt gjøre ved å koble setningene til riktig intent.

📸: Henrik Dæhli
📸: Henrik Dæhli Vis mer

For min bysykkelassistent ønsket jeg også å kunne sjekke status på ethvert stativ bare ved å si noe slik som “Er det noen ledige sykler ved Tåsen senter?”

Ved å legge inn alle stativene med stativ-id som entities i Dialogflow kan jeg koble stativnavnet brukeren sier til riktig stativ-id. I eksempelet her vil Dialogflow matche “Tåsen senter” med en entitet med id 369. Dette trekker Dialogflow ut som en egen parameter som jeg har valgt å kalle stativ. Det er dermed enkelt å slå opp hvor mange ledige sykler som er tilgjengelig på stativet ved å bruke stativ-id mot Oslo Bysykkels API.

Når du lager treningssetninger for intentene vil Dialogflow automatisk markere ord eller delsetninger som inneholder en entitet.

📸: Henrik Dæhli
📸: Henrik Dæhli Vis mer

Etter at du har har laget intenten så må du bestemme hva som skal skje når denne får et treff. For dette brukes terminologien fullfillment. For å komme i gang kan man helt enkelt skrive inn hva assistenten skal svare. Man kan gjøre overraskende mye med statiske tilbakemeldinger, men skal du ha en assistent som er dynamisk og kan gjøre litt mer må du ha et baksystem som kalles.

Også her er det lekende lett å komme i gang hvis du har grunnleggende kunnskaper i JavaScript/Node.js. I Dialogflow er et en egen editor hvor koden automatisk lagres som en cloud function i Firebase. Cloud functions er det som tilsvarer Lambda functions hos AWS, så man slipper altså å sette opp noen server eller annen infrastruktur. Funksjonen “vekkes” automatisk til live på en server når den kalles.

Etter hvert som applikasjonen blir mer avansert vil du mest sannsynlig vokse ut av editoren direkte i Dialogflow da denne har en del begrensninger, som for eksempel at man kun kan ha én fil. Dette blir relativt uoversiktlig når applikasjonen blir større, og da vil man nok sette opp funksjonene direkte i firebase, eller et annet baksystem. Dialogflow har ingen begrensninger på hva slags baksystem som brukes, så her står man helt fritt så lenge man støtter HTTPS. Man er altså ikke begrenset til verken node eller Firebase.

En fordel ved å bruke node er at Google tilbyr et par SDKs slik at du slipper å parse JSON selv.

Når du har laget agenten i Dialogflow, gjenstår det bare å integrere den med Google-assistenten. Dialogflow kan også integreres med en rekke andre tjenester som blant annet Slack, Twitter, Facebook Messenger eller rett og slett som en del av websiden din. At Dialogflow er så generisk, betyr at alt oppsett for integrasjonen gjøres utenfor Dialogflow. Det gjør det hele litt vanskeligere første gang. Når man velger å integrere med Google-assistenten fra Dialogflow opprettes det et eget prosjekt på Actions on Google som er koblet til Dialogflow-prosjektet ditt. Det er her du setter navnet til assistenten din, ikoner og en rekke andre innstillinger.

Avhengig av norske tjenester

Ofte er det slik at det man har bruk for selv, er det også andre som kan ha nytte av. Jeg har derfor publisert bysykkel-assistenten min under navnet Sykkeltur i Oslo slik at alle kan bruke den.

📸: Henrik Dæhli
📸: Henrik Dæhli Vis mer

Det er dessverre ennå ikke mulighet å legge inn hjem- og jobbstativ, men du kan spørre om ledige sykler og låser på alle stativene i Oslo. I tillegg kan du spørre om ledige sykler og låser i nærheten av der du befinner deg.

Navnet Sykkeltur i Oslo har jeg valgt for at min assistent ikke skal forveksles med den offisielle Oslo Bysykkel assistenten.

Elkjøp forventer at de kommer til å selge en halv million Google Home i Norden før jul, og det kommer nok til å ligge mange Google Homes under juletrærne i år.

Det neste året vil være avgjørende for den norske Google-assistenten; blir den en suksess, eller havner den nederst i skuffen som “nok en morsom greie, men ikke nyttig nok til å ha fremme i stua”?

Det springende punktet tror jeg blir om Google klarer å få på plass nok gode tjenester på norsk!