想象一下,一个小型桌面机器人,它会听你说话,实时回应,听指令跳舞,追踪你的脸,偶尔讲点爸爸笑话——这一切都由Gemini Live API驱动。
这正是Reachy迷你对话应用所做的。它是一款开源的Python应用,将Pollen Robotics的Reachy Mini连接到实时语音LLM,使机器人能够进行全双工音频对话,同时通过头部运动、天线摆动、舞蹈和情感表达自我。
在这个教程中,你将学到:
- 架构如何运作——从麦克风到电机。
- 如何在自己的电脑上设置。
- 如何在不使用任何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
└── ...
塑造你自己的个性
- 在以下创建一个文件夹:
profiles/
mkdir profiles/pirate_captain
- 写一个:
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".
- 列出机器人可以使用的工具:
tools.txt
dance
play_emotion
move_head
camera
head_tracking
- 激活它:
# 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/