# 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 连接在网络断开后进入指数退避重连,网络恢复时立即重置并重连,无需手动干预。