手搓一套 AI 导盲眼镜:基于 ESP32 + YOLO + 语音对话,实现盲道导航、过马路辅助和物品识别(完整开源方案)

智能语音交互机器学习开发与运维

picture.image

猫头虎AI开源项目分享:如何手搓了一套AI导盲眼镜,可以盲道导航、过马路辅助、物品识别、实时语音交互,方案开源

大家好,我是猫头虎。最近因为市场原因忙了一阵子,更新少了不少,欢迎大家多多催更 😄。 今天给大家分享一个最近发现的完整开源、成本不到 150 元、实际可跑的 AI 导盲眼镜项目:基于 ESP32 + 本地 AI 模型,实现盲道导航、过马路辅助、物品识别和实时语音交互。

一句话体验是这样的:

你对系统说一句「帮我过马路」, 眼镜摄像头开始工作,系统实时播报: 「前方 3 米有斑马线,现在绿灯,可以通行」。

功能可扩展,比如你想加个「找公交站」: 直接在 workflow\_blindpath.py 里加逻辑,就能做盲道+公交一体导航。

更重要的是:方案完全开源 ,其他人也可以通过手机或电脑,以第一视角实时看到画面,进行远程协助。


picture.image

1️⃣ 项目整体介绍:一套真的能跑的“AI导盲眼镜”

这个项目是一个面向视障人士的智能导航与辅助系统 ,集成了:

  • 盲道导航
  • 过马路辅助
  • 物品识别与查找
  • 实时语音交互
  • 视频流监控与远程协助

系统基于 ESP32、Python 后端和多种 AI 模型组合实现。 再次强调一遍:

⚠️ 本项目仅用于技术交流与学习,请勿直接用于真实视障用户场景。

👉 项目代码开源地址(记得 Star 一下支持我):GitHub: https://github.com/MaoTouHU/OpenAIglasses\_for\_Navigation

👉 模型下载地址(下载后放到 model/ 目录):ModelScope: https://www.modelscope.cn/models/archifancy/AIGlasses\_for\_navigation


2️⃣ 功能总览:从盲道到物品,从过马路到对话

🟡 盲道导航:实时识别+语音引导+避障

盲道导航能力主要包括:

  • 实时盲道检测 :基于 YOLO 分割模型实时识别盲道
  • 智能语音引导 :提供精准的方向指引(左转、右转、直行等)
  • 障碍物检测与避障 :自动识别前方障碍物并规划避障路线
  • 转弯检测 :自动识别急转弯并提前提醒
  • 光流稳定 :使用 Lucas-Kanade 光流算法稳定掩码,减少抖动

结构解读:

picture.image

核心体验就是:系统不仅能看到盲道,还能“理解方向”和“规避障碍”,并通过语音实时告诉你怎么走。


🚦 过马路辅助:斑马线 + 红绿灯一体引导

过马路辅助主要做了三件事:

  • 斑马线识别 :实时检测斑马线的位置和方向
  • 红绿灯识别 :基于颜色和形状的红绿灯状态检测
  • 对齐与通行引导
  • 引导用户对准斑马线中心
  • 绿灯时语音提示可以通行

你只需要一句话:「帮我过马路」, 系统就会开始帮你找斑马线 → 判断红绿灯 → 对齐方向 → 提示何时安全通行。


🔍 物品识别与查找:从“帮我找红牛”到“我已经拿到了”

这一块更偏“生活助手”,主要能力包括:

  • 智能物品搜索 : 支持语音指令,比如:
  • 「帮我找一下红牛」
  • 「帮我找一下 AD 钙奶」
  • 「帮我找矿泉水」
  • 实时目标追踪 : 使用 YOLO-E 开放词汇检测 + ByteTrack 追踪
  • 手部引导 : 结合 MediaPipe 手部检测,引导用户手部靠近物品
  • 抓取检测 : 检测手部握持动作,确认物品已拿到
  • 多模态反馈 : 视觉标注 + 语音引导 + 物体居中提示

效果示意(物品识别界面):

picture.image

整体体验流程类似这样: 你说「帮我找一下红牛」 → 系统在画面中标出红牛 → 语音提示你往左/右调整 → 手部靠近时进一步引导 → 检测到握持动作后确认【已拿到】。


🎙️ 实时语音交互:指令、对话、场景理解一把梭

语音交互模块基于阿里云 DashScope 提供的能力:

  • 语音识别(ASR) : 基于 Paraformer 实时语音识别
  • 多模态对话 : 使用 Qwen-Omni-Turbo,支持图像 + 文本输入、语音输出
  • 智能指令解析 : 自动判断你是在:
  • 发导航指令
  • 查找物品
  • 还是在普通聊天 / 咨询
  • 上下文感知 : 在不同模式(导航/过马路/查找物品)下自动过滤无关指令,避免误触发

📹 视频与音频处理:实时流+远程协助

这一层主要解决「可视化和协同」问题:

  • 实时视频流 : WebSocket 推流,支持多客户端同时观看(比如亲友、志愿者远程协助)
  • 音视频同步录制 : 自动保存带时间戳的录像和音频文件,方便回放和调试
  • IMU 数据融合 : 接收 ESP32 的 IMU 数据,用于姿态估计
  • 多路音频混音 : 支持系统语音、AI 回复、环境音同时播放

🎨 可视化与交互:浏览器面板 + 3D 姿态可视化

可视化部分面向开发和远程协助场景,包括:

  • Web 实时监控 :浏览器端实时查看处理后的视频流
  • IMU 3D 可视化 :Three.js 实时渲染设备姿态
  • 状态面板 :显示导航状态、检测信息、FPS 等
  • 中文友好 :所有界面和语音使用中文,支持自定义字体

Web 端主要效果示意:

picture.image


3️⃣ 系统整体定位与开源说明

再强调一下项目定位:

一个面向视障人士的智能导航与辅助系统, 集成了盲道导航、过马路辅助、物品识别、实时语音交互等功能。

但 ⚠️ 非常重要的提醒

  • 本项目仅为 交流学习使用
  • 请勿直接给真实视障人群使用
  • 项目内仅包含 代码
  • 模型单独提供(下载后放置在 /model 文件夹)

模型地址(再次附上):https://www.modelscope.cn/models/archifancy/AIGlasses\_for\_navigation


4️⃣ 环境与硬件要求

💻 开发/服务器端(跑模型的那台机器)

  • CPU:Intel i5 或以上(推荐 i7 / i9)
  • GPU:NVIDIA(支持 CUDA 11.8+,推荐 RTX 3060 或以上)
  • 内存:8GB RAM(推荐 16GB)
  • 存储:10GB 可用空间

🕶️ 客户端设备(可选)

  • ESP32-CAM 或其他支持 WebSocket 的摄像头
  • 麦克风(语音输入)
  • 扬声器 / 耳机(语音输出)

🧾 软件要求

  • 操作系统:Windows 10/11, Ubuntu 20.04+,macOS 10.15+
  • Python:3.9 - 3.11
  • CUDA:11.8 或更高版本(如果需要 GPU 加速)
  • 浏览器:Chrome 90+ / Firefox 88+ / Edge 90+

🔑 API 密钥

需要申请阿里云 DashScope API Key:

  • 用途:
  • Paraformer(ASR)
  • Qwen-Omni 对话

5️⃣ 快速上手:从克隆到跑起来

下面保留全部原始命令与代码块 ,方便你直接复制粘贴。

1. 克隆项目

  
git clone https://github.com/yourusername/aiglass.git  
cd aiglass/rebuild1002  

这里你可以替换成自己的仓库路径或上面的开源链接。

2. 安装依赖

创建虚拟环境(推荐)

  
python -m venv venv  
# Windows  
venv\Scripts\activate  
# Linux/macOS  
source venv/bin/activate  

安装 Python 包

  
pip install -r requirements.txt  

安装 CUDA 和 cuDNN(GPU 加速)

请参考 NVIDIA CUDA Toolkit 安装指南


3. 下载模型文件

将以下模型文件放入 model/ 目录:

| 模型文件 | 用途 | 大小 | 下载链接 | | --- | --- | --- | --- | | yolo-seg.pt | 盲道分割 | ~50MB | [待补充] | | yoloe-11l-seg.pt | 开放词汇检测 | ~80MB | [待补充] | | shoppingbest5.pt | 物品识别 | ~30MB | [待补充] | | trafficlight.pt | 红绿灯检测 | ~20MB | [待补充] | | hand\_landmarker.task | 手部检测 | ~15MB | MediaPipe Models |

实际使用时,可以参考 ModelScope 提供的模型包。


4. 配置 API 密钥

创建 .env 文件:

  
# .env  
DASHSCOPE\_API\_KEY=your\_api\_key\_here  

或者你懒得搞环境变量,也可以直接在代码中硬编码(不推荐 ):

  
# app\_main.py, line 50  
API\_KEY = "your\_api\_key\_here"  


5. 启动系统

  
python app\_main.py  

系统会在 http://0.0.0.0:8081 启动服务,用浏览器打开即可看到实时监控界面。


6. 连接设备(可选 ESP32)

如果你使用的是 ESP32-CAM:

  1. 烧录 compile/compile.ino 到 ESP32
  2. 修改 WiFi 配置,使其和服务器在同一网络
  3. ESP32 会自动连接到 WebSocket 端点

6️⃣ 系统架构:从设备到云,再回到耳机里

为了方便理解,完整架构图如下:

  
┌─────────────────────────────────────────────────────────────┐  
│                        客户端层                              │  
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐      │  
│  │  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 | 线程安全的帧缓冲与分发 |

如果你想扩展功能 ,比如刚刚提到的「找公交站」, 只需要在对应 workflow 里添加新逻辑,无需重写底层架构。


7️⃣ 使用说明:你可以这样跟它说话

语音指令(无唤醒词,直接说)

系统当前支持如下中文语音指令:

👉 导航控制

  
"开始导航" / "盲道导航"     → 启动盲道导航  
"停止导航" / "结束导航"     → 停止盲道导航  
"开始过马路" / "帮我过马路"  → 启动过马路模式  
"过马路结束" / "结束过马路"  → 停止过马路模式  

👉 红绿灯检测

  
"检测红绿灯" / "看红绿灯"   → 启动红绿灯检测  
"停止检测" / "停止红绿灯"   → 停止检测  

👉 物品查找

  
"帮我找一下 [物品名]"       → 启动物品搜索  
  示例:  
  - "帮我找一下红牛"  
  - "找一下AD钙奶"  
  - "帮我找矿泉水"  
"找到了" / "拿到了"         → 确认找到物品  

👉 智能对话

  
"帮我看看这是什么"          → 拍照识别  
"这个东西能吃吗"            → 物品咨询  
任何其他问题                 → AI 对话  


导航状态机:系统在不同模式下的行为

系统内部有一套状态机,会在多个模式之间自动切换:

  1. IDLE - 空闲状态
  • 等待用户指令
  • 显示原始视频流
  • CHAT - 对话模式
  • 与 AI 进行多模态对话
  • 暂停导航功能
  • BLINDPATH_NAV - 盲道导航
  • 实时方向修正

  • 障碍物检测

  • ROTATION :旋转对准盲道

  • TRANSLATION :平移至盲道中心

  • ONBOARDING :上盲道引导

  • NAVIGATING :沿盲道行走

  • MANEUVERING_TURN :转弯处理

  • AVOIDING_OBSTACLE :避障

  • CROSSING - 过马路模式
  • SEEKING\_CROSSWALK :寻找斑马线
  • WAIT\_TRAFFIC\_LIGHT :等待绿灯
  • CROSSING :过马路中
  • SEEKING\_NEXT\_BLINDPATH :寻找对面盲道
  • ITEM_SEARCH - 物品查找
  • 实时检测目标物品
  • 引导手部靠近
  • 确认抓取
  • TRAFFIC_LIGHT_DETECTION - 红绿灯检测
  • 实时检测红绿灯状态
  • 语音播报颜色变化

Web 监控界面与 WebSocket

打开 http://localhost:8081,你能看到:

  • 实时视频流(带导航标注)
  • 状态面板(当前模式、检测信息、FPS)
  • IMU 3D 可视化
  • 语音识别结果与 AI 回复

对应的 WebSocket 端点如下:

| 端点 | 用途 | 数据格式 | | --- | --- | --- | | /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) |


8️⃣ 配置与调优:从环境变量到性能参数

环境变量(.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        # 特征点最小间距  
)  


9️⃣ 二次开发与调试:给想折腾的你

添加新的语音指令

  1. app\_main.pystart\_ai\_with\_text\_custom() 函数中添加逻辑:
  
# 检查新指令  
if "新指令关键词" in user\_text:  
    # 执行自定义逻辑  
    print("[CUSTOM] 新指令被触发")  
    await ui\_broadcast\_final("[系统] 新功能已启动")  
    return  

  1. 如果你想修改“哪些语句才会被认为是有效指令”,可以调整:
  
# 修改 allowed\_keywords 列表  
allowed\_keywords = ["帮我看", "帮我找", "你的新关键词"]  


扩展导航功能

例如你要加一个新导航模式,可以:

  1. 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 = "新状态引导"  
    # ...  

  1. navigation\_master.py 增加状态机入口:
  
class NavigationMaster:  
    def start\_your\_new\_mode(self):  
        self.state = "YOUR\_NEW\_MODE"  
        # 初始化逻辑  


集成新模型

  1. 编写一个模型封装类:
  
# your\_model\_wrapper.py  
class YourModelWrapper:  
    def \_\_init\_\_(self, model\_path):  
        self.model = load\_your\_model(model\_path)  
      
    def detect(self, image):  
        # 推理逻辑  
        return results  

  1. app\_main.py 中加载:
  
your\_model = YourModelWrapper("model/your\_model.pt")  

  1. 在对应工作流中进行调用:
  
results = your\_model.detect(image)  


调试小技巧

  1. 开启详细日志:
  
# app\_main.py 顶部  
import logging  
logging.basicConfig(level=logging.DEBUG)  

  1. 查看帧率和耗时瓶颈:
  
# yolomedia.py  
PERF\_DEBUG = True  # 打印处理时间  

  1. 分模块测试:
  
# 测试盲道导航  
python test\_cross\_street\_blindpath.py  
  
# 测试红绿灯检测  
python test\_traffic\_light.py  
  
# 测试录制功能  
python test\_recorder.py  


🔚 总结 & 彩蛋

这套 AI 导盲眼镜项目,核心亮点可以简单概括为三点:

  1. 成本可控 :整体硬件成本控制在 150 元左右,适合个人开发者和学生党折腾。
  2. 方案完整 :从 ESP32 端采集 → 后端 AI 推理 → 导航逻辑 → 语音交互 → Web 可视化 → 远程协助,一条龙打通。
  3. 高度可扩展 :你可以很容易地加上:
  • 「找公交站」
  • 「帮我识别门牌号」
  • 「统计货架上某类商品数量」
  • ……

如果你已经看到这里了,强烈建议:

  • ⭐ 给仓库点个 Star 支持一下
  • 🍵 Fork 下来本地跑一跑
  • 🛠️ 改一个小功能,比如在 workflow\_blindpath.py 里加一个你自己的导航提示逻辑

AI 开源分享 GitHub: https://github.com/MaoTouHU/OpenAIglasses\_for\_Navigation

picture.image

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
边缘计算在视频直播场景的应用与实践
视频直播作为当前视频行业的核心场景之一,对于高清化、实时性、交互性要求较高,需要强大算力保障用户流畅观看与互动体验。本次分享主要从视频直播场景需求切入,介绍基于边缘计算的视频直播场景方案及其架构、应用与实践。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论