跳到主要内容
返回开发者精选

YRobot:让 Reachy Mini 拥有全双工视听对话

作者:thomas-yanxin模型:MiniCPM-o 4.5

让 Reachy Mini 边听边看边说,可随时打断

YRobot 给 Reachy Mini Wireless 加上了全双工、全模态的对话能力,背后由 MiniCPM-o 4.5 实时 API(文档)驱动。

机器人能同时听、看、说、动。你随时可以打断它:一旦本地确认插话开始,它会立刻硬停被打断的那一轮回复。它还会转向说话的人,说话时呼吸、转动视线、摆动天线。

Plain Text
you ─── voice ─► tuned XVF3800 AEC ─► 20 ms VAD/control ─► 1 s model units ──┐
camera ─► continuous scene-aware latest-only JPEG worker ───────────────┤
▼
wss://…/v1/realtime?mode={audio|video}
│
◄── lifelike motion ◄─ 50 Hz choreographer ◄─ DoA compass │
◄── speech ◄─ epoch-tagged speaker ◄─ 24 kHz audio deltas ◄─────────┘

为什么它反应这么快​

下面每一条在源码里都有对应的实现和设计理由,这里只做个索引。

问题机制位置
回复延迟麦克风 / VAD 从不等着摄像头编码或 WebSocket 发送。音频进有界实时队列,视频只留最新帧。MiniCPM-o 流用它原生的完整 1 秒推理单元,自适应 0.25–0.8 s 播放预缓冲用来吃掉服务端抖动main.py、audio.py
插话打断(Barge-in)客户端主导,而且是破坏性的:清楚的近端语音走 140 ms 的高置信快速路径;拿不准的双讲走 500 ms 的保守路径。一旦确认,播放 epoch 前进,调用 SDK 的 clear_player(),被打断的音频不会再播。之后的完整 1 秒输入会带上 force_listen,直到模型回到倾听状态barge.py、turn.py、main.py
自身回声 / 电机噪声导致误触发每个候选都会跟最近真正送给扬声器的 PCM 精确比对。回声相似度、无法解释的能量,再加一个廉价的语音形状检查,三者一起把关快速路径;撞到头部的情况和不确定的残差必须走安全路径。40 ms 的间隙容忍,是为了对付 XVF 的双讲抑制barge.py、audio.py
动作僵硬由一个 50 Hz 线程独占姿态控制。呼吸和姿态交叉淡入淡出;注视和空闲扫视走限速的二阶轨迹。更慢的身体偏航弹簧跟随持续的头部物理朝向(含守护进程侧的人脸跟踪),小幅头部动作仍然独立motion.py
声源定位(DoA)失灵只有本地确认是用户语音时才采样,配合守护进程给的头部物理姿态做变换,用 XVF 语音标志给置信度加权,再做圆周平均并设死区motion.py、main.py
画面中断 / 上下文腐化不管哪一方在说话,摄像头都在采集,Gateway 轮换时也不停。对话中以 1 fps 发画面;空闲时只在场景变化时发,外加 3 s 心跳,始终只留最新帧。视频会话在 300 s 上限之前、在安静的边界处轮换,并带上有限的助手侧连续性提示;采集、发送和真正交接之间的空隙都会被记录下来vision.py、session.py、main.py
声音千篇一律 / 行为被动可选的 LLM 和 TTS 参考 WAV 走文档里的 session.init.voice 字段。视频模式另外加了克制的主动观察策略;两项都得用环境变量显式打开config.py、realtime.py

一段话讲清协议​

语音模式连 wss://HOST/v1/realtime?mode=audio,需要摄像头输入时用 mode=video。等到 session.queue_done 之后发 session.init,系统提示词必须以训练时那一句 You are a helpful assistant. 开头,自己自由发挥的人设会让模型偏离它的双工分布。再等约 14 s 收到 session.created,随后持续发完整的 input.append 推理单元:正好 16,000 个 base64 编码的 float32 16 kHz 单声道采样(也就是 1 秒)、一个唯一的 input_id、可选的 force_listen,以及只在视频模式下才有的 base64 JPEG video_frames。服务端以流式返回 response.output.delta 事件,kind 取 listen、text 或 audio(音频是 24 kHz float32)。只有 listen 是一句话的边界,文本和音频是两条独立的流。Gateway 回显 input_id 时,YRobot 靠它保证强本地因果;公开协议并不要求回显,所以还留了一个受保护的兜底:没带标记的 listen,只有在最近一个强制包确实已经发出、之后又没出现新语音时才会被接受。细节在 realtime.py 和 turn.py。

运行​

在机器人上跑(CM4 上的 Python 3.12 venv),或者在任何能访问守护进程的机器上:

Bash
pip install -e .
cp .env.example .env # optional; the default already uses the official public Gateway
yrobot

默认走官方公共 Gateway wss://minicpmo45.modelbest.cn/v1/realtime?mode=video,持续发画面,本地不用部署模型 Host。纯语音模式是显式的回退选项:用 mode=audio,设 YROBOT_SEND_VIDEO=0,主动视觉会自动关掉。可选的参考音色和调优变量见 .env.example。

YRobot 也注册成了 Reachy Mini 应用(reachy_mini_apps 入口叫 yrobot),可以在 Dashboard 里启动和停止。应用跑起来后,点设置图标能改 Gateway、TLS 校验、连续视频、主动观察,以及一句话人设。Dashboard 里的配置存在 ~/.config/yrobot/settings.json;守护进程或进程环境变量的优先级更高,保存的修改要重启 YRobot 才生效。

没有硬件也能开发:

Bash
pip install -e ".[dev]"
pytest && ruff check .

上架 Reachy Mini 应用商店之前,还得跑:

Bash
reachy-mini-app-assistant check .

自动化检查替代不了 plan.md 里针对 Wireless 硬件的验收关卡。

隐私​

YRobot 会把麦克风和摄像头输入送到设备外处理:

  • 应用运行期间,16 kHz 麦克风音频会流式发到所配置的 MiniCPM-o 实时 Gateway。
  • 视频模式下还会发 JPEG 摄像头画面,对话中约 1 fps,另有场景变化时的推送和有限的空闲心跳。在设置页选纯音频模式就能关掉摄像头传输。
  • YRobot 不会把麦克风录音或摄像头画面写进本地存储。远端的处理、留存和访问,由你所选 Gateway 的运营方负责。

要在别人身边跑这个应用,先读一遍上面这段,再按所在地的要求拿到必要的同意。

代码结构​

Plain Text
yrobot/config.py env → one frozen Settings dataclass; URL normalization
yrobot/app_config.py dashboard settings API + atomic per-user persistence
yrobot/realtime.py gateway protocol client + <think>-leak filter
yrobot/turn.py barge-in state machine (pure logic, fully unit-tested)
yrobot/audio.py mic framing, VAD stack, 24→16 k resampler, epoch speaker
yrobot/barge.py echo-aware fast/safe acoustic barge-in qualification
yrobot/vision.py continuous scene-aware, latest-only camera worker
yrobot/session.py quiet-boundary rotation + bounded continuity memory
yrobot/motion.py DoA sound compass + 50 Hz choreographer
yrobot/main.py wiring, session rotation, ReachyMiniApp + CLI
yrobot/static/ Reachy Mini dashboard settings interface

每个模块的 docstring 都写清了它扛着的那些不明显的约束:实测过的 Gateway 行为、SDK 线程规则、XVF3800 的特性。想改某个数值,先读它上头的 docstring。

相关链接​

项目作者:thomas-yanxin,以 Apache-2.0 协议开源。

项目信息

基于模型
MiniCPM-o 4.5
作者
thomas-yanxin