- 为 AsrHelper 添加详细的类注释,说明工作流程、连接管理和场景路由机制 - 为 BitmapDecodeHelper 添加类注释,解释 AR 眼镜低内存场景下的优化策略 - 为 GlassMediaServiceHelper 添加类注释,说明双检锁懒加载缓存机制 - 为 MyApplication 添加类注释,详细说明多域名 AppComponent 初始化和 SDK 绑定流程 - 为各个关键方法添加详细的 KDoc 注释,包括参数说明和使用场景 - 优化代码注释的中文表达,使其更加清晰易懂
6.0 KiB
6.0 KiB
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 全局初始化入口
构建与运行
# 调试包
./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 注销,避免后台页面响应语音:
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 连接在网络断开后进入指数退避重连,网络恢复时立即重置并重连,无需手动干预。