为视障者发声:VisionClaw辅助模式与Earcons提示音系统的无障碍实现
【免费下载链接】VisionClawReal-time AI assistant for Meta Ray-Ban smart glasses -- voice + vision + agentic actions via Gemini Live and OpenClaw项目地址: https://gitcode.com/gh_mirrors/vi/VisionClaw
VisionClaw 是一款面向 Meta Ray-Ban 智能眼镜的实时 AI 助手,而它的**辅助模式(Assistive Mode)**与Earcons 提示音系统,让这位"你所即我所见"的助手真正能被视障用户依赖:AI 用钟表方位描述世界、逐字读出包装上的文字,一连串短促而彼此可区分的提示音则随时告诉你——通话是接通了、断开了,还是结束了。
为什么视障用户需要专门的辅助模式?
对看得见的人来说,AI 通话界面上的"连接中""已断开"文字状态一目了然;但对看不见屏幕的用户来说,这些文字根本不存在。项目代码里的注释一针见血:
VoiceOver 的播报只能到达正在运行 VoiceOver 的人——而老年用户往往并不使用它,辅助模式恰恰是为他们准备的。耳边的提示音,是那个"永远能到达"的信号,用户绝不会再对着一个已经死掉的通话自说自话。
为此,VisionClaw 构建了一个三层信号体系,层层兜底:
| 信号层 | 服务对象 | 实现 |
|---|---|---|
| 🗣️ VoiceOver / TalkBack 语音播报 | 使用读屏的用户 | Accessibility.swift 中的A11y.announce,断线等紧急状态用高优先级打断播报 |
| 📳 触感反馈 | 手动开启触觉的用户(可选) | 连接、冻帧等状态触发系统振动 |
| 🔊Earcons 提示音 | 所有开启辅助模式的用户 | 不依赖任何系统辅助功能,声音"永远到达" |
第三层正是本文的主角:Earcons——一组专为通话状态变化设计的合成提示音。
Earcons 提示音的 5 种音效:告别"对着空气说话"
Earcons 在 iOS 与 Android 上使用完全相同的音符序列,保证同一个提示音在两台设备上含义一致。每种提示音都由(频率 Hz,时长 秒)的音符序列定义,0表示休止:
| 提示音 | 触发时机 | 听感设计 |
|---|---|---|
🔗connected | AI 通话接通 | 660 → 990 Hz,两音上扬,像"叮"的确认 |
📴ended | 通话结束 | 990 → 660 Hz,两音下落,明确收尾 |
⚠️lost | 连接丢失 / 正在重连 | 520 → 390 Hz,缓慢下行且较长,警示意味 |
✅reconnected | 重连成功 | 660 → 830 → 990 Hz,快速三音攀升 |
📌captured | 冻帧(固定画面) | 1800 Hz 极短高频"嘀"声 |
音符序列定义可直接查看:iOS 端 Earcons.swift,Android 端 Earcons.kt。
为什么"不带一个音频文件"?
这是 Earcons 最有意思的工程决策:所有提示音都是在内存中实时合成的,仓库里没有任何音效资源文件。
- 合成方式:44.1 kHz、16 位单声道 PCM 正弦波,振幅 0.35,每个音符带 8 ms 淡入淡出,起音落音毫无"咔哒"爆音;
- 性能友好:合成结果按提示音缓存(Earcons.swift 的
wav(for:)),重复播放零开销; - Android 端不抢话筒:Earcons.kt 把音频标记为
USAGE_ASSISTANCE_SONIFICATION(辅助类声音化信号),它不会抢占音频焦点,可以和 AI 的语音"擦肩而过"地同时响起; - iOS 端从眼镜里响:播放走 LiveKit 已配置好的同一个音频会话,佩戴眼镜通话时,提示音直接从眼镜的扬声器发出,和 AI 的声音同一个出口;
- 开关可控:只有辅助模式开启时
Earcons.play才会真正发声,普通用户完全听不到。
触发时机则分布在通话视图的状态监听里:连接、断开、失败、代理离开、冻帧、重连开始与恢复——每一个状态跃迁都同时"喊"给读屏(A11y.announce)和耳朵(Earcons.play),见 LiveKitStreamView.swift 与 Android 的 LiveKitStreamScreen.kt。
辅助模式如何工作:从一个开关到 AI 提示词
Earcons 只解决了"听得见"的问题。"说得对"要靠另一半——辅助提示词档案(assistive profile)。它的工作链路横跨 App、网关与 AI 代理三端:
- 用户拨动开关:设置页"Accessibility"分组下的
Assistive mode,iOS 见 SettingsView.swift,Android 见 SettingsScreen.kt。改动立即生效——如果正处在通话中,App 会自动重拨一次以套用新档案(LiveKitSession.swift 在拨号请求中附带profile: "assistive"); - 网关盖章:server.ts 校验请求后,把
profile写入参与者的房间元数据; - 代理换"人格":main.py 读取元数据中的 profile,为
assistive用户在系统提示词末尾追加一段专门的ASSISTIVE_INSTRUCTIONS(main.py),在组装 Gemini 会话指令时合并生效(main.py)。
AI 的说话方式会变成什么样?
追加的这段指令,是整个无障碍体验的灵魂,规则朴素而克制:
- ⏰ 钟表方位 + 距离:描述位置一律说"2 点钟方向、约一臂远的杯子""正前方约五步的一扇门",禁止"正如你所见""就在那儿""这个"这类看不见方向的说法;
- 📖 逐字朗读:读邮件、药盒、价签、保质期时,逐字照读、绝不概括;看不清的部分明说"看不清",而不是脑补;
- 🚫 永不承诺安全:AI 自知每秒只能看到约一帧画面,无法可靠判断地面与交通——它永远不会说"这条路可以安全通过",只会描述所见,并提醒你用盲杖、导盲犬或同伴确认;
- 🗂️ 卡片内容出声:屏幕卡片视障用户看不见,AI 会把卡片里回答问题的关键行直接念出来;
- 💰 花钱先确认:任何消费或代发操作前,AI 必须复述"我即将做什么",并等到一个明确的"是";
- 🗣️ 简短优先:先说障碍与危险,再说答案,每次回复一两句短句,除非用户要更多。
这些规则让同一个 AI,在辅助模式下从"聪明的聊天伙伴"切换成"谨慎的同行者"。
快速上手:3 步开启辅助模式
想亲眼看看这套无障碍设计?无需眼镜,用手机摄像头模式即可体验完整链路:
git clone https://gitcode.com/gh_mirrors/vi/VisionClawiOS:用 Xcode 打开samples/CameraAccess/,复制 Secrets.swift.example 为Secrets.swift并填入 Gemini API Key,即可运行;主界面点"Start on iPhone",在Settings → Accessibility打开 Assistive mode。
Android:用 Android Studio 打开samples/CameraAccessAndroid/,复制 Secrets.kt.example 为Secrets.kt填好密钥;设置页同样位置拨动开关。
💡 开启后拨一通 AI 通话,试着说"我在看什么?",然后留意接通与挂断时那两声上扬、下落的不同提示音——这就是 Earcons 在为你"看着"。
写在最后
VisionClaw 的无障碍实现没有花哨的算法,却处处是"把用户当人"的细节:不假设用户开着读屏软件,所以声音永远在场;不假设 AI 能看清一切,所以宁可明说"不确定"也不许它猜测;不做两套平台逻辑,所以同一个提示音在任何设备上都意味着同一件事。
核心模块速览:
| 模块 | 相对路径 |
|---|---|
| 辅助提示词(AI 行为规范) | agent/main.py |
| 辅助档案路由(网关) | gateway/src/server.ts |
| iOS 提示音合成 | Earcons.swift |
| Android 提示音合成 | Earcons.kt |
| 无障碍播报工具 | Accessibility.swift |
| 设置开关(iOS / Android) | SettingsView.swift / SettingsScreen.kt |
| 完整文档 | README.md |
技术为少数人让路时,走的才是真正宽阔的路。
【免费下载链接】VisionClawReal-time AI assistant for Meta Ray-Ban smart glasses -- voice + vision + agentic actions via Gemini Live and OpenClaw项目地址: https://gitcode.com/gh_mirrors/vi/VisionClaw
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考