|
| 1 | +# v0.12.1:OCR 引擎回归修复——auto-download 误关 + 引擎就绪状态真实化 |
| 2 | + |
| 3 | +> 状态:代码已交付(2026-08-23,真机验收发现的回归即修;0.12.0 真机验收期间) |
| 4 | +> 依据:用户对话 2026-08-23(OCR 引擎加载失败重发:CUDA/CPU 双后端均读不到 `ppocrv6_tiny_dict.txt` · 就绪清单仍显示 ✓ · 图文会话误报"讲者分析不可用") |
| 5 | +> 前置:v0.12.0(M1-M7 交付)真机验收中 |
| 6 | +
|
| 7 | +## 一句话 |
| 8 | + |
| 9 | +v0.12.0 构建修复(`2f13308`)把 `oar-ocr` 关成 `default-features = false` 时**误关了独立的 `auto-download` feature**——OCR 模型注册名不再解析为 ModelScope 缓存路径,引擎以裸文件名读字典直接 `os error 2`,CUDA 构建失败 → CPU 回退也失败,OCR 全链路不可用;而就绪检查按"线程心跳"判定仍显示 ✓。本版恢复 auto-download(模型已在本机 `~/.oar` 缓存,零网络恢复),并新增 `engine_ready` 就绪状态,让"引擎加载失败"在就绪清单 / 模型面板 / 设备设置 / 系统徽标四处真实可见,同时修正图文会话(无音频)误报讲者分析错误的展示。 |
| 10 | + |
| 11 | +## 范围 |
| 12 | + |
| 13 | +| # | 项目 | 类型 | 落点 | |
| 14 | +|---|------|------|------| |
| 15 | +| 1 | oar-ocr `auto-download` 误关回归 | **P0** 回归修复 | `app/src-tauri/Cargo.toml`——`features = ["simd", "auto-download"]`(保持 `default-features=false`,`download-binaries` 仍关闭) | |
| 16 | +| 2 | OCR 引擎就绪状态真实化 | **P1** 可观测性 | `OcrDeviceStatus.engine_ready`(Rust worker 回写)+ 就绪清单 / 模型管理面板 / OCR 设备设置 / 系统徽标四处改用 | |
| 17 | +| 3 | 图文会话讲者分析误报 | P1 体验修复 | `SpeakerSwitchCard` 按 `kind=photo` 跳过分析,输出"不适用"灰态而非红色错误 | |
| 18 | +| 4 | 文档与治理 | 伴随 | 本版本文档 + CHANGELOG + 索引 | |
| 19 | + |
| 20 | +## 根因(P0) |
| 21 | + |
| 22 | +- 提交 `2f13308`(build(deps): sherpa-onnx shared + oar-ocr 本地 ORT 动态链接)的目标只是关闭 `download-binaries`(ort-sys 会去 `cdn.pyke.io` 拉 onnxruntime,被本机 TLS 拦截),写法却是 `default-features = false, features = ["simd"]`。 |
| 23 | +- `auto-download` 是**独立 feature**(`auto-download = ["oar-ocr-core/auto-download"]`,不在 default 集),被一起关掉了。 |
| 24 | +- oar-ocr-core `resolve_asset_path` 按该 feature 编译门控:关闭时模型标识 `"pp-ocrv6_tiny_det.onnx"` / `"ppocrv6_tiny_dict.txt"` 原样当本地路径;构建顺序中字典最先读取 → 报 `Failed to read character dictionary from 'ppocrv6_tiny_dict.txt': 系统找不到指定的文件。(os error 2)`;CUDA 失败 → CPU 回退同因失败 → 引擎整体不可用(det/rec 实际同样缺失,只是字典先暴露)。 |
| 25 | +- 实证:`C:\Users\Administrator\.oar\` 下 det/rec/dict 三文件 + sha256 sidecar 齐全(早前 auto-download 已缓存)——恢复 feature 后命中缓存、零网络即恢复。 |
| 26 | + |
| 27 | +## 交付内容 |
| 28 | + |
| 29 | +### M1 · 依赖修复 |
| 30 | + |
| 31 | +- `Cargo.toml`:`oar-ocr = { version = "0.9", default-features = false, features = ["simd", "auto-download"] }`;注释记录回归背景与缓存路径约定(`$OAR_HOME`,默认 `~/.oar`;文件存在且 sha256 校验通过时零网络命中)。 |
| 32 | + |
| 33 | +### M2 · 引擎就绪状态真实化(engine_ready) |
| 34 | + |
| 35 | +- `device_config.rs`:`OcrDeviceStatus` 新增 `engine_ready: bool`(`#[serde(default)]`——旧 JSON 载荷零回归);`new()` 初始 false。 |
| 36 | +- `engine_worker.rs`:加载成功回写 `engine_ready=true`(与 actual/fallback_reason 同写);加载失败显式 `engine_ready=false` + 失败原因附可行动提示("重启应用自动重试")。 |
| 37 | +- `commands_diag.rs`:`DiagSnapshot` 增 `ocr_engine_ready`;health_status 注释口径更新(OCR 模型由 oar-ocr 托管在 `$OAR_HOME`,就绪经 engine_ready 暴露,不在 app 模型目录查文件)。 |
| 38 | +- 前端四处改用(就绪判定不再用"线程心跳"——线程活着 ≠ 引擎可用,这是 v0.12.0 验收里"OCR 全挂仍显示 ✓"的误报根因): |
| 39 | + - `ReadyCheckCard`:OCR 行 `ok = engine_ready`;未就绪标签显示"(未就绪)"而非请求态后端,详情含失败原因。 |
| 40 | + - `ModelManagementPanel`:OCR 行"✗ 引擎未就绪" + 修复提示(重启应用自动重试)。 |
| 41 | + - `OcrDeviceSetting`:未就绪红色提示条("模型缺失或下载失败——重启应用自动重试");"当前后端"改"请求后端"避免冒充生效态;历史基准标注。 |
| 42 | + - `SystemStatusBadge`:`ocr_engine_ready=false` 计入系统告警 + 面板"OCR 引擎:未就绪"行。 |
| 43 | + |
| 44 | +### M3 · 图文会话讲者分析误报修复 |
| 45 | + |
| 46 | +- `SpeakerSwitchCard` 新增 `kind` 入参:`kind=photo` 不发起 `analyze_session_speakers`,渲染"👥 讲者分析不适用(图文会话无音频)"灰态——此前每个图文会话详情页都报红色"讲者分析不可用:会话音频缺失",把预期降级渲染成错误。 |
| 47 | + |
| 48 | +## 验证 |
| 49 | + |
| 50 | +- Rust:`device_config` 单测补充——`status_new` 断言 `!engine_ready`;`status_roundtrip_keeps_engine_ready`(往返一致 + 旧载荷缺字段默认 false)。 |
| 51 | +- 前端:`tsc --noEmit` 零错误;`vite build` 通过(vitest 无前端测试文件,未新增)。 |
| 52 | +- 真机验收回归路径:启动应用 → 设置页「OCR 推理设备」显示"✓ 引擎就绪(GPU/CPU)";就绪清单 OCR 行 ✓;会话页正文识别可出结果(复用 `~/.oar` 缓存)。 |
| 53 | +- 故障路径验证(故意断网/清缓存后启动):就绪清单 OCR 行 ✗ + 原因;模型面板"✗ 引擎未就绪";系统徽标告警;恢复网络/重启后引擎自动重试成功。 |
| 54 | + |
| 55 | +## 已知问题与后续 |
| 56 | + |
| 57 | +- **图文会话笔记正文为 OCR 原文直出**("治愈纪录片:""七、 能量管理"等章节标题与实操练习重复出现、引号错乱)——note-rules v0.7.8 结构化仍弱;已归入笔记净化链(note-filter)后续版本,非本版范围。 |
| 58 | +- **同名会话/笔记多条**(同一窗口多次采集 → 标题相同):待会话列表区分度改进(标题追加日期或时长)。 |
| 59 | +- **拼接跨块去重**:现有"相邻精确去重"(note_filter_ocr `normalize_and_dedup`)对"尾/头字符重叠"未处理;需真实数据复现(本机 DB 实证 ocr 块本身无重复字符,问题疑似发生在 det 断行合并/上游),归入后续版本专项。 |
| 60 | +- **CR 备注**:v0.12.0 交付记录中"本地 OCR 下线(仅保留字幕/图文采集)"与本次修复不冲突——本版修的是字幕/图文采集依赖的 OCR 引擎本身。 |
0 commit comments