
Poznaj KUBI – konwersacyjnego robota-baristę
KUBI to barista, który rozmawia z tobą dzięki Conversational AI od ElevenLabs. Zobacz, jak to działa.
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:
- Nasłuchuje zdarzeń od wszystkich serwisów.
- Sprawdza scenariusze pod kątem odpowiednich wyzwalaczy.
- Wybiera najlepszy scenariusz.
- Planuje akcje do wykonania.
| 1 | |
| 2 | internal 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 | |
| 19 | private 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ć:
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("Wesołych Świąt"), 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.:
- złóż zamówienie: Rozpoznaje zamówienia, wysyła zdarzenia prosto do BigBoy.
- opłać zamówienie: 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


Introducing Experiments in ElevenAgents
The most data-driven way to improve real-world agent performance.

