Salta al contenuto

Incontra KUBI, il robot barista conversazionale

KUBI è un barista conversazionale che lavora con la Conversational AI di ElevenLabs. Ecco come funziona.

A robotic arm holding a can of Red Bull energy drink against a blue background.

KUBI è un robot barista e receptionist conversazionale presso Secondo Spazio, un workspace di nuova generazione aperto 24/7 a Kaohsiung, Taiwan. Poiché la gestione del workspace è completamente automatizzata, è fondamentale che KUBI — come primo punto di contatto con i membri — aggiunga un tocco unico e amichevole. Per questo Second Space ha scelto la IA conversazionale di ElevenLabs per creare interazioni divertenti e memorabili con i membri. Vediamo KUBI in azione.

Come funziona KUBI

KUBI utilizza un’architettura multisensoriale avanzata per simulare un’interazione simile a quella umana. Il sistema si basa su un’architettura a microservizi, in cui servizi specializzati operano in parallelo e comunicano tramite uno stream di eventi in tempo reale. Questi servizi gestiscono vari compiti, tra cui riconoscimento facciale e di oggetti tramite inferenza IA in tempo reale, rilevamento delle tazze e controlli tramite telecamere, stampa degli scontrini, riconoscimento facciale sicuro per il controllo accessi e controllo preciso dei distributori di latte e caffè.

Ecco alcuni dei servizi che funzionano in parallelo:

  • Ambiente Servizio Camera: Usa inferenza IA in tempo reale (PyTorch in Python) per rilevare volti e oggetti.
  • Tablet Servizio Camera: Molto simile, ma rileva tazze sul tavolo, oggetti estranei e verifica che tutto sia a posto — ad esempio, se il robot KUBI sta effettivamente tenendo una tazza.
  • Servizio Stampa Scontrini: Semplice e affidabile con Node + Typescript. Comunica con una stampante termica RS232.
  • Servizio Pagamenti: Sviluppato con Kotlin JVM per una concorrenza solida e sicurezza dei tipi. Gestisce la trasmissione degli scontrini fiscali e le comunicazioni con terminali di carte di credito, gateway per pagamenti in crypto o fornitori di pagamenti online.
  • Distributori di Latte e Caffè: Servizi separati di precisione — Arduino. Sensibili al tempo, a bassa latenza.
  • Riconoscimento Facciale: Servizio Kotlin sicuro e fortemente tipizzato, usato per il controllo accessi.
  • Servizio Getto d’Acqua: Pulisce automaticamente le brocche per il latte dopo l’uso — Arduino.
  • E vari altri servizi, ad esempio per l’API dell’app mobile, la visualizzazione del menu ecc…

Perché tutti questi microservizi? Semplice — li gestiamo in modo indipendente, possiamo scalarli facilmente e usiamo gli strumenti migliori per ogni compito.

Un core centrale basato su eventi per coordinare tutto

A coordinare tutti questi microservizi c’è un servizio centrale, chiamato con ironia "BigBoy". In pratica è un grande processore di eventi non bloccante:

Ecco come funziona BigBoy:

  1. Ascolta gli eventi in arrivo da tutti i servizi.
  2. Verifica gli scenari per i trigger idonei.
  3. Seleziona lo scenario migliore.
  4. Programma le azioni da eseguire.

internal object WeatherIdleScenario: SingleTaskScenario(scenario){
   
    importance = Importance.Medium
    compilationTimeout = Time.ThreeSeconds
    interruptable = false
    exeutionExpiration = = Time.TenSeconds
   
    override fun isEligible(event: Event, environment: Environment): Maybe<Boolean> = withEnvironment(environment) {
        just {
            (event is IdleEvent 
                    && !triggeredInLast(40.minutes) 
                    && (personPresent() || hasActiveSessions) 
                    && environment.weatherService.lastReportWithin(10.minutes))
        }
    }
}

private val scenario = ScenarioRecipe { event, env, session ->


    invokeOneOf(
       
        phrase {
              sayWith { 
                "Rainy day today, isn't it? That's why I have my little umbrella! Look!".asEnglish
              }.withAutoGift().withAutoMotion()
        }.given { Weather.isRaining() },

        phrase {
            sayWith {
                "Friend, it's so cold outside! So sad for you... because you're a human. I don't really mind!".asEnglish
            }.withAutoMotion()

           sayWith {
                "Wait, that soudned a bit rude.".asEnglish
            }.withAutoMotion()

        }.given { Weather.isCold() },

    )


}

Cosa sono gli scenari?

Pensa agli scenari come a compilatori non bloccanti per gli eventi di azione. Un evento di azione è di solito l’evento più a valle, cioè l’ultimo passo di una catena, che produce un effetto fisico, come un movimento o una frase. Ad esempio, uno scenario di saluto potrebbe attivare:

SayEvent("Hello! Welcome!", wave.gif)
MotionEvent(HelloMotion)

Generazione di eventi con LLM: Alcuni eventi di azione vengono generati automaticamente da un LLM, ad esempio con AutoMotion sceglie il movimento migliore da una lista predefinita in base al contesto. Mentre con AutoGif usa un LLM per generare il tag più adatto alla frase. Il tag viene usato per recuperare una GIF su Giphy, che poi viene mostrata sul volto di KUBI insieme alla frase.

Sincronizzazione degli eventi di azione: Questi eventi passano poi attraverso uno scheduler che garantisce la sincronizzazione tra parlato, espressioni facciali e movimenti. La sincronizzazione fa sì che il parlato di KUBI sia perfettamente coordinato con i suoi gesti.

Flessibile ed estendibile

La cosa interessante è che gli scenari possono anche ascoltare gli eventi di azione e attivare nuovi eventi di azione in modo dinamico. Ad esempio:

  • Se BigBoy rileva SayEvent("Buon Natale"), può attivare automaticamente luci festive ed effetti speciali nella stanza.
  • Un altro esempio interessante: se l’utente sceglie la nostra App mobile per fare un ordine, tutte le interazioni (clic su un prodotto, pagamento ecc.) vengono convertite in eventi e BigBoy può reagire in tempo reale. Ad esempio, se l’utente scorre oltre “Oatmilk Latte”, KUBI potrebbe dire “Sei sicuro di non voler provare l’Oatmilk Latte? È davvero buono!”

BigBoy vede e sa letteralmente tutto quello che succede. Niente male, vero?

DevOps e osservabilità

La maggior parte dei servizi è fornita localmente e racchiusa in un container docker. All’interno del container, il loro ciclo di vita è gestito dal sistema di controllo Supervisor. I log di errore vengono raccolti in Sentry e inviati a un’app admin personalizzata per monitorare eventuali eccezioni, lo stato in tempo reale di servizi e sensori e i report di latenza. La cosa interessante è che il 90% dell’app Flutter è stato generato dall’IA.

Usare ElevenLabs per creare interazioni memorabili

Second Space aveva in mente una personalità molto precisa per KUBI: un mix tra Deadpool, Wheatley di Portal e un pizzico di Pathfinder di Apex Legends. Sono riusciti a progettare la voce in 15 minuti, completa di emozioni e pause che la rendono ancora più umana.

ElevenLabs alimenta le capacità vocali di KUBI tramite due API principali:

Text to Speech (TTS)

  • Gestisce circa il 90% delle nostre interazioni.
  • Usa scenari preimpostati per creare l’atmosfera perfetta.
  • I messaggi generati dagli LLM possono essere personalizzati, con audio di alta qualità, la migliore pronuncia e senza vincoli di tempo.
  • Offre parlato multilingue incredibilmente naturale in inglese, cinese, spagnolo, giapponese e perfino lettone (qualcuno vuole Deadpool lettone?).

Modalità conversazionale (in tempo reale)

Si attiva quando un cliente dice: "Ehi KUBI!", la Conversational AI di ElevenLabs riesce a rispondere in 200 ms, rendendo l’interazione davvero naturale.

  • Priorità: Bassa latenza.
  • Sacrifica un po’ di qualità audio per una risposta più rapida.
  • Usa il nuovo strumento di rilevamento_lingua in tempo reale di ElevenLabs, gestendo dinamicamente lingue diverse all’istante.
  • La sessione di Conversational AI si avvia su richiesta quando un membro entra nella struttura o dice “Hey, KUBI!”

Strumenti conversazionali personalizzati

Usando la Conversational AI di ElevenLabs tramite connessione WebSocket, KUBI può sfruttare il function calling, ad esempio:

  • effettua_ordine: Riconosce gli ordini e invia eventi direttamente a BigBoy.
  • effettua_pagamento: Notifica immediatamente il nostro PaymentService per attivare il terminale di pagamento.

Passare facilmente tra diversi modelli LLM tramite il pannello admin di ElevenLabs aiuta Second Space a ottimizzare comprensione e accuratezza, dato che abbiamo notato che modelli diversi riconoscono le intenti meglio di altri. Attualmente usano Gemini 2.0 Flash come modello principale per la Conversational AI e ChatGPT 4o per la generazione di parlato statico.

Espandere KUBI in nuovi mercati

I primi commit GitHub di Second Space che citano ElevenLabs risalgono a gennaio 2023 — ancora prima che fosse rilasciato il modello multilingue. Hanno riconosciuto subito l’attenzione di ElevenLabs per la qualità e hanno costruito un’architettura pronta per il supporto multilingue futuro. Ora, entrare in mercati come Giappone e Corea del Sud è semplice come premere un interruttore — senza bisogno di ulteriore lavoro di sviluppo!

Conclusione

Microservizi, eventi in tempo reale e la potente tecnologia vocale di ElevenLabs fanno sì che KUBI sembri davvero vivo e pronto a sorprendere il mondo, una tazza di caffè e una battuta alla volta.

Scopri gli articoli del team ElevenLabs

Crea con l'audio IA della massima qualità