Google Assistant: visual feedback

Stiamo transitando da un mondo “mobile first”
ad un mondo “AI first”
Sundai Pichar

La voce sta giocando un ruolo importante in questa fase di transizione da un paradigma  “mobile first” ad uno “AI First” sotto forma di assistenti vocali come Google Assistant , Amazon Alexa, Apple Siri. Portando così il potere della voce nel mercato consumer tramite prodotti intelligenti come smart-phones, smart-speakers, smart-watches, ecc. che nascono dalla forte combinazione di hardware, software e intelligenza artificiale (AI).

Per  rendere “smart” anche i nostri progetti aggiungendo l’assistente di Google abbiamo due metodi:

[1] L’utillizo della libreria in python Google Assistant Library che è l’ideale per il rapid prototyping per costruire device come AIY Voice Kit.
[2] O il servizio gRPC con Google Assistant Service,  che fornisce il binding per diversi linguaggi come Go, Java, C#, Node.js o Ruby.

Queste 2 API sono molto simili in termini di funzionalità, ma la libreria Python fornisce l’attivazione tramite hotword (“Ok Google”) avendo così le mani libere. Invece impiegando l’API gRPC, dobbiamo premere un pulsante (fisico o digitale).

La prima API supporta solo architetture x86-64 e ARMv7 (Raspberry Pi 2 e 3) e non ARMv6 (Raspberry Pi 1),  invece con la seconda possiamo usare Google Assistant anche sulla Pi-Zero come avevamo già visto in questo tutorial.

gRPC service

Una conversazione può essere composta da più connessioni gRPC, ciascuna costituita da più richieste e risposte. Ad esempio, se l’utente dice: “aggiungi alla mia lista della spesa”  l’assistente risponderà: “Cosa vuoi aggiungere ?”.
Una possibile sequenza di richieste e risposte potrebbe essere:

gRPC utilizza uno streaming bidirezionale per ricevere i risultati, per ogni chiamata abbiamo la richiesta audio dell’utente (audio_in) e una risposta da parte dell’assistente (audio_out).
Richiesta audio analogica “utterance” che verrà prima convertita in digitale e da cui  verrà estratto l’intento dell’utente (lo scopo della frase) da un modulo NLP/NLU. Ad esempio “Mi puoi mostrare la strada per il ristorante cinese? “ ha come intento “trova posizione”  invece i dettagli come ristorante cinese saranno le entities.

Feedback visivo

Il nostro intento è di associare un feedback visivo alle richieste dell’utente e alle risposte dell’assistente utilizzando i colori di un led RGB in modo da sapere lo stato della conversazione.

Durante il turno di conversazione dell’utente, quando sta esprimendo una richiesta, associeremo il colore verde [G] e alla risposta dell’assistente il led rosso [R] perché il turno dell’utente è terminato. Infine associeremo il colore blu [B] quando non c’è nessuna interazione fra utente e assistente che rimane in attesa che l’utente prema il pulsante fisico per esprimere una nuova richiesta.

RGB: terna di colori

Un led RGB  può riprodurre le lunghezze d’onda dei tre colori di base ([R] rosso, [G] verde, [B] blu) e dalla somma della terna di colori è possibile ottenere il colore bianco [W], mentre dalla loro assenza il nero.

Invece dalla sovrapposizione di due colori:
[R] + [B] = [M] magenta
[R] + [G] = [Y] giallo
[G] + [ B]  = [C] ciano

Led RGB

Un led RGB possiede  4 reofori che collegheremo ai pin GPIO-13, GPIO-19 e GPIO-26 della Raspberry e  GPIO-22 alla massa.
Le GPIO forniscono una tensione di 3.3v e in ingresso non tollerano i 5v come Arduino quindi per sicurezza inseriremo in serie ad ogni LED un resistore da 220 ohm che consentirà di regolare la corrente circolante nel diodo.

[R]  GPIO-13
[G] GPIO-19
[B] GPIO-26
[GND] GND

Utilizzando il servizio gRPC per iniziare la conversazione con Google Assistant dobbiamo premere un pulsante fisico che collegheremo alla GPIO-22

Editare push to talk

Per prima cosa aggiungiamo alla Raspberry il pacchetto RPi.GPIO per il supporto GPIO (porta generica I/O) usando il seguente comando:

Modifichiamo il file pushtotalk.py , dopo averne fatto una copia di backup (pushtotalk_orig.py), che se abbiamo seguito questo tutorial si troverà nella cartella site-packages delle librerie per Python.

Aggiungiamo le seguenti righe per  il supporto al led RGB e al pulsante.

L’utente sta parlando

All’interno del metodo assist inseriamo le righe di codice inerenti a quando l’utente sta parlando quindi il led verde [G] sarà acceso e i restanti spenti.

L’assistente sta rispondendo

Ora dobbiamo associare il led rosso [R] alla risposta dell’assistente che coinciderà con la fine dell’utterance.

L’assistente è in attesa di una richiesta

Quando l’assistente finisce il turno di conversazione lo mandiamo in modalità di attesa di una richiesta da parte dell’utente.

Pulsante fisico

Per poter iniziare la conversazione e l’utente esprimere la sua richiesta deve prima poter premere il pulsate fisico. Andremo quindi ad aggiungere all’interno del metodo main le righe per il pulsante.

Impostare l’assistente all’avvio

L’idea è che ogni volta che la Raspberry Pi termina il processo di avvio, eseguiremo lo script python che autenticherà e inizializzerà l’Assistente Google. Per farlo editeremo uno script shell a cui daremo il nome assistant-autostart:

Al file appena creato aggiungeremo le seguenti righe:

Dopo aver dato i permessi potremmo lanciare Assistant quante volte vogliamo dallo script.

Se volessimo lanciare Assistant all’avvio della Raspberry con il Desktop dovremmo editare il file autostart

ed aggiungervi il percorso dello script shell.

Sitografia

[1] James Schaefer, Smart Devices – What Makes Them “Smart”?, IotForAll, 14/01/2017
[2] Mark Bergen, Google CEO Sets ‘AI-First’ Device Blueprint to Catch Apple, Bloomberg, 04/08/2017
[3] Robert Triggs, What being an “AI first” company means for Google, Android Authority, 08/11/2017
[4] Martin Recke, The AI-First world requires new products, Next Conference, 13/12/2017

Google Assistant Embedded: v1alpha2
[1] Google Assistant Library
[2] Google Assistant Service
[3] EmbeddedAssistant
[4] AssistRequest
[5] AudioOut