Commit ·
4e5c3ed
1
Parent(s): 07e9e3c
\"chore(release): version 0.1.5\"
Browse files- .claude/settings.local.json +7 -5
- PROJECT_PLAN.md +173 -175
- pyproject.toml +1 -1
- reachy_mini_ha_voice/__init__.py +1 -1
.claude/settings.local.json
CHANGED
|
@@ -7,18 +7,20 @@
|
|
| 7 |
"Edit",
|
| 8 |
"Bash(cd:*)",
|
| 9 |
"SlashCommand(/zcf:git-commit --emoji)",
|
| 10 |
-
"SlashCommand(/zcf:git-commit:*)"
|
|
|
|
|
|
|
| 11 |
],
|
| 12 |
"deny": [],
|
| 13 |
"ask": []
|
| 14 |
},
|
| 15 |
-
"model": "opus",
|
| 16 |
"hooks": {},
|
|
|
|
|
|
|
| 17 |
"statusLine": {
|
| 18 |
"type": "command",
|
| 19 |
"command": "%USERPROFILE%\\.claude\\ccline\\ccline.exe",
|
| 20 |
"padding": 0
|
| 21 |
},
|
| 22 |
-
"
|
| 23 |
-
|
| 24 |
-
}
|
|
|
|
| 7 |
"Edit",
|
| 8 |
"Bash(cd:*)",
|
| 9 |
"SlashCommand(/zcf:git-commit --emoji)",
|
| 10 |
+
"SlashCommand(/zcf:git-commit:*)",
|
| 11 |
+
"Bash(rm:*)",
|
| 12 |
+
"Bash(git:*)"
|
| 13 |
],
|
| 14 |
"deny": [],
|
| 15 |
"ask": []
|
| 16 |
},
|
|
|
|
| 17 |
"hooks": {},
|
| 18 |
+
"alwaysThinkingEnabled": true,
|
| 19 |
+
"outputStyle": "default",
|
| 20 |
"statusLine": {
|
| 21 |
"type": "command",
|
| 22 |
"command": "%USERPROFILE%\\.claude\\ccline\\ccline.exe",
|
| 23 |
"padding": 0
|
| 24 |
},
|
| 25 |
+
"model": "opus"
|
| 26 |
+
}
|
|
|
PROJECT_PLAN.md
CHANGED
|
@@ -321,31 +321,40 @@ dependencies = [
|
|
| 321 |
|
| 322 |
---
|
| 323 |
|
| 324 |
-
## 🚀 语音助手增强功能
|
| 325 |
|
| 326 |
-
|
| 327 |
|
| 328 |
-
|
| 329 |
|
| 330 |
-
**
|
|
|
|
|
|
|
|
|
|
|
|
|
| 331 |
|
| 332 |
-
**
|
| 333 |
-
-
|
| 334 |
-
-
|
| 335 |
-
-
|
| 336 |
-
|
| 337 |
-
|
| 338 |
-
|
| 339 |
-
|
| 340 |
-
|
| 341 |
-
|
| 342 |
-
|
| 343 |
-
|
| 344 |
-
|
|
| 345 |
-
|
|
| 346 |
-
|
|
| 347 |
-
|
|
| 348 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 349 |
|
| 350 |
**代码示例**:
|
| 351 |
```python
|
|
@@ -368,40 +377,21 @@ class EmotionMotionController:
|
|
| 368 |
self.reachy.play_move(self.dances.get("dance_1"), sound=True)
|
| 369 |
```
|
| 370 |
|
| 371 |
-
### Phase 14 - 智能声源追踪增强 (
|
| 372 |
|
| 373 |
**目标**: 利用 DOA (Direction of Arrival) 实现更自然的声源追踪和多人对话支持。
|
| 374 |
|
| 375 |
-
**当前实现**: 唤醒时转向声源
|
| 376 |
-
**增强
|
| 377 |
|
| 378 |
-
| 功能 | 说明 | SDK API |
|
| 379 |
-
|------|------|---------|
|
| 380 |
-
| 持续声源追踪 | 对话过程中持续跟踪说话人位置 | `media.get_DoA()` |
|
| 381 |
-
| 多人对话切换 | 检测到新说话人时平滑转向 | `goto_target(head=..., method=MIN_JERK)` |
|
| 382 |
-
| 声源可视化 | LED 指示当前声源方向 | `LED_DOA_COLOR` 参数 |
|
| 383 |
-
| 语音活动检测 | 只在检测到语音时追踪 | `DoAInfo.speech_detected` |
|
| 384 |
|
| 385 |
-
|
| 386 |
-
```python
|
| 387 |
-
async def continuous_doa_tracking(self):
|
| 388 |
-
"""持续追踪声源方向"""
|
| 389 |
-
while self.is_listening:
|
| 390 |
-
doa_result = self.reachy.media.get_DoA()
|
| 391 |
-
if doa_result and doa_result[1]: # speech_detected
|
| 392 |
-
angle_rad, _ = doa_result
|
| 393 |
-
# 平滑转向声源
|
| 394 |
-
yaw_deg = math.degrees(angle_rad - math.pi/2)
|
| 395 |
-
self.reachy.look_at_world(
|
| 396 |
-
x=math.cos(angle_rad),
|
| 397 |
-
y=math.sin(angle_rad),
|
| 398 |
-
z=0.3,
|
| 399 |
-
duration=0.3
|
| 400 |
-
)
|
| 401 |
-
await asyncio.sleep(0.1)
|
| 402 |
-
```
|
| 403 |
-
|
| 404 |
-
### Phase 15 - 卡通风格运动模式 (中优先级)
|
| 405 |
|
| 406 |
**目标**: 使用 SDK 的插值技术让机器人动作更有个性和表现力。
|
| 407 |
|
|
@@ -411,175 +401,183 @@ async def continuous_doa_tracking(self):
|
|
| 411 |
- `EASE_IN_OUT` - 缓入缓出,优雅
|
| 412 |
- `CARTOON` - 卡通风格,带回弹效果,活泼可爱
|
| 413 |
|
| 414 |
-
**
|
| 415 |
|
| 416 |
-
|
| 417 |
-
|------|---------|------|
|
| 418 |
-
| 唤醒点头 | `CARTOON` | 活泼的回弹效果 |
|
| 419 |
-
| 思考抬头 | `EASE_IN_OUT` | 优雅的过渡 |
|
| 420 |
-
| 说话时微动 | `MIN_JERK` | 自然流畅 |
|
| 421 |
-
| 错误摇头 | `CARTOON` | 夸张的否定 |
|
| 422 |
-
| 返回中立 | `MIN_JERK` | 平滑归位 |
|
| 423 |
|
| 424 |
-
|
| 425 |
-
|
| 426 |
-
|
| 427 |
-
|
| 428 |
-
|
| 429 |
-
|
| 430 |
-
|
| 431 |
-
self.reachy.goto_target(
|
| 432 |
-
head=nod_pose,
|
| 433 |
-
duration=0.4,
|
| 434 |
-
method=InterpolationTechnique.CARTOON
|
| 435 |
-
)
|
| 436 |
-
```
|
| 437 |
|
| 438 |
-
### Phase 16 - 说话时天线同步动画 (
|
| 439 |
|
| 440 |
**目标**: TTS 播放时,天线随音频节奏摆动,模拟"说话"效果。
|
| 441 |
|
| 442 |
-
**实现
|
| 443 |
-
```python
|
| 444 |
-
async def speech_antenna_sync(self, audio_data: np.ndarray):
|
| 445 |
-
"""根据音频能量驱动天线摆动"""
|
| 446 |
-
# 计算音频能量
|
| 447 |
-
energy = np.abs(audio_data).mean()
|
| 448 |
-
|
| 449 |
-
# 映射到天线角度 (±30度范围)
|
| 450 |
-
amplitude = min(energy * 100, 30)
|
| 451 |
-
|
| 452 |
-
# 左右天线交替摆动
|
| 453 |
-
left_angle = math.radians(amplitude)
|
| 454 |
-
right_angle = math.radians(-amplitude)
|
| 455 |
|
| 456 |
-
|
| 457 |
-
```
|
| 458 |
-
|
| 459 |
-
### Phase 17 - 视觉注视交互 (中优先级)
|
| 460 |
|
| 461 |
**目标**: 利用摄像头检测人脸,实现眼神交流。
|
| 462 |
|
| 463 |
**SDK 支持**:
|
| 464 |
- `look_at_image(u, v)` - 注视图像中的点
|
| 465 |
- `look_at_world(x, y, z)` - 注视世界坐标点
|
| 466 |
-
- `media.get_frame()` - 获取摄像头画面
|
| 467 |
|
| 468 |
-
**实现
|
| 469 |
|
| 470 |
-
| 功能 | 说明 |
|
| 471 |
-
|------|------|
|
| 472 |
-
| 人脸检测 | 使用 OpenCV/MediaPipe 检测人脸 |
|
| 473 |
-
| 眼神追踪 | 对话时注视说话人的脸 |
|
| 474 |
-
| 多人切换 | 检测到多人时,注视当前说话人 |
|
| 475 |
-
| 空闲扫视 | 空闲时随机环顾四周 |
|
| 476 |
|
| 477 |
-
|
| 478 |
-
```python
|
| 479 |
-
import cv2
|
| 480 |
|
| 481 |
-
|
| 482 |
-
"""人脸追踪循环"""
|
| 483 |
-
face_cascade = cv2.CascadeClassifier(
|
| 484 |
-
cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
|
| 485 |
-
)
|
| 486 |
|
| 487 |
-
|
| 488 |
-
frame = self.reachy.media.get_frame()
|
| 489 |
-
if frame is None:
|
| 490 |
-
continue
|
| 491 |
|
| 492 |
-
|
| 493 |
-
|
|
|
|
| 494 |
|
| 495 |
-
|
| 496 |
-
|
| 497 |
-
|
| 498 |
-
|
| 499 |
|
| 500 |
-
|
| 501 |
-
|
|
|
|
|
|
|
|
|
|
| 502 |
|
| 503 |
-
### Phase
|
| 504 |
|
| 505 |
-
**目标**:
|
| 506 |
|
| 507 |
-
**SDK 支持**:
|
|
|
|
|
|
|
| 508 |
|
| 509 |
-
**
|
| 510 |
-
- 用户说 "让我教你一个动作" → 进入重力补偿模式
|
| 511 |
-
- 用户手动移动头部 → 录制动作轨迹
|
| 512 |
-
- 用户说 "记住这个" → 保存动作
|
| 513 |
-
- 用户说 "做刚才的动作" → 播放录制的动作
|
| 514 |
|
| 515 |
-
|
| 516 |
-
|
| 517 |
-
|
| 518 |
-
|
| 519 |
-
|
| 520 |
-
|
| 521 |
|
| 522 |
-
|
| 523 |
-
await self.wait_for_command("记住这个")
|
| 524 |
|
| 525 |
-
|
| 526 |
-
self.reachy.enable_motors()
|
| 527 |
|
| 528 |
-
|
| 529 |
-
self.save_custom_move(recorded_data)
|
| 530 |
-
```
|
| 531 |
|
| 532 |
-
|
| 533 |
|
| 534 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 535 |
|
| 536 |
-
|
| 537 |
-
- `mini.imu["accelerometer"]` - 加速度计
|
| 538 |
-
- `mini.imu["gyroscope"]` - 陀螺仪
|
| 539 |
|
| 540 |
-
|
| 541 |
|
| 542 |
-
|
| 543 |
-
|---------|---------|
|
| 544 |
-
| 被拍打/敲击 | 播放惊讶动作 + 语音 "哎呀!" |
|
| 545 |
-
| 被摇晃 | 播放晕眩动作 + 语音 "别晃我~" |
|
| 546 |
-
| 倾斜/倒下 | 播放求助动作 + 语音 "我倒了,帮帮我" |
|
| 547 |
-
| 长时间静止 | 进入休眠动画 |
|
| 548 |
|
| 549 |
-
### Phase
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 550 |
|
| 551 |
-
|
|
|
|
|
|
|
| 552 |
|
| 553 |
-
|
| 554 |
|
| 555 |
-
|
| 556 |
-
|
| 557 |
-
|
| 558 |
-
| 晚安场景 | 播放睡眠动作 + "晚安~" |
|
| 559 |
-
| 有人回家 | 转向门口 + 挥手 + "欢迎回家!" |
|
| 560 |
-
| 门铃响起 | 转向门口 + 警觉动作 |
|
| 561 |
-
| 播放音乐 | 随音乐节奏摆动 |
|
| 562 |
|
| 563 |
-
|
|
|
|
|
|
|
|
|
|
| 564 |
|
| 565 |
-
##
|
|
|
|
|
|
|
|
|
|
| 566 |
|
| 567 |
-
|
| 568 |
-
- ✅ Phase 1-12: 基础 ESPHome 实体 (45+ 个)
|
| 569 |
|
| 570 |
-
##
|
| 571 |
-
|
| 572 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 573 |
|
| 574 |
-
|
| 575 |
-
- ⏳ **Phase 15**: 卡通风格运动模式 - 更有个性的动作
|
| 576 |
-
- ⏳ **Phase 16**: 说话时天线同步 - 模拟说话效果
|
| 577 |
-
- ⏳ **Phase 17**: 视觉注视交互 - 眼神交流
|
| 578 |
|
| 579 |
-
##
|
| 580 |
-
|
| 581 |
-
|
| 582 |
-
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 583 |
|
| 584 |
### SDK 数据结构参考
|
| 585 |
|
|
|
|
| 321 |
|
| 322 |
---
|
| 323 |
|
| 324 |
+
## 🚀 语音助手增强功能实现状态
|
| 325 |
|
| 326 |
+
### Phase 13 - 情感动作反馈系统 (部分实现) 🟡
|
| 327 |
|
| 328 |
+
**实现状态**: 基础架构已就绪,但仅支持手动触发,未与语音助手事件自动关联
|
| 329 |
|
| 330 |
+
**已实现功能**:
|
| 331 |
+
- ✅ Phase 8 Emotion Selector 实体 (`emotion`)
|
| 332 |
+
- ✅ 基础情感动作播放API (`_play_emotion`)
|
| 333 |
+
- ✅ 情感映射: Happy/Sad/Angry/Fear/Surprise/Disgust
|
| 334 |
+
- ✅ 与 HuggingFace 动作库集成 (`pollen-robotics/reachy-mini-emotions-library`)
|
| 335 |
|
| 336 |
+
**未实现功能**:
|
| 337 |
+
- ❌ 自动根据语音助手响应触发情感动作
|
| 338 |
+
- ❌ 意图识别与情感匹配
|
| 339 |
+
- ❌ 舞蹈动作库集成
|
| 340 |
+
- ❌ 上下文感知(如天气查询-晴天播放 happy,雨天播放 sad)
|
| 341 |
+
|
| 342 |
+
**代码位置**:
|
| 343 |
+
- `entity_registry.py:633-658` - Emotion Selector 实体
|
| 344 |
+
- `satellite.py:544-574` - `_play_emotion()` 方法
|
| 345 |
+
|
| 346 |
+
**原始规划** (未完全实现):
|
| 347 |
+
|
| 348 |
+
| 语音助手事件 | 触发动作 | SDK API | 实现状态 |
|
| 349 |
+
|-------------|---------|---------|---------|
|
| 350 |
+
| 唤醒词检测 | 播放 "greeting" 动作 | `play_move(moves.get("greeting"))` | ❌ 未实现 |
|
| 351 |
+
| 收到肯定回复 | 播放 "happy" / "nod" 动作 | `play_move(moves.get("happy"))` | ❌ 未实现 |
|
| 352 |
+
| 收到否定回复 | 播放 "sad" / "shake" 动作 | `play_move(moves.get("sad"))` | ❌ 未实现 |
|
| 353 |
+
| 播放音乐/娱乐 | 播放 "dance" 动作 | `play_move(moves.get("dance"))` | ❌ 未实现 |
|
| 354 |
+
| 定时器完成 | 播放 "alert" 动作 | `play_move(moves.get("surprised"))` | ❌ 未实现 |
|
| 355 |
+
| 错误/无法理解 | 播放 "confused" 动作 | `play_move(moves.get("confused"))` | ❌ 未实现 |
|
| 356 |
+
| 天气查询-晴天 | 播放 "happy" 动作 | 根据天气类型选择 | ❌ 未实现 |
|
| 357 |
+
| 天气查询-雨天 | 播放 "sad" 动作 | 根据天气类型选择 | ❌ 未实现 |
|
| 358 |
|
| 359 |
**代码示例**:
|
| 360 |
```python
|
|
|
|
| 377 |
self.reachy.play_move(self.dances.get("dance_1"), sound=True)
|
| 378 |
```
|
| 379 |
|
| 380 |
+
### Phase 14 - 智能声源追踪增强 (未实现) ❌
|
| 381 |
|
| 382 |
**目标**: 利用 DOA (Direction of Arrival) 实现更自然的声源追踪和多人对话支持。
|
| 383 |
|
| 384 |
+
**当前实现**: ✅ 唤醒时转向声源 (`motion.py:on_wakeup()`)
|
| 385 |
+
**未实现增强**:
|
| 386 |
|
| 387 |
+
| 功能 | 说明 | SDK API | 实现状态 |
|
| 388 |
+
|------|------|---------|---------|
|
| 389 |
+
| 持续声源追踪 | 对话过程中持续跟踪说话人位置 | `media.get_DoA()` | ❌ 未实现 |
|
| 390 |
+
| 多人对话切换 | 检测到新说话人时平滑转向 | `goto_target(head=..., method=MIN_JERK)` | ❌ 未实现 |
|
| 391 |
+
| 声源可视化 | LED 指示当前声源方向 | `LED_DOA_COLOR` 参数 | ❌ 未实现 |
|
| 392 |
+
| 语音活动检测 | 只在检测到语音时追踪 | `DoAInfo.speech_detected` | ✅ 已暴露为实体 |
|
| 393 |
|
| 394 |
+
### Phase 15 - 卡通风格运动模式 (未实现) ❌
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 395 |
|
| 396 |
**目标**: 使用 SDK 的插值技术让机器人动作更有个性和表现力。
|
| 397 |
|
|
|
|
| 401 |
- `EASE_IN_OUT` - 缓入缓出,优雅
|
| 402 |
- `CARTOON` - 卡通风格,带回弹效果,活泼可爱
|
| 403 |
|
| 404 |
+
**实现状态**: 当前使用默认 `MIN_JERK` 插值,未实现动态插值切换
|
| 405 |
|
| 406 |
+
**未实现场景**:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 407 |
|
| 408 |
+
| 场景 | 推荐插值 | 效果 | 实现状态 |
|
| 409 |
+
|------|---------|------|---------|
|
| 410 |
+
| 唤醒点头 | `CARTOON` | 活泼的回弹效果 | ❌ 未实现 |
|
| 411 |
+
| 思考抬头 | `EASE_IN_OUT` | 优雅的过渡 | ❌ 未实现 |
|
| 412 |
+
| 说话时微动 | `MIN_JERK` | 自然流畅 | ✅ 当前默认 |
|
| 413 |
+
| 错误摇头 | `CARTOON` | 夸张的否定 | ❌ 未实现 |
|
| 414 |
+
| 返回中立 | `MIN_JERK` | 平滑归位 | ✅ 当前默认 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 415 |
|
| 416 |
+
### Phase 16 - 说话时天线同步动画 (未实现) ❌
|
| 417 |
|
| 418 |
**目标**: TTS 播放时,天线随音频节奏摆动,模拟"说话"效果。
|
| 419 |
|
| 420 |
+
**实现状态**: ❌ 完全未实现
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 421 |
|
| 422 |
+
### Phase 17 - 视觉注视交互 (未实现) ❌
|
|
|
|
|
|
|
|
|
|
| 423 |
|
| 424 |
**目标**: 利用摄像头检测人脸,实现眼神交流。
|
| 425 |
|
| 426 |
**SDK 支持**:
|
| 427 |
- `look_at_image(u, v)` - 注视图像中的点
|
| 428 |
- `look_at_world(x, y, z)` - 注视世界坐标点
|
| 429 |
+
- `media.get_frame()` - 获取摄像头画面 (✅ 已在 `camera_server.py:146` 实现)
|
| 430 |
|
| 431 |
+
**未实现功能**:
|
| 432 |
|
| 433 |
+
| 功能 | 说明 | 实现状态 |
|
| 434 |
+
|------|------|---------|
|
| 435 |
+
| 人脸检测 | 使用 OpenCV/MediaPipe 检测人脸 | ❌ 未实现 |
|
| 436 |
+
| 眼神追踪 | 对话时注视说话人的脸 | ❌ 未实现 |
|
| 437 |
+
| 多人切换 | 检测到多人时,注视当前说话人 | ❌ 未实现 |
|
| 438 |
+
| 空闲扫视 | 空闲时随机环顾四周 | ❌ 未实现 |
|
| 439 |
|
| 440 |
+
### Phase 18 - 重力补偿互动模式 (部分实现) 🟡
|
|
|
|
|
|
|
| 441 |
|
| 442 |
+
**目标**: 允许用户物理触摸和引导机器人头部,实现"教学"式交互。
|
|
|
|
|
|
|
|
|
|
|
|
|
| 443 |
|
| 444 |
+
**SDK 支持**: `enable_gravity_compensation()` - 电机进入重力补偿模式,可手动移动
|
|
|
|
|
|
|
|
|
|
| 445 |
|
| 446 |
+
**已实现功能**:
|
| 447 |
+
- ✅ 重力补偿模式切换 (`motor_mode` Select 实体,选项 "gravity_compensation")
|
| 448 |
+
- ✅ `reachy_controller.py:236-237` - 重力补偿 API 调用
|
| 449 |
|
| 450 |
+
**未实现功能**:
|
| 451 |
+
- ❌ 教学模式 - 录制动作轨迹
|
| 452 |
+
- ❌ 保存/播放自定义动作
|
| 453 |
+
- ❌ 语音命令触发教学流程
|
| 454 |
|
| 455 |
+
**应用场景**:
|
| 456 |
+
- ❌ 用户说 "让我教你一个动作" → 进入重力补偿���式
|
| 457 |
+
- ❌ 用户手动移动头部 → 录制动作轨迹
|
| 458 |
+
- ❌ 用户说 "记住这个" → 保存动作
|
| 459 |
+
- ❌ 用户说 "做刚才的动作" → 播放录制的动作
|
| 460 |
|
| 461 |
+
### Phase 19 - 环境感知响应 (未实现) ❌
|
| 462 |
|
| 463 |
+
**目标**: 利用 IMU 传感器感知环境变化并做出响应。
|
| 464 |
|
| 465 |
+
**SDK 支持**:
|
| 466 |
+
- ✅ `mini.imu["accelerometer"]` - 加速度计 (Phase 7 已实现为实体)
|
| 467 |
+
- ✅ `mini.imu["gyroscope"]` - 陀螺仪 (Phase 7 已实现为实体)
|
| 468 |
|
| 469 |
+
**未实现功能**:
|
|
|
|
|
|
|
|
|
|
|
|
|
| 470 |
|
| 471 |
+
| 检测事件 | 响应动作 | 实现状态 |
|
| 472 |
+
|---------|---------|---------|
|
| 473 |
+
| 被拍打/敲击 | 播放惊讶动作 + 语音 "哎呀!" | ❌ 未实现 |
|
| 474 |
+
| 被摇晃 | 播放晕眩动作 + 语音 "别晃我~" | ❌ 未实现 |
|
| 475 |
+
| 倾斜/倒下 | 播放求助动作 + 语音 "我倒了,帮帮我" | ❌ 未实现 |
|
| 476 |
+
| 长时间静止 | 进入休眠动画 | ❌ 未实现 |
|
| 477 |
|
| 478 |
+
### Phase 20 - Home Assistant 场景联动 (未实现) ❌
|
|
|
|
| 479 |
|
| 480 |
+
**目标**: 根据 Home Assistant 的场景/自动化触发机器人动作。
|
|
|
|
| 481 |
|
| 482 |
+
**实现方案**: 通过 ESPHome 服务调用
|
|
|
|
|
|
|
| 483 |
|
| 484 |
+
**未实现场景**:
|
| 485 |
|
| 486 |
+
| HA 场景 | 机器人响应 | 实现状态 |
|
| 487 |
+
|--------|-----------|---------|
|
| 488 |
+
| 早安场景 | 播放唤醒动作 + "早上好!" | ❌ 未实现 |
|
| 489 |
+
| 晚安场景 | 播放睡眠动作 + "晚安~" | ❌ 未实现 |
|
| 490 |
+
| 有人回家 | 转向门口 + 挥手 + "欢迎回家!" | ❌ 未实现 |
|
| 491 |
+
| 门铃响起 | 转向门口 + 警觉动作 | ❌ 未实现 |
|
| 492 |
+
| 播放音乐 | 随音乐节奏摆动 | ❌ 未实现 |
|
| 493 |
|
| 494 |
+
---
|
|
|
|
|
|
|
| 495 |
|
| 496 |
+
## 📊 功能实现总结
|
| 497 |
|
| 498 |
+
### ✅ 已完成功能
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 499 |
|
| 500 |
+
#### 核心语音助手 (Phase 1-12)
|
| 501 |
+
- **45+ ESPHome 实体** - 全部实现
|
| 502 |
+
- **基础语音交互** - 唤醒词检测、STT/TTS 集成
|
| 503 |
+
- **运动反馈** - 点头、摇头、注视等基础动作
|
| 504 |
+
- **音频处理** - AGC、噪声抑制、回声消除
|
| 505 |
+
- **摄像头流** - MJPEG 实时预览
|
| 506 |
|
| 507 |
+
#### 部分实现功能 (Phase 13-20)
|
| 508 |
+
- **Phase 13** - 情感动作 API 基础设施 (手动触发可用)
|
| 509 |
+
- **Phase 18** - 重力补偿模式切换 (教学流程未实现)
|
| 510 |
|
| 511 |
+
### ❌ 未实现功能
|
| 512 |
|
| 513 |
+
#### 高优先级
|
| 514 |
+
- **Phase 13** - 自动情感动作反馈 (需与语音助手事件关联)
|
| 515 |
+
- **Phase 14** - 持续声源追踪 (仅唤醒时转向)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 516 |
|
| 517 |
+
#### 中优先级
|
| 518 |
+
- **Phase 15** - 卡通风格运动模式 (需动态插值切换)
|
| 519 |
+
- **Phase 16** - 天线同步动画
|
| 520 |
+
- **Phase 17** - 人脸追踪与眼神交互
|
| 521 |
|
| 522 |
+
#### 低优先级
|
| 523 |
+
- **Phase 18** - 教学模式录制/播放功能
|
| 524 |
+
- **Phase 19** - IMU 环境感知响应
|
| 525 |
+
- **Phase 20** - Home Assistant 场景联动
|
| 526 |
|
| 527 |
+
---
|
|
|
|
| 528 |
|
| 529 |
+
## 功能优先级总结 (更新版)
|
| 530 |
+
|
| 531 |
+
### 高优先级 (已完成 ✅)
|
| 532 |
+
- ✅ **Phase 1-12**: 基础 ESPHome 实体 (45+ 个)
|
| 533 |
+
- ✅ 核心语音���手功能
|
| 534 |
+
- ✅ 基础运动反馈 (点头、摇头、注视)
|
| 535 |
+
|
| 536 |
+
### 高优先级 (部分实现 🟡)
|
| 537 |
+
- 🟡 **Phase 13**: 情感动作反馈系统
|
| 538 |
+
- ✅ Emotion Selector 实体与 API 基础设施
|
| 539 |
+
- ❌ 自动根据语音助手响应触发情感动作
|
| 540 |
+
- ❌ 意图识别与情感匹配
|
| 541 |
+
- ❌ 舞蹈动作库集成
|
| 542 |
+
|
| 543 |
+
### 高优先级 (未实现 ❌)
|
| 544 |
+
- ❌ **Phase 14**: 智能声源追踪增强
|
| 545 |
+
- ✅ 唤醒时转向声源
|
| 546 |
+
- ❌ 持续声源追踪
|
| 547 |
+
- ❌ 多人对话切换
|
| 548 |
+
- ❌ 声源可视化
|
| 549 |
+
|
| 550 |
+
### 中优先级 (未实现 ❌)
|
| 551 |
+
- ❌ **Phase 15**: 卡通风格运动模式 - 更有个性的动作
|
| 552 |
+
- ❌ **Phase 16**: 说话时天线同步 - 模拟说话效果
|
| 553 |
+
- ❌ **Phase 17**: 视觉注视交互 - 眼神交流
|
| 554 |
+
|
| 555 |
+
### 低优先级 (部分实现 🟡)
|
| 556 |
+
- 🟡 **Phase 18**: 重力补偿互动模式
|
| 557 |
+
- ✅ 重力补偿模式切换
|
| 558 |
+
- ❌ 教学式交互 (录制/播放功能)
|
| 559 |
+
|
| 560 |
+
### 低优先级 (未实现 ❌)
|
| 561 |
+
- ❌ **Phase 19**: 环境感知响应 - IMU 触发动作
|
| 562 |
+
- ❌ **Phase 20**: Home Assistant 场景联动 - 智能家居整合
|
| 563 |
|
| 564 |
+
---
|
|
|
|
|
|
|
|
|
|
| 565 |
|
| 566 |
+
## 📈 完成度统计
|
| 567 |
+
|
| 568 |
+
| 阶段 | 状态 | 完成度 | 说明 |
|
| 569 |
+
|------|------|--------|------|
|
| 570 |
+
| Phase 1-12 | ✅ 完成 | 100% | 45+ ESPHome 实体全部实现 |
|
| 571 |
+
| Phase 13 | 🟡 部分完成 | 30% | API 基础设施就绪,缺自动触发 |
|
| 572 |
+
| Phase 14 | ❌ 未完成 | 20% | 仅实现唤醒时转向 |
|
| 573 |
+
| Phase 15 | ❌ 未完成 | 0% | 未实现动态插值切换 |
|
| 574 |
+
| Phase 16 | ❌ 未完成 | 0% | 完全未实现 |
|
| 575 |
+
| Phase 17 | ❌ 未完成 | 10% | 摄像头已实现,缺人脸检测 |
|
| 576 |
+
| Phase 18 | 🟡 部分完成 | 40% | 模式切换已实现,缺教学流程 |
|
| 577 |
+
| Phase 19 | ❌ 未完成 | 10% | IMU 数据已暴露,缺触发逻辑 |
|
| 578 |
+
| Phase 20 | ❌ 未完成 | 0% | 完全未实现 |
|
| 579 |
+
|
| 580 |
+
**总体完成度**: **Phase 1-12: 100%** | **Phase 13-20: ~15%**
|
| 581 |
|
| 582 |
### SDK 数据结构参考
|
| 583 |
|
pyproject.toml
CHANGED
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
| 4 |
|
| 5 |
[project]
|
| 6 |
name = "reachy_mini_ha_voice"
|
| 7 |
-
version = "0.1.
|
| 8 |
description = "Home Assistant Voice Assistant for Reachy Mini"
|
| 9 |
readme = "README.md"
|
| 10 |
requires-python = ">=3.10"
|
|
|
|
| 4 |
|
| 5 |
[project]
|
| 6 |
name = "reachy_mini_ha_voice"
|
| 7 |
+
version = "0.1.5"
|
| 8 |
description = "Home Assistant Voice Assistant for Reachy Mini"
|
| 9 |
readme = "README.md"
|
| 10 |
requires-python = ">=3.10"
|
reachy_mini_ha_voice/__init__.py
CHANGED
|
@@ -11,7 +11,7 @@ Key features:
|
|
| 11 |
- Reachy Mini motion control integration
|
| 12 |
"""
|
| 13 |
|
| 14 |
-
__version__ = "0.1.
|
| 15 |
__author__ = "Desmond Dong"
|
| 16 |
|
| 17 |
# Don't import main module here to avoid runpy warning
|
|
|
|
| 11 |
- Reachy Mini motion control integration
|
| 12 |
"""
|
| 13 |
|
| 14 |
+
__version__ = "0.1.5"
|
| 15 |
__author__ = "Desmond Dong"
|
| 16 |
|
| 17 |
# Don't import main module here to avoid runpy warning
|