c-brain-glass/CLAUDE.md
徐勤民 c2d8a0f40e docs(helper): 更新语音识别和图像解码工具类文档
- 为 AsrHelper 添加详细的类注释,说明工作流程、连接管理和场景路由机制
- 为 BitmapDecodeHelper 添加类注释,解释 AR 眼镜低内存场景下的优化策略
- 为 GlassMediaServiceHelper 添加类注释,说明双检锁懒加载缓存机制
- 为 MyApplication 添加类注释,详细说明多域名 AppComponent 初始化和 SDK 绑定流程
- 为各个关键方法添加详细的 KDoc 注释,包括参数说明和使用场景
- 优化代码注释的中文表达,使其更加清晰易懂
2026-04-21 22:30:53 +08:00

6.0 KiB

C大脑智能眼镜应用

Rokid Glass 3 AR 眼镜的工业质检辅助应用。支持语音唤醒、在线 ASR/TTS、OCR 识别、AI 对话等功能,用于喷涂质检和单证检验两类业务场景。


项目结构

c-brain-glass/
├── app/          主应用模块UI、ViewModel、业务逻辑
├── base/         网络框架、UI 基类、工具类Java
├── core/         AR 相关扩展、自定义 ViewKotlin
└── server/       服务端相关代码(不参与 app 构建)

app 模块包结构

com.nova.brain.glass
├── ui/           14 个 Activity页面
├── viewmodel/    15 个 ViewModel
├── repository/   Retrofit 接口Service.kt、Service3.kt+ 请求拦截器
├── helper/       工具单例ASR、离线关键词、媒体服务、位图解码等
├── model/        数据模型(请求体、响应体)
├── common/       SharedPreferences 配置、崩溃处理器
└── MyApplication.java  全局初始化入口

构建与运行

# 调试包
./gradlew :app:assembleDebug

# 正式包
./gradlew :app:assembleRelease
  • 最低 SDK: 26Android 8.0
  • 目标 SDK: 29Android 10
  • 编译 SDK: 33
  • Kotlin: 2.2.0 / Java: 11

语音服务配置

语音相关密钥在 app/build.gradlebuildConfigField 中维护:

字段 说明
SPEECH_DOMAIN ASR/TTS 服务器地址IP:端口)
SPEECH_AK / SPEECH_SK 鉴权 AccessKey / SecretKey
SPEECH_ASR_PATH ASR WebSocket 路径
SPEECH_TTS_PATH TTS WebSocket 路径

关键模块说明

语音交互流程

离线唤醒词(飞宝飞宝 / C大脑
  └─ AsrHelper.onOfflineCmd()
       ├─ 无网络 → showNoNetworkDialog()
       └─ 有网络 → TTS 播报"在呢,您请说"
                    └─ TtsClient.onFinished()
                         └─ asrStartMic() 开始麦克风采集
                              └─ AsrClient.onFinalResult()
                                   ├─ scene=="decision" → onDirectChatChatActivity AI对话
                                   └─ 其他场景 → IntentRecognizeHelper.recognize() 意图识别
                                                   └─ 页面导航回调

相关文件

  • helper/AsrHelper.kt — ASR/TTS 全局管理,包含连接状态机和指数退避重连
  • helper/OfflineCmdServiceHelper.kt — 离线关键词注册/注销,按页面场景切换
  • helper/IntentRecognizeHelper.kt — 调用后台接口将语音文本映射为导航动作

场景路由AsrHelper.scene

scene 值 设置页面 ASR 结果处理
"home" WelcomeActivity 意图识别,导航到任务中心或决策中心
"list" TaskListActivity 意图识别,支持打开任务详情
"decision" ChatActivity 跳过意图识别,直接发送给 AI 对话

多 AppComponent 网络架构

MyApplication 为不同服务域名各建一套 OkHttpClient + Retrofit

字段 域名 用途
appComponent baseUrl 主后台(任务、审阅、决策中心)
appComponent1 vicp.fun 意图识别接口
appComponent2 vicp.fun 喷涂质检接口
appComponent3 vicp.fun 单证检验接口

通过 HttpManager.getApi(component, Service::class.java) 获取对应实例。

位图解码

helper/BitmapDecodeHelper.kt 采用两步采样:先 inJustDecodeBounds=true 只读尺寸,再按 ImageView 实际大小计算 inSampleSize,使用 RGB_565 格式(比 ARGB_8888 省 50% 内存。ImageView 解码任务通过 Activity 内部的 imageDecodeExecutor(单线程池)执行,在 onDestroy()shutdown()


业务流程

喷涂质检

SprayingActivity → 获取任务信息
  └─ SprayingOCRActivity → 拍照上传,服务端 OCR 识别
       └─ SprayingResultActivity → 展示 OCR 结果(两码比对)
            ├─ 通过/不合格 → SprayingFinishActivity → 确认提交 → 返回任务列表
            └─ 人工更正 → SprayingManualResultActivity → 手动选择结果

单证检验

InspectionActivity → 拍照上传,服务端识别单证
  └─ InspectionResultActivity → 展示检验结果
       ├─ 合格/不合格 → InspectionCompleteActivity
       └─ 缺失单证 → InspectionMissingActivity → 补充上传

Activity 与离线关键词管理

每个 Activity 在 onResume 注册专属关键词,在 onPause 注销,避免后台页面响应语音:

override fun onResume() {
    OfflineCmdServiceHelper.addListenerXxx()   // 注册本页关键词
    OfflineCmdServiceHelper.addOnLineListener(listener)
}
override fun onPause() {
    OfflineCmdServiceHelper.removeListenerXxx()
    OfflineCmdServiceHelper.removeOnLineListener(listener)
}

通用关键词(退出、返回、继续、下一个)在 init() 时一次性注册,不随页面切换变化。


主要依赖

依赖 版本 用途
glass3.open.sdk 2.1.7-E Rokid Glass 硬件 SDK
online-speech 0.1.0 Rokid 在线 ASR/TTS
retrofit2 2.4.0 HTTP 网络请求
rxjava2 / rxandroid 异步流处理
dagger 2.40.5 依赖注入
glide 4.10.0 图片加载
markwon 4.6.2 Markdown 渲染AI 对话)

注意事项

  • Glass SDK 初始化顺序OfflineCmdServiceHelper.init() 必须在 AsrHelper.init() 之前,因为后者依赖前者注册唤醒词。
  • 内存设备内存有限,ImageView 在 onDestroy() 中需调用 setImageDrawable(null) 释放 Bitmap 引用;解码线程池在 onDestroy()shutdown()
  • SSL:内网服务器使用自签证书,trustAllCerts = true,生产环境应替换为正式证书。
  • 网络切换ASR/TTS 连接在网络断开后进入指数退避重连,网络恢复时立即重置并重连,无需手动干预。