一个面向视障人士的智能导航与辅助系统,集成了盲道导航、过马路辅助、物品识别、实时语音交互等功能。 本项目仅为交流学习使用,请勿直接给视障人群使用。本项目内仅包含代码,模型地址:https://www.modelscope.cn/models/archifancy/AIGlasses_for_navigation 。下载后存放在/model 文件夹
功能特性 • 快速开始 • 系统架构 • 使用说明 • 开发文档
存储: 10GB 可用空间
客户端设备(可选):
git clone https://github.com/yourusername/aiglass.git
cd aiglass/rebuild1002
python -m venv venv
# Windows
venv\Scripts\activate
# Linux/macOS
source venv/bin/activate
pip install -r requirements.txt
将以下模型文件放入 model/ 目录:
| 模型文件 | 用途 | 大小 | 下载链接 |
|---|---|---|---|
yolo-seg.pt |
盲道分割 | ~50MB | [待补充] |
yoloe-11l-seg.pt |
开放词汇检测 | ~80MB | [待补充] |
shoppingbest5.pt |
物品识别 | ~30MB | [待补充] |
trafficlight.pt |
红绿灯检测 | ~20MB | [待补充] |
hand_landmarker.task |
手部检测 | ~15MB | MediaPipe Models |
创建 .env 文件:
# .env
DASHSCOPE_API_KEY=your_api_key_here
或在代码中直接修改(不推荐):
# app_main.py, line 50
API_KEY = "your_api_key_here"
python app_main.py
系统将在 http://0.0.0.0:8081 启动,打开浏览器访问即可看到实时监控界面。
如果使用 ESP32-CAM,请:
1. 烧录 compile/compile.ino 到 ESP32
2. 修改 WiFi 配置,连接到同一网络
3. ESP32 自动连接到 WebSocket 端点
┌─────────────────────────────────────────────────────────────┐
│ 客户端层 │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ ESP32-CAM │ │ 浏览器 │ │ 移动端 │ │
│ │ (视频/音频) │ │ (监控界面) │ │ (语音控制) │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
└─────────┼──────────────────┼──────────────────┼─────────────┘
│ WebSocket │ HTTP/WS │ WebSocket
┌─────────┼──────────────────┼──────────────────┼─────────────┐
│ │ │ │ │
│ ┌────▼──────────────────▼──────────────────▼────────┐ │
│ │ FastAPI 主服务 (app_main.py) │ │
│ │ - WebSocket 路由管理 │ │
│ │ - 音视频流分发 │ │
│ │ - 状态管理与协调 │ │
│ └────┬────────────────┬────────────────┬─────────────┘ │
│ │ │ │ │
│ ┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐ │
│ │ ASR 模块 │ │ Omni 对话 │ │ 音频播放 │ │
│ │ (asr_core) │ │(omni_client)│ │(audio_player)│ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ 应用层 │
└───────────────────────────────────────────────────────────────┘
│ │ │
┌─────────▼──────────────────▼──────────────────▼──────────────┐
│ 导航统领层 │
│ ┌─────────────────────────────────────────────────┐ │
│ │ NavigationMaster (navigation_master.py) │ │
│ │ - 状态机:IDLE/CHAT/BLINDPATH_NAV/ │ │
│ │ CROSSING/TRAFFIC_LIGHT/ITEM_SEARCH │ │
│ │ - 模式切换与协调 │ │
│ └───┬─────────────────────┬───────────────────┬───┘ │
│ │ │ │ │
│ ┌────▼────────┐ ┌────────▼────────┐ ┌─────▼──────┐ │
│ │ 盲道导航 │ │ 过马路导航 │ │ 物品查找 │ │
│ │(blindpath) │ │ (crossstreet) │ │(yolomedia) │ │
│ └──────────────┘ └──────────────────┘ └─────────────┘ │
└───────────────────────────────────────────────────────────────┘
│ │ │
┌─────────▼──────────────────▼──────────────────▼──────────────┐
│ 模型推理层 │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ YOLO 分割 │ │ YOLO-E 检测 │ │ MediaPipe │ │
│ │ (盲道/斑马线) │ │ (开放词汇) │ │ (手部检测) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ 红绿灯检测 │ │ 光流稳定 │ │
│ │(HSV+YOLO) │ │(Lucas-Kanade)│ │
│ └──────────────┘ └──────────────┘ │
└───────────────────────────────────────────────────────────────┘
│
┌─────────▼─────────────────────────────────────────────────────┐
│ 外部服务层 │
│ ┌──────────────────────────────────────────────┐ │
│ │ 阿里云 DashScope API │ │
│ │ - Paraformer ASR (实时语音识别) │ │
│ │ - Qwen-Omni-Turbo (多模态对话) │ │
│ │ - Qwen-Turbo (标签提取) │ │
│ └──────────────────────────────────────────────┘ │
└───────────────────────────────────────────────────────────────┘
| 模块 | 文件 | 功能 |
|---|---|---|
| 主应用 | app_main.py |
FastAPI 服务、WebSocket 管理、状态协调 |
| 导航统领 | navigation_master.py |
状态机管理、模式切换、语音节流 |
| 盲道导航 | workflow_blindpath.py |
盲道检测、避障、转弯引导 |
| 过马路导航 | workflow_crossstreet.py |
斑马线检测、红绿灯识别、对齐引导 |
| 物品查找 | yolomedia.py |
物品检测、手部引导、抓取确认 |
| 语音识别 | asr_core.py |
实时 ASR、VAD、指令解析 |
| 语音合成 | omni_client.py |
Qwen-Omni 流式语音生成 |
| 音频播放 | audio_player.py |
多路混音、TTS 播放、音量控制 |
| 视频录制 | sync_recorder.py |
音视频同步录制 |
| 桥接 IO | bridge_io.py |
线程安全的帧缓冲与分发 |
系统支持以下语音指令(说话时无需唤醒词):
"开始导航" / "盲道导航" → 启动盲道导航
"停止导航" / "结束导航" → 停止盲道导航
"开始过马路" / "帮我过马路" → 启动过马路模式
"过马路结束" / "结束过马路" → 停止过马路模式
"检测红绿灯" / "看红绿灯" → 启动红绿灯检测
"停止检测" / "停止红绿灯" → 停止检测
"帮我找一下 [物品名]" → 启动物品搜索
示例:
- "帮我找一下红牛"
- "找一下AD钙奶"
- "帮我找矿泉水"
"找到了" / "拿到了" → 确认找到物品
"帮我看看这是什么" → 拍照识别
"这个东西能吃吗" → 物品咨询
任何其他问题 → AI 对话
系统包含以下主要状态(自动切换):
显示原始视频流
CHAT - 对话模式
暂停导航功能
BLINDPATH_NAV - 盲道导航
AVOIDING_OBSTACLE: 避障
CROSSING - 过马路模式
SEEKING_NEXT_BLINDPATH: 寻找对面盲道
ITEM_SEARCH - 物品查找
确认抓取
TRAFFIC_LIGHT_DETECTION - 红绿灯检测
打开浏览器访问 http://localhost:8081,可以看到:
| 端点 | 用途 | 数据格式 |
|---|---|---|
/ws/camera |
ESP32 相机推流 | Binary (JPEG) |
/ws/viewer |
浏览器订阅视频 | Binary (JPEG) |
/ws_audio |
ESP32 音频上传 | Binary (PCM16) |
/ws_ui |
UI 状态推送 | JSON |
/ws |
IMU 数据接收 | JSON |
/stream.wav |
音频下载流 | Binary (WAV) |
创建 .env 文件配置以下参数:
# 阿里云 API
DASHSCOPE_API_KEY=sk-xxxxx
# 模型路径(可选,使用默认路径可不配置)
BLIND_PATH_MODEL=model/yolo-seg.pt
OBSTACLE_MODEL=model/yoloe-11l-seg.pt
YOLOE_MODEL_PATH=model/yoloe-11l-seg.pt
# 导航参数
AIGLASS_MASK_MIN_AREA=1500 # 最小掩码面积
AIGLASS_MASK_MORPH=3 # 形态学核大小
AIGLASS_MASK_MISS_TTL=6 # 掩码丢失容忍帧数
AIGLASS_PANEL_SCALE=0.65 # 数据面板缩放
# 音频配置
TTS_INTERVAL_SEC=1.0 # 语音播报间隔
ENABLE_TTS=true # 启用语音播报
如果模型文件不在默认位置,可以在相应文件中修改:
# workflow_blindpath.py
seg_model_path = "your/custom/path/yolo-seg.pt"
# yolomedia.py
YOLO_MODEL_PATH = "your/custom/path/shoppingbest5.pt"
HAND_TASK_PATH = "your/custom/path/hand_landmarker.task"
根据硬件性能调整:
# yolomedia.py
HAND_DOWNSCALE = 0.8 # 手部检测降采样(越小越快,精度降低)
HAND_FPS_DIV = 1 # 手部检测抽帧(2=隔帧,3=每3帧)
# workflow_blindpath.py
FEATURE_PARAMS = dict(
maxCorners=600, # 光流特征点数(越少越快)
qualityLevel=0.001, # 特征点质量
minDistance=5 # 特征点最小间距
)
app_main.py 的 start_ai_with_text_custom() 函数中添加:# 检查新指令
if "新指令关键词" in user_text:
# 执行自定义逻辑
print("[CUSTOM] 新指令被触发")
await ui_broadcast_final("[系统] 新功能已启动")
return
# 修改 allowed_keywords 列表
allowed_keywords = ["帮我看", "帮我找", "你的新关键词"]
workflow_blindpath.py 添加新状态:# 在 BlindPathNavigator.__init__() 中初始化
self.your_new_state_var = False
# 在 process_frame() 中处理
def process_frame(self, image):
if self.your_new_state_var:
# 自定义处理逻辑
guidance_text = "新状态引导"
# ...
navigation_master.py 添加状态机状态:class NavigationMaster:
def start_your_new_mode(self):
self.state = "YOUR_NEW_MODE"
# 初始化逻辑
# your_model_wrapper.py
class YourModelWrapper:
def __init__(self, model_path):
self.model = load_your_model(model_path)
def detect(self, image):
# 推理逻辑
return results
app_main.py 中加载:your_model = YourModelWrapper("model/your_model.pt")
results = your_model.detect(image)
# app_main.py 顶部
import logging
logging.basicConfig(level=logging.DEBUG)
# yolomedia.py
PERF_DEBUG = True # 打印处理时间
# 测试盲道导航
python test_cross_street_blindpath.py
# 测试红绿灯检测
python test_traffic_light.py
# 测试录制功能
python test_recorder.py
本项目采用 MIT 许可证 - 详见 LICENSE 文件
$ claude mcp add OpenAIglasses_for_Navigation \
-- python -m otcore.mcp_server <graph>