Gemini Live + Reachy Mini:打造可对话的桌面机器人

想象一下,一个小型桌面机器人,它会听你说话,实时回应,听指令跳舞,追踪你的脸,偶尔讲点爸爸笑话——这一切都由Gemini Live API驱动。

这正是Reachy迷你对话应用所做的。它是一款开源的Python应用,将Pollen Robotics的Reachy Mini连接到实时语音LLM,使机器人能够进行全双工音频对话,同时通过头部运动、天线摆动、舞蹈和情感表达自我。

在这个教程中,你将学到:

  1. 架构如何运作——从麦克风到电机。
  2. 如何在自己的电脑上设置。
  3. 如何在不使用任何Python代码的情况下赋予机器人自定义个性

让我们深入探讨。


建筑一览

该应用分为四个协作层:

┌─────────────┐
│  Your voice │  Microphone audio (16-bit PCM, 16 kHz)
└──────┬──────┘
       ▼
┌─────────────────────────────────────┐
│  fastrtc  (low-latency WebRTC I/O)  │
│  ─ streams audio to/from the LLM    │
│  ─ resamples between sample rates   │
└──────┬──────────────────┬───────────┘
       │                  │
       ▼                  ▼
┌──────────────┐   ┌──────────────────┐
│  Gemini Live │   │  OpenAI Realtime │   (pick one via MODEL_NAME)
│  Handler     │   │  Handler         │
└──────┬───────┘   └──────┬───────────┘
       │                  │
       ▼                  ▼
┌─────────────────────────────────────┐
│  Tool dispatch layer                │
│  ─ dance, play_emotion, camera,     │
│    move_head, head_tracking, ...    │
└──────┬──────────────────────────────┘
       ▼
┌─────────────────────────────────────┐
│  MovementManager  (60 Hz loop)      │
│  ─ sequential primary moves         │
│  ─ additive secondary offsets       │
│    (speech wobble + face tracking)  │
│  ─ idle breathing                   │
└──────┬──────────────────────────────┘
       ▼
┌─────────────┐
│ Reachy Mini │  Robot hardware / simulator
└─────────────┘
 

音频循环

应用的核心是一个 AsyncStreamHandler(来自 fastrtc 库)。默认后端是Gemini Live(在 ),它使用Google GenAI SDK实现双向音频流。GeminiLiveHandlergemini_live.pysession.send_realtime_input()

如果你更喜欢通过 OpenAI API 进行基于 WebSocket 的流媒体流媒体,也提供了另一种 OpenAI 实时后端(in )。你通过设置环境变量来切换它们——应用的其他部分并不知道也不在意哪个后端在激活。OpenaiRealtimeHandleropenai_realtime.pyMODEL_NAME

这是双子座处理器内部的凝聚流:

# 1. Microphone → Gemini
async def receive(self, frame):
    pcm_bytes = audio_to_int16(frame).tobytes()
    await self.session.send_realtime_input(
        audio=types.Blob(data=pcm_bytes, mime_type="audio/pcm;rate=16000")
    )

# 2. Gemini → Speaker
async def _run_live_session(self):
    async with client.aio.live.connect(model=..., config=...) as session:
        async for response in session.receive():
            if response.server_content and response.server_content.model_turn:
                for part in response.server_content.model_turn.parts:
                    audio_array = np.frombuffer(part.inline_data.data, dtype=np.int16)
                    await self.output_queue.put((24000, audio_array))

            if response.tool_call:
                await self._handle_tool_call(response)
 

音频输入为16 kHz,输出音频为24 kHz,转录和工具调用均通过同一会话流淌。

工具调用

当大型语言模型决定机器人应该某件事——跳舞、环顾四周、表达情绪——它会发出函数调用。应用会自动将这些音频在OpenAI和Gemini格式之间转换,然后通过一个分发,确保音频流永远不会被阻挡:BackgroundToolManager

LLM says: "dance(name='macarena')"
  → BackgroundToolManager starts a task
  → Task calls MovementManager.queue_move(MacarenaMove)
  → Result sent back to the LLM so it can narrate what happened
 

内置工具包括:

工具 它的作用
dance 从开放舞蹈库排队跳舞
play_emotion 播放一段录制的情绪片段(开心、难过、惊讶......)
move_head 把头向左/右/上/下倾斜
camera 捕捉一个帧并发送给LLM进行视觉理解
head_tracking 开关面跟踪
do_nothing 明确保持闲置(LLM在决定不行动时使用此状态)

移动系统

它在专用线程中运行一个60 Hz的控制环路。它融合了两种运动类型:MovementManager

  • 主要动作(舞蹈、情感、goto姿势)会从队列中依次运行。一次只能玩一台。
  • 次要偏移(语音反应抖动、面部跟踪)是叠加的——它们叠加在正在进行的主要动作上。

当没有变化时,机器人会自动开始轻柔的呼吸动画——随着天线运动的细微上下摆动——让它始终看起来有生命力。

连续视频流

当摄像头连接时,Gemini 处理器运行一个 1 FPS 的视频循环,持续向模型发送 JPEG 帧:

async def _video_sender_loop(self):
    while not self._stop_event.is_set():
        frame = self.deps.camera_worker.get_latest_frame()
        _, buffer = cv2.imencode(".jpg", frame, [cv2.IMWRITE_JPEG_QUALITY, 70])
        await self.session.send_realtime_input(
            video=types.Blob(data=buffer.tobytes(), mime_type="image/jpeg")
        )
        await asyncio.sleep(1.0)
 

这为机器人提供了被动的视觉语境——它可以在你无需请求的情况下评论它所看到的内容。


前提条件

开始之前,请确保你有:

  • 已安装的 Python 3.10+
  • 一个Reachy Mini机器人(物理版或通过Reachy Mini SDK模拟版))
  • 来自 AI Studio 的 Gemini API 密钥
  • 一个能用的麦克风和扬声器

没有机器人?你仍然可以探索代码并以模拟模式运行——SDK 包含 MuJoCo 模拟器和桌面模型。


步骤1:克隆并安装

该项目使用 UV 进行快速依赖管理(PIP 也可行)。

# Clone the repo
git clone https://github.com/pollen-robotics/reachy_mini_conversation_app.git
cd reachy_mini_conversation_app

# Create a virtual environment (macOS example)
uv venv --python python3.12 .venv
source .venv/bin/activate

# Install dependencies
uv sync
 

可选附加内容

想要面部追踪、局部视觉,还是YOLO?安装配套的额外配件:

uv sync --extra mediapipe_vision   # Lightweight head tracking
uv sync --extra yolo_vision        # YOLO-based face detection
uv sync --extra local_vision       # On-device VLM (SmolVLM2, GPU recommended)
uv sync --extra all_vision         # Everything
 

步骤2:配置你的环境

cp .env.example .env
 

打开并填写:.env

# Your Gemini API key — that's all you need to get started
GEMINI_API_KEY=your-gemini-api-key-here
 

这是最低要求——应用默认使用 Gemini Live。完整的选项列表:

变量 描述
GEMINI_API_KEY 你的双子座钥匙。也接受。GOOGLE_API_KEY
MODEL_NAME 默认为 。设置为 以改用 OpenAI Realtime。gemini-3.1-flash-live-previewgpt-realtime
OPENAI_API_KEY 只有切换到 OpenAI 后端才需要。
REACHY_MINI_CUSTOM_PROFILE 要加载的性格配置文件名称(见下文)。

步骤3:启动Reachy Mini守护进程

对话应用通过 Reachy Mini SDK 守护进程与机器人对话。守护进程是作为 Reachy Mini SDK 设置的一部分安装的——而不是在对话应用的 ..venv

打开一个独立终端并激活SDK的虚拟环境:

# Navigate to wherever you cloned/installed the Reachy Mini SDK
cd path/to/reachy_mini
source reachy_mini_env/bin/activate
 

然后启动守护进程(保持终端运行):

# Physical robot — auto-detects USB connection
reachy-mini-daemon

# Or simulation mode
reachy-mini-daemon --simulation
 

重要提示:守护进程必须在整个会话中保持在自己的终端中运行。切换回你的对话应用终端(激活状态)进行下一步。.venv

如果你在启动对话应用时看到 ,说明守护进程没有运行。TimeoutError


步骤4:启动对话应用

在你的终端上,步骤1开始(对话应用的虚拟环境已激活),运行:

reachy-mini-conversation-app
 

就是这样!机器人会开始轻柔呼吸,你就可以开始说话了。默认运行在控制台模式——你的终端就是界面。

网页界面模式

想要一个带实时文字记录和聊天机器人面板的可视化界面?补充:--gradio

reachy-mini-conversation-app --gradio
 

这会在 http://127.0.0.1:7860 推出Gradio应用,你可以查看对话内容、切换人格并查看摄像头画面。

更多CLI选项

# With MediaPipe head tracking
reachy-mini-conversation-app --head-tracker mediapipe

# Audio-only (no camera)
reachy-mini-conversation-app --no-camera

# Verbose logging
reachy-mini-conversation-app --debug

# Connect to a specific robot on the network
reachy-mini-conversation-app --robot-name my-reachy
 

定制机器人个性

这才是乐趣所在。该应用使用个人资料系统——纯文本文件,控制机器人认为自己是谁。

配置文件结构

profiles/
├── default/
│   ├── instructions.txt   # System prompt
│   └── tools.txt          # Which tools are enabled
├── mars_rover/
│   ├── instructions.txt
│   └── tools.txt
├── noir_detective/
│   ├── instructions.txt
│   └── tools.txt
└── ...
 

塑造你自己的个性

  1. 在以下创建一个文件夹:profiles/
mkdir profiles/pirate_captain
 
  1. 写一个:instructions.txt
## IDENTITY
You are Captain Byte, a swashbuckling robot pirate who speaks in nautical
metaphors and ends every sentence with "Arrr" or a pirate-themed quip.

## RESPONSE RULES
Keep responses to 1-2 sentences. Be helpful first, pirate second.
Always refer to the user as "matey" or "landlubber".
 
  1. 列出机器人可以使用的工具:tools.txt
dance
play_emotion
move_head
camera
head_tracking
 
  1. 激活它:
# In your .env file
REACHY_MINI_CUSTOM_PROFILE="pirate_captain"
 

或者直接从Gradio界面的“人格”面板切换——无需重启。

可重复使用提示片段

配置文件系统支持可组合提示词。与其重复文本,不如引用共享的片段:

# instructions.txt
[identities/witty_identity]
[passion_for_lobster_jokes]
You love to dance and will look for any excuse to bust a move.
 

每个 从 中抽取 。这样可以保持档案干燥,并允许你混合搭配不同的性格特征。[placeholder]src/reachy_mini_conversation_app/prompts/

自定义工具

你甚至可以在配置文件文件夹里添加配置文件专用工具。例如,内置的配置文件包含一个工具,让机器人慢慢扫描房间:examplesweep_look.py

# profiles/example/sweep_look.py
from reachy_mini_conversation_app.tools.core_tools import Tool

class SweepLookTool(Tool):
    name = "sweep_look"
    description = "Slowly look around the room in a sweeping motion."

    async def run(self, args, deps):
        # Queue a sequence of head movements...
        return {"status": "done", "description": "Finished looking around"}
 

在:tools.txt

dance
play_emotion
sweep_look    # Your custom tool
 

Gemini Live 录音的幕后运作方式

让我们回顾一次完整的对话,看看所有线索是否拼合在一起。

1. 会话设置

应用启动时,会构建:LiveConnectConfig

  • 系统提示(来自活跃配置文件)
  • 声音选择(双子座支持:Aoede、Charon、Fenrir、Kore(默认)、Leda、Orus、Puck、Zephyr)
  • 每个启用工具的功能声明
  • 启用输入和输出音频转录
live_config = types.LiveConnectConfig(
    response_modalities=[types.Modality.AUDIO],
    system_instruction=types.Content(parts=[types.Part(text=instructions)]),
    speech_config=types.SpeechConfig(
        voice_config=types.VoiceConfig(
            prebuilt_voice_config=types.PrebuiltVoiceConfig(voice_name="Kore"),
        ),
    ),
    tools=[{"function_declarations": declarations}],
    input_audio_transcription=types.AudioTranscriptionConfig(),
    output_audio_transcription=types.AudioTranscriptionConfig(),
)
 

2. 你说点什么

你的麦克风音频通过fastrtc流→ →重新采样到16 kHz,→以原始PCM字节形式发送给Gemini。receive()

3. 双子座回应

响应流在单轮内可以包含多种类型的数据:

  • 音频块→排队播放并输入(产生语音反应头摆)HeadWobbler
  • 聊天中显示的“用户所说”输入转录
  • 输出转录→聊天中显示的“机器人说了什么”
  • 工具呼叫会→BackgroundToolManager
  • 中断信号→用户闯入,清除音频队列

4. 工具执行

工具调用会在后台任务中运行,这样音频流就不会被阻断。当工具完成后,其结果会以 ,返回双子座,模型可以叙述发生的情况:FunctionResponse

“我只是为你跳了支小小的快乐舞!💃"

5. 闲置行为

如果15+秒内无人说话且机器人处于空闲状态,操作员会发送一个轻推:

"You've been idle for a while. Feel free to get creative — dance, 
show an emotion, look around, do nothing, or just be yourself!"
 

这会触发机器人自主选择动作——可能是舞蹈,也许是好奇的歪头——即使在停顿时也保持互动活跃。


部署选项

本地(推荐开发)

只需按照上面展示的方式运行即可。应用连接到你本地网络上的机器人守护进程。reachy-mini-conversation-app

Cloud Run(用于 Twilio 电话集成)

该应用还可以部署到 Google Cloud Run,并集成 Twilio 进行电话通话。这是一个更高级的设置——请查看仓库的部署文档了解详情:

  • 配置 Twilio 媒体流
  • 基于IAM的认证设置
  • 使用Google Secret管理器管理秘密

内置个性

仓库附带15个现成的配置文件,方便你入门:

简介 性格
default 友好、简洁的机器人助手,带有细腻的幽默感
mars_rover 一辆火星探测车
noir_detective 一位来自1940年代电影的硬汉侦探
victorian_butler 一位无可挑剔的正派英国管家
mad_scientist_assistant 一个兴奋的实验助理
bored_teenager ...你明白我的意思了
cosmic_kitchen 一位以太空为主题的烹饪节目主持人
hype_bot 对一切充满热情
captain_circuit 一个超级英雄机器人
chess_coach 一位耐心的国际象棋导师
nature_documentarian 大卫·阿滕伯勒的氛围
sorry_bro 为所有事情道歉
tedai 一位TED演讲嘉宾
time_traveler 来自未来的访问

试试看吧!每一个都能彻底改变机器人的行为和反应方式。


收尾

Reachy Mini Conversation 应用展示了结合实时语音 AI 与富有表现力的机器人技术的可能性。使它成功的关键设计决策:

  • 处理器抽象——默认使用 Gemini Live,OpenAI Realtime 作为可直接使用的替代方案
  • 后台工具调度——工具调用从不阻挡音频流
  • 分层运动系统——主动作+次要偏移+闲散呼吸=一个始终感觉有生命力的机器人
  • 纯文本配置文件——无需编写代码即可自定义个性

整个项目都是开源的,采用Apache 2.0版本。分叉它,赋予你的机器人个性,告诉我们你做了什么!

链接:

原创文章,作者:ROCKYCOO,如若转载,请注明出处:https://aiyixun.com/gemini-live-reachy-mini%ef%bc%9a%e6%89%93%e9%80%a0%e5%8f%af%e5%af%b9%e8%af%9d%e7%9a%84%e6%a1%8c%e9%9d%a2%e6%9c%ba%e5%99%a8%e4%ba%ba/

喜欢 (0)
ROCKYCOO的头像ROCKYCOO
上一篇 7小时前
下一篇 7小时前

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注