Skip to content

Latest commit

 

History

History
60 lines (42 loc) · 6.38 KB

File metadata and controls

60 lines (42 loc) · 6.38 KB

v0.12.1:OCR 引擎回归修复——auto-download 误关 + 引擎就绪状态真实化

状态:代码已交付(2026-08-23,真机验收发现的回归即修;0.12.0 真机验收期间) 依据:用户对话 2026-08-23(OCR 引擎加载失败重发:CUDA/CPU 双后端均读不到 ppocrv6_tiny_dict.txt · 就绪清单仍显示 ✓ · 图文会话误报"讲者分析不可用") 前置:v0.12.0(M1-M7 交付)真机验收中

一句话

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 就绪状态,让"引擎加载失败"在就绪清单 / 模型面板 / 设备设置 / 系统徽标四处真实可见,同时修正图文会话(无音频)误报讲者分析错误的展示。

范围

# 项目 类型 落点
1 oar-ocr auto-download 误关回归 P0 回归修复 app/src-tauri/Cargo.toml——features = ["simd", "auto-download"](保持 default-features=false,download-binaries 仍关闭)
2 OCR 引擎就绪状态真实化 P1 可观测性 OcrDeviceStatus.engine_ready(Rust worker 回写)+ 就绪清单 / 模型管理面板 / OCR 设备设置 / 系统徽标四处改用
3 图文会话讲者分析误报 P1 体验修复 SpeakerSwitchCard 按 kind=photo 跳过分析,输出"不适用"灰态而非红色错误
4 文档与治理 伴随 本版本文档 + CHANGELOG + 索引

根因(P0)

  • 提交 2f13308(build(deps): sherpa-onnx shared + oar-ocr 本地 ORT 动态链接)的目标只是关闭 download-binaries(ort-sys 会去 cdn.pyke.io 拉 onnxruntime,被本机 TLS 拦截),写法却是 default-features = false, features = ["simd"]。
  • auto-download 是独立 feature(auto-download = ["oar-ocr-core/auto-download"],不在 default 集),被一起关掉了。
  • 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 实际同样缺失,只是字典先暴露)。
  • 实证:C:\Users\Administrator\.oar\ 下 det/rec/dict 三文件 + sha256 sidecar 齐全(早前 auto-download 已缓存)——恢复 feature 后命中缓存、零网络即恢复。

交付内容

M1 · 依赖修复

  • Cargo.toml:oar-ocr = { version = "0.9", default-features = false, features = ["simd", "auto-download"] };注释记录回归背景与缓存路径约定($OAR_HOME,默认 ~/.oar;文件存在且 sha256 校验通过时零网络命中)。

M2 · 引擎就绪状态真实化(engine_ready)

  • device_config.rs:OcrDeviceStatus 新增 engine_ready: bool(#[serde(default)]——旧 JSON 载荷零回归);new() 初始 false。
  • engine_worker.rs:加载成功回写 engine_ready=true(与 actual/fallback_reason 同写);加载失败显式 engine_ready=false + 失败原因附可行动提示("重启应用自动重试")。
  • commands_diag.rs:DiagSnapshot 增 ocr_engine_ready;health_status 注释口径更新(OCR 模型由 oar-ocr 托管在 $OAR_HOME,就绪经 engine_ready 暴露,不在 app 模型目录查文件)。
  • 前端四处改用(就绪判定不再用"线程心跳"——线程活着 ≠ 引擎可用,这是 v0.12.0 验收里"OCR 全挂仍显示 ✓"的误报根因):
    • ReadyCheckCard:OCR 行 ok = engine_ready;未就绪标签显示"(未就绪)"而非请求态后端,详情含失败原因。
    • ModelManagementPanel:OCR 行"✗ 引擎未就绪" + 修复提示(重启应用自动重试)。
    • OcrDeviceSetting:未就绪红色提示条("模型缺失或下载失败——重启应用自动重试");"当前后端"改"请求后端"避免冒充生效态;历史基准标注。
    • SystemStatusBadge:ocr_engine_ready=false 计入系统告警 + 面板"OCR 引擎:未就绪"行。

M3 · 图文会话讲者分析误报修复

  • SpeakerSwitchCard 新增 kind 入参:kind=photo 不发起 analyze_session_speakers,渲染"👥 讲者分析不适用(图文会话无音频)"灰态——此前每个图文会话详情页都报红色"讲者分析不可用:会话音频缺失",把预期降级渲染成错误。

验证

  • Rust:device_config 单测补充——status_new 断言 !engine_ready;status_roundtrip_keeps_engine_ready(往返一致 + 旧载荷缺字段默认 false)。
  • 前端:tsc --noEmit 零错误;vite build 通过(vitest 无前端测试文件,未新增)。
  • 真机验收回归路径:启动应用 → 设置页「OCR 推理设备」显示"✓ 引擎就绪(GPU/CPU)";就绪清单 OCR 行 ✓;会话页正文识别可出结果(复用 ~/.oar 缓存)。
  • 故障路径验证(故意断网/清缓存后启动):就绪清单 OCR 行 ✗ + 原因;模型面板"✗ 引擎未就绪";系统徽标告警;恢复网络/重启后引擎自动重试成功。

已知问题与后续

  • 图文会话笔记正文为 OCR 原文直出("治愈纪录片:""七、 能量管理"等章节标题与实操练习重复出现、引号错乱)——note-rules v0.7.8 结构化仍弱;已归入笔记净化链(note-filter)后续版本,非本版范围。
  • 同名会话/笔记多条(同一窗口多次采集 → 标题相同):待会话列表区分度改进(标题追加日期或时长)。
  • 拼接跨块去重:现有"相邻精确去重"(note_filter_ocr normalize_and_dedup)对"尾/头字符重叠"未处理;需真实数据复现(本机 DB 实证 ocr 块本身无重复字符,问题疑似发生在 det 断行合并/上游),归入后续版本专项。
  • CR 备注:v0.12.0 交付记录中"本地 OCR 下线(仅保留字幕/图文采集)"与本次修复不冲突——本版修的是字幕/图文采集依赖的 OCR 引擎本身。