- 为 AsrHelper 添加详细的类注释,说明工作流程、连接管理和场景路由机制 - 为 BitmapDecodeHelper 添加类注释,解释 AR 眼镜低内存场景下的优化策略 - 为 GlassMediaServiceHelper 添加类注释,说明双检锁懒加载缓存机制 - 为 MyApplication 添加类注释,详细说明多域名 AppComponent 初始化和 SDK 绑定流程 - 为各个关键方法添加详细的 KDoc 注释,包括参数说明和使用场景 - 优化代码注释的中文表达,使其更加清晰易懂
170 行
6.0 KiB
Markdown
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 相关扩展、自定义 View(Kotlin)
|
||
└── 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**: 26(Android 8.0)
|
||
- **目标 SDK**: 29(Android 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" → onDirectChat(ChatActivity 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 连接在网络断开后进入指数退避重连,网络恢复时立即重置并重连,无需手动干预。 |