Pomiń

Poznaj KUBI – konwersacyjnego robota-baristę

KUBI to barista, który rozmawia z tobą dzięki Conversational AI od ElevenLabs. Zobacz, jak to działa.

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

KUBI to konwersacyjny robot-barista i recepcjonista w Second Space, nowoczesnej przestrzeni coworkingowej 24/7 w Kaohsiung na Tajwanie. Ponieważ wszystko działa tu automatycznie, KUBI — jako pierwszy kontakt z członkiem — musi dodać trochę ludzkiego ciepła. Dlatego Second Space wybrało nasze Conversational AI, żeby rozmowy z KUBI były fajne i zapadały w pamięć. Zobacz, jak działa KUBI.

Jak działa KUBI

KUBI korzysta z zaawansowanej, wielozmysłowej architektury, żeby naśladować ludzką rozmowę. Całość opiera się na architekturze mikroserwisów — każdy z nich działa osobno i komunikuje się przez strumień zdarzeń w czasie rzeczywistym. Serwisy odpowiadają m.in. za rozpoznawanie twarzy i obiektów przez AI, wykrywanie kubków i sprawdzanie poprawności przez kamery, drukowanie paragonów, bezpieczne rozpoznawanie twarzy do kontroli dostępu oraz precyzyjne sterowanie dozownikami mleka i ziaren.

Oto niektóre z serwisów, które działają jednocześnie:

  • Środowisko Serwis kamer: Wykorzystuje AI (PyTorch w Pythonie) do wykrywania twarzy i obiektów na żywo.
  • Tablet Serwis kamer: Podobny, ale wykrywa kubki na stole, obce przedmioty i sprawdza, czy np. KUBI faktycznie trzyma kubek.
  • Serwis drukowania paragonów: Prosty i niezawodny, napisany w Node + Typescript. Łączy się z drukarką termiczną RS232.
  • Serwis płatności: Napisany w Kotlin JVM dla lepszej wydajności i bezpieczeństwa typów. Obsługuje raportowanie paragonów do urzędów i płatności kartą, krypto lub online.
  • Dozowniki mleka i ziaren: Oddzielne, precyzyjne serwisy na Arduino. Liczy się tu czas i niskie opóźnienia.
  • Rozpoznawanie twarzy: Bezpieczny serwis w Kotlinie, używany do kontroli dostępu.
  • Serwis czyszczenia dzbanków: Automatycznie myje dzbanki po spienianiu mleka — Arduino.
  • I inne serwisy, np. do API aplikacji mobilnej, wyświetlania menu itd.

Po co tyle mikroserwisów? Proste — każdy ogarniamy osobno, łatwo je skalować i możemy dobrać najlepsze narzędzia do każdego zadania.

Centralny rdzeń oparty na zdarzeniach spina wszystko razem

Wszystkimi mikroserwisami zarządza centralny serwis, żartobliwie nazwany "BigBoy". To po prostu ogromny, nieblokujący procesor zdarzeń:

Jak działa BigBoy:

  1. Nasłuchuje zdarzeń od wszystkich serwisów.
  2. Sprawdza scenariusze pod kątem odpowiednich wyzwalaczy.
  3. Wybiera najlepszy scenariusz.
  4. Planuje akcje do wykonania.
1
2internal object WeatherIdleScenario: SingleTaskScenario(scenario){
3
4 importance = Importance.Medium
5 compilationTimeout = Time.ThreeSeconds
6 interruptable = false
7 exeutionExpiration = = Time.TenSeconds
8
9 override fun isEligible(event: Event, environment: Environment): Maybe<Boolean> = withEnvironment(environment) {
10 just {
11 (event is IdleEvent
12 && !triggeredInLast(40.minutes)
13 && (personPresent() || hasActiveSessions)
14 && environment.weatherService.lastReportWithin(10.minutes))
15 }
16 }
17}
18
19private val scenario = ScenarioRecipe { event, env, session ->
20
21
22 invokeOneOf(
23
24 phrase {
25 sayWith {
26 "Rainy day today, isn't it? That's why I have my little umbrella! Look!".asEnglish
27 }.withAutoGift().withAutoMotion()
28 }.given { Weather.isRaining() },
29
30 phrase {
31 sayWith {
32 "Friend, it's so cold outside! So sad for you... because you're a human. I don't really mind!".asEnglish
33 }.withAutoMotion()
34
35 sayWith {
36 "Wait, that soudned a bit rude.".asEnglish
37 }.withAutoMotion()
38
39 }.given { Weather.isCold() },
40
41 )
42
43
44}
45
46

Czym są scenariusze?

Wyobraź sobie scenariusze jako nieblokujące kompilatory dla zdarzeń akcji. Zdarzenie akcji to zwykle ostatni krok w łańcuchu, który wywołuje fizyczny efekt, np. ruch lub mowę. Przykładowo, scenariusz powitania może wywołać:

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

Generowanie zdarzeń przez LLM: Niektóre zdarzenia akcji są generowane automatycznie przez LLM, np. withAutoMotion wybiera najlepszy ruch z listy na podstawie kontekstu. Z kolei withAutoGif używa LLM do wygenerowania najlepszego taga do danej frazy. Tag służy do pobrania GIF-a z Giphy, który pojawia się na twarzy KUBI razem z tekstem.

Synchronizacja zdarzeń akcji: Te zdarzenia trafiają do planera, który pilnuje, żeby mowa, mimika i ruchy były zsynchronizowane. Dzięki temu to, co mówi KUBI, idealnie pasuje do jego gestów.

Elastyczność i rozbudowa

Fajne jest to, że scenariusze mogą nawet nasłuchiwać zdarzeń akcji i wywoływać nowe zdarzenia akcji dynamicznie. Przykład:

  • Jeśli BigBoy wykryje SayEvent("Merry Christmas"), może automatycznie włączyć świąteczne światła i efekty specjalne w pomieszczeniu.
  • Inny fajny przykład — jeśli użytkownik zamawia przez naszą aplikację mobilną, wszystkie jego akcje (kliknięcia, płatność itd.) zamieniane są na zdarzenia i BigBoy reaguje na nie od razu. Na przykład, jeśli przewiniesz „Oatmilk Latte”, KUBI może zapytać: „Na pewno nie chcesz Oatmilk Latte? Jest naprawdę dobre!”

BigBoy dosłownie widzi i wie wszystko, co się dzieje. Fajne, prawda?

DevOps i obserwowalność

Większość serwisów działa lokalnie w kontenerach dockera. Ich cyklem życia zarządza Supervisor. Logi błędów trafiają do Sentry i do naszej aplikacji admina, gdzie monitorujemy wyjątki, status serwisów i sensorów oraz opóźnienia. Co ciekawe, 90% aplikacji Flutter napisała AI.

Jak używamy ElevenLabs do tworzenia niezapomnianych rozmów

Second Space miało konkretną wizję osobowości KUBI — trochę Deadpoola, Wheatleya z gry Portal i Pathfindera z Apex Legends. Udało im się zaprojektować głos w 15 minut — z emocjami i pauzami, które sprawiają, że brzmi bardzo ludzko.

KUBI mówi dzięki dwóm naszym API:

Text-To-Speech (TTS)

  • Obsługuje ok. 90% rozmów.
  • Korzysta z gotowych scenariuszy, żeby oddać odpowiedni klimat.
  • Wiadomości generowane przez LLM można personalizować, dźwięk jest wysokiej jakości, wymowa świetna, nie liczy się czas.
  • Oferuje bardzo naturalną mowę w wielu językach: angielskim, chińskim, hiszpańskim, japońskim, a nawet łotewskim (łotewski Deadpool, ktoś chętny?).

Tryb konwersacyjny (na żywo)

Włącza się, gdy klient powie "Hej KUBI!", Conversational AI od ElevenLabs odpowiada w 200 ms, więc rozmowa jest naprawdę naturalna.

  • Priorytet: Niskie opóźnienia.
  • Czasem kosztem jakości dźwięku, ale liczy się szybkość reakcji.
  • Korzysta z naszego nowego narzędzia language_detection, które automatycznie rozpoznaje język.
  • Sesja Conversational AI uruchamia się na żądanie, gdy członek wchodzi do lokalu lub mówi „Hej, KUBI!”

Własne narzędzia konwersacyjne

Dzięki połączeniu WebSocket z Conversational AI od ElevenLabs, KUBI może korzystać z wywołań funkcji, np.:

  • make_order: Rozpoznaje zamówienia, wysyła zdarzenia prosto do BigBoy.
  • make_payment: Od razu informuje nasz PaymentService, żeby uruchomić terminal płatniczy.

Łatwe przełączanie modeli LLM przez panel admina ElevenLabs pozwala Second Space lepiej dopasować rozumienie i dokładność — zauważyliśmy, że różne modele lepiej rozpoznają intencje niż inne. Teraz używają Gemini 2.0 Flash jako głównego modelu do Conversational AI, a ChatGPT 4o do generowania statycznych wypowiedzi.

KUBI w nowych krajach

Pierwsze commity Second Space na GitHubie z ElevenLabs są z stycznia 2023 — zanim pojawił się model wielojęzyczny. Od początku docenili jakość ElevenLabs i zbudowali architekturę gotową na obsługę wielu języków. Teraz wejście na rynek Japonii czy Korei to kwestia jednego kliknięcia — bez dodatkowej pracy deweloperskiej!

Podsumowanie

Mikroserwisy, zdarzenia w czasie rzeczywistym i technologia głosu od ElevenLabs sprawiają, że KUBI naprawdę żyje i jest gotowy zachwycać świat — kawa po kawie, rozmowa po rozmowie.

Przeglądaj artykuły zespołu ElevenLabs

ElevenLabs

Twórz z najwyższą jakością dźwięku AI