RIRROM 是一套面向线下路演与陪伴场景的双设备数字生命系统:家庭端使用 CM4 魔镜,便携端使用微雪 T5AI 1.75 英寸圆屏。两台设备共享同一条实时语音 网关和交互协议,但保留各自适合屏幕与算力的视觉表现。
| CM4 魔镜 | 便携式小圆屏 |
|---|---|
![]() |
![]() |
kaleidoscope-edge-glow |
orb-states-emotions 三态裁切版 |
| 模块 | CM4 魔镜 | 便携式 T5AI |
|---|---|---|
| 语音状态 | 待机、倾听、说话 | 待机、倾听、说话 |
| 视觉情绪 | 中性、开心、惊讶、难过、生气 | 不启用情绪识别 |
| 语音输入 | 浏览器 WebAudio,24 kHz PCM16 | 板载麦克风,16 kHz PCM16 |
| 语音输出 | AudioWorklet 环形缓冲 | 板载扬声器播放队列 |
| 视觉推理 | 本地 FaceAPI,不上传摄像头画面 | 无 |
| 运行平台 | Raspberry Pi CM4 + Chromium kiosk | TuyaOpen / T5AI |
交互状态采用“语音为主、视觉情绪叠加”的原则:
- 网关先同步待机、倾听、说话状态,决定动画的运动节奏。
- 只有 CM4 在本地识别人脸表情,情绪仅改变颜色、亮度和粒子质感,不覆盖 当前语音状态。
- 小圆屏只消费语音状态,避免额外推理占用嵌入式资源。
flowchart LR
M["CM4 魔镜<br/>麦克风 + 摄像头 + Chromium"] -->|PCM / 控制事件| G
P["T5AI 小圆屏<br/>麦克风 + LVGL"] -->|PCM / 控制事件| G
G["Companion Voice Gateway<br/>WebSocket / VAD / 会话状态"] --> Q["Qwen Realtime<br/>ASR + LLM + TTS"]
Q --> G
G -->|回复音频 + 状态| M
G -->|回复音频 + 状态| P
C["CM4 本地 FaceAPI<br/>五种表情"] -->|情绪叠加| M
设备与网关使用 companion-audio/2 协议。音频和状态事件的详细定义见
语音协议与
统一设备架构。
RIRROM/
├── apps/cm4-mirror/ # 魔镜网页、视觉识别和 CM4 部署脚本
├── firmware/portable-t5ai/ # 小圆屏完整 TuyaOpen 固件源码
├── services/voice-gateway/ # 队友语音链路及双设备接入补丁
├── docs/ # 架构、协议、部署和验收文档
├── releases/portable-t5ai/ # 已验收的可刷写固件
└── scripts/ # 从仓库根目录运行的快捷脚本
要求 Python 3.11+。第一次运行会在网关目录创建独立虚拟环境。
cd RIRROM
export COMPANION_PROVIDER=mock
export COMPANION_HOST=0.0.0.0
export COMPANION_PORT=8766
./scripts/run-gateway.shmock 只用于验证设备连接。接入千问时,把密钥放在本机环境变量或权限为
600 的部署配置中,不要写进代码:
export COMPANION_PROVIDER=qwen
export DASHSCOPE_API_KEY='你的 Key'
export QWEN_WORKSPACE_ID='ws-你的 Workspace ID'
export COMPANION_DEVICE_TOKEN='每台设备独立的 Token'
./scripts/run-gateway.sh先把
apps/cm4-mirror/web/mirror/runtime-config.js
中的网关地址改成当前电脑地址,然后运行:
./scripts/preview-cm4.shChrome 打开:
http://127.0.0.1:8080/mirror/?kiosk=1
页面需要麦克风和摄像头权限。增加 &emotion=0 可临时关闭视觉情绪识别,
但不会影响语音三态。
./apps/cm4-mirror/deploy-to-cm4.sh pi@rirrom-mirror.local \
'http://127.0.0.1:8080/mirror/?kiosk=1'部署和音量操作见 CM4 使用说明。
cd firmware/portable-t5ai
cp include/companion_config_secrets.h.example \
include/companion_config_secrets.h
# 填入网关 URI、设备 ID 和设备 Token
source /path/to/TuyaOpenSDK/export.sh
tos.py config choice
tos.py build
tos.py flash -p /dev/cu.usbmodemXXXX选择开发板 WAVESHARE_T5AI_TOUCH_AMOLED_1_75。也可以直接使用
releases/portable-t5ai/1.2.3中的稳定固件。
| 网关状态 | CM4 动画 | 小圆屏动画 |
|---|---|---|
idle |
待机、低能量呼吸 | orb_idle |
listening / user_speaking / thinking |
倾听、聚拢与响应 | orb_listen |
assistant_speaking |
说话、随音频增强 | orb_speak |
CM4 的五种视觉情绪独立映射为:
| 识别结果 | 视觉情绪 |
|---|---|
neutral |
中性 |
happy |
开心 |
surprised |
惊讶 |
sad |
难过 |
angry / disgusted |
生气 |
语音网关以队友仓库
b1ght18/AdventureX-RORRIM
的 origin/main@cd3725751eee33c7d537fc670bad0b92a242383b 为基线,并包含:
- 双设备 Token 鉴权与 Toooony/T5AI 生命周期兼容;
- CM4 路演网络下的连接参数;
- 重复
response.create防护; - 补齐上游测试已引用但漏提交的视觉软状态与提示词上下文;
- 当前魔镜 AudioWorklet 播放缓冲。
详细归属见 NOTICE。本仓库目前没有另行授予开源许可证,默认仅供 项目团队协作和演示使用。
- 千问 Realtime 若单次响应长时间不结束,服务端可能在约 300 秒后关闭连接。 当前客户端会自动重连,但极端情况下会增加下一轮首音频延迟。
- CM4 同时运行高帧率视觉和音频时需要可靠散热;路演环境建议使用主动风扇, 不通过降低视觉推理频率来换取稳定性。
- 原始音频默认不落盘。启用诊断录音前必须取得现场参与者同意,并在验收后清理。

