跳到内容

认识对话机器人咖啡师 KUBI

KUBI 是一款与 ElevenLabs 对话式 AI 协作的咖啡师。以下是它的工作方式。

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

KUBI第二空间 的对话机器人咖啡师和前台,这是一家位于台湾高雄的下一代 24 小时共享办公空间。由于空间运营全自动化,KUBI 作为会员的第一接触点,必须带来独特且友好的体验。因此 Second Space 选择了 ElevenLabs 的 对话式 AI,为会员带来有趣且难忘的互动。下面来看看 KUBI 的实际表现。

KUBI 的工作原理

KUBI 采用多感官架构,模拟类人的互动体验。系统基于微服务架构,各专用服务并行运行,通过实时事件流通信。这些服务负责多项任务,包括通过实时 AI 推理进行人脸和物体识别、摄像头检测杯子和安全校验、小票打印、门禁安全人脸识别,以及精准控制牛奶和咖啡豆分配。

以下是部分并行运行的服务:

  • 环境 摄像头服务:使用实时 AI 推理(Python 的 PyTorch)识别人脸和物体。
  • 平板 摄像头服务:类似,但用于检测桌面上的杯子、异物,并校验状态,比如 KUBI 是否真的拿着杯子。
  • 小票打印服务:基于 Node + Typescript,简单可靠。连接 RS232 热敏打印机。
  • 支付服务:用 Kotlin JVM 构建,支持高并发和类型安全。处理政府小票上报、与信用卡终端、加密支付网关或在线支付平台的通信。
  • 牛奶和咖啡豆分配器:独立的精准服务 — Arduino 实现,时效性强,延迟低。
  • 人脸识别:安全且类型严格的 Kotlin 服务,用于门禁控制。
  • 水流清洗服务:自动清洗打奶壶 — Arduino 实现。
  • 还有其他服务,如移动 App API、菜单展示等……

为什么采用微服务?很简单——可以独立管理、轻松扩展,并为每项任务选用最合适的工具。

事件驱动核心统一调度

所有微服务由一个中心服务协调,名字很有趣,叫做 “BigBoy”。它本质上是一个大型非阻塞事件处理器:

BigBoy 的工作流程如下:

  1. 监听所有服务发来的事件。
  2. 检测场景触发条件。
  3. 选择最佳场景。
  4. 安排动作事件执行。

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() },

    )


}

什么是场景?

可以把场景理解为机器人 动作事件的非阻塞编译器。动作事件通常是事件链的最后一步,会带来实际效果,比如动作或语音。例如,问候场景可能会触发:

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

LLM 事件生成:部分动作事件由 LLM 自动生成,比如 自动跟随 会根据上下文从预设动作列表中选出最佳动作。而 自动动图 则用 LLM 生成最合适的标签,用于在 Giphy 获取 GIF,随后和语句一起显示在 KUBI 的“脸”上。

动作事件同步:这些事件会经过调度器,确保语音、表情和动作同步。这样 KUBI 的语音和动作始终匹配。

灵活可扩展

有趣的是,场景还能监听 动作事件,并动态触发新的 动作事件。例如:

  • 如果 BigBoy 检测到 SayEvent(“圣诞快乐”),就能自动触发房间内的节日灯光和特效。
  • 另一个例子:如果用户用移动 App 下单,所有用户操作(如点击商品、支付等)都会转为事件,BigBoy 也能实时响应。例如,用户滑过“Oatmilk Latte”时,KUBI 可能会说:“确定不要燕麦拿铁吗?真的很好喝哦!”

BigBoy 能实时掌握所有动态,真的很酷吧?

运维与可观测性

大部分服务本地部署,并封装在 docker 容器中。容器内生命周期由 Supervisor 进程管理。错误日志汇总到 Sentry,并推送到自定义管理后台,实时监控服务和传感器状态及延迟报告。有趣的是,Flutter App 有 90% 都是 AI 自动生成的。

用 ElevenLabs 打造难忘互动

Second Space 为 KUBI 设定了非常独特的个性——融合了死侍、Portal 游戏里的 Wheatley 和 Apex 英雄的 Pathfinder。他们只用 设计声音 15 分钟,就完成了带有情感和停顿的人性化声音。

ElevenLabs 通过两大核心 API 支持 KUBI 的语音能力:

文本转语音(TTS)

  • 覆盖约 90% 的互动。
  • 用预设场景营造理想氛围。
  • LLM 生成的消息可个性化,音质高、发音最佳、不追求极低延迟。
  • 支持英语、中文、西班牙语、日语,甚至拉脱维亚语等多语种自然语音(拉脱维亚版死侍也可以)。

对话模式(实时)

当用户说 “Hey KUBI!” 时,ElevenLabs 的对话式 AI 能在 200 ms 内响应,互动体验非常自然。

  • 重点:低延迟.
  • 为响应速度牺牲部分音质。
  • 用 ElevenLabs 新的实时 语言检测 工具,动态识别多种语言。
  • 会员进入空间或说“Hey, KUBI!”时,会自动开启对话式 AI 会话。

自定义对话工具

通过 WebSocket 连接 ElevenLabs 对话式 AI,KUBI 可调用函数,例如:

  • 创建订单:识别下单,直接发送事件到 BigBoy。
  • 支付:立即通知 PaymentService 启动信用卡机支付。

通过 ElevenLabs 管理后台可轻松切换不同 LLM 模型,帮助 Second Space 优化理解和准确率。我们发现不同模型对工具意图的识别效果不同。目前他们用 Gemini 2.0 Flash 作为对话式 AI 核心模型,ChatGPT 4o 用于静态语音生成。

KUBI 拓展更多市场

Second Space 最早在 2023 年 1 月的 GitHub 提交中就引用了 ElevenLabs——甚至早于多语言模型发布。他们很早就认可 ElevenLabs 对品质的专注,并提前搭建了支持多语言的架构。现在,进入日本、韩国等新市场只需“切换开关”,无需额外开发。

总结

微服务、实时事件和 ElevenLabs 强大的语音技术,让 KUBI 真正“活”了起来,每一次咖啡和有趣互动都能带来惊喜。

查看更多 ElevenLabs 团队的文章

用高质量 AI 音频创作