c-brain-glass/CLAUDE.md

170 行
6.0 KiB
Markdown

# 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 全局初始化入口
```
---
## 构建与运行
```bash
# 调试包
./gradlew :app:assembleDebug
# 正式包
./gradlew :app:assembleRelease
```
- **最低 SDK**: 26Android 8.0
- **目标 SDK**: 29Android 10
- **编译 SDK**: 33
- **Kotlin**: 2.2.0 / **Java**: 11
### 语音服务配置
语音相关密钥在 `app/build.gradle``buildConfigField` 中维护:
| 字段 | 说明 |
|------|------|
| `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` 注销,避免后台页面响应语音:
```kotlin
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 连接在网络断开后进入指数退避重连,网络恢复时立即重置并重连,无需手动干预。