Il tempo reale, senza ricaricare
Parlare con un assistente è tenere un filo. Se ogni frase ricominciasse da zero, la conversazione perderebbe la sua memoria immediata e il suo ritmo. Ecco perché abbiamo scelto un canale sempre aperto.
Una conversazione non è una serie di richieste
L'architettura web classica si basa su richieste isolate: si chiede, si riceve, si chiude la connessione. Questo è perfetto per caricare una pagina, ma inadatto a uno scambio vivo. Una conversazione ha una continuità: ciò che hai appena detto colora la risposta successiva, l'assistente può parlare in più tempi, l'audio arriva a frammenti. Trattare ogni frase come un modulo indipendente avrebbe rotto questa naturalezza.
Un canale che rimane aperto
Abbiamo quindi costruito lo scambio su un WebSocket: una connessione unica, aperta per la durata della sessione, in cui i messaggi circolano in entrambe le direzioni. Il client invia l'audio, il server restituisce il testo e la voce, senza ristabilire la connessione ad ogni turno. L'autenticazione avviene all'apertura, tramite un token trasmesso al momento dell'handshake; poi il tunnel è stabilito, e tutto passa attraverso di esso.
L'audio come un flusso
Questo canale permette di trattare la voce come un flusso piuttosto che come un file. La risposta può iniziare a essere riprodotta mentre si sta ancora generando, e il server sa adattarsi: se l'utente ha disattivato l'audio, non invia semplicemente la sintesi vocale, risparmiando un calcolo inutile. Lo stesso canale serve a tutto: è ciò che rende lo scambio fluido piuttosto che a scatti.
Rimanere vivi nonostante la rete
Un canale aperto ha una fragilità: la rete può interromperlo. Un'interruzione del tunnel non fa scomparire la memoria né la conversazione in corso; alla riconnessione, il filo riprende da dove si era interrotto. Sul cellulare, dove si passa dal Wi-Fi al 4G camminando, questa resilienza non è un dettaglio: è la condizione affinché un assistente vocale rimanga un compagno di ogni istante.

