状态: 实施完成(2026-08-18,代码/测试/前端已交付;模型下载与真机验收待执行) 目标: 打通"实时捕获 → 流式转写/字幕识别 → 双源融合 → 会话落库"的课堂实时链路,替代 v0.1.0 的文件导入路径成为主入口。 关联: 需求池 v0.2.0 · ADR-001 · ADR-002 · ADR-003 · ADR-004 · ADR-005
在 v0.1.0 文件导入链路(已验收)基础上,验证实时捕获链路的四个能力:
- 系统音频捕获可用:WASAPI 端点环回捕获系统声音(Rust 原生,无第三方运行时)
- 屏幕/窗口捕获可用:DXGI Desktop Duplication 按目标窗口抓帧,变化检测去重
- 流式 ASR 可用:Zipformer 流式实时转写 + Silero VAD 端点断句,边讲边出
- 字幕优先转写可用:字幕区 OCR 为主体、ASR 补全/校对的双源融合,摆脱 ASR CER 天花板
- 会话管理可用:每次学习 = 一个会话,列表/详情/检索可追溯
本阶段不做:视频文件导入与字幕探测(REQ-015~018,v0.3.0)、闪卡 SM-2(REQ-019/020,v0.3.0)、AI 多轮问答(REQ-024,V1.0)。
| REQ | 内容 | 验收要点 |
|---|---|---|
| REQ-007 | 系统音频捕获:WASAPI 端点环回(Rust) | 捕获系统输出声音 → 16kHz 单声道 PCM 块流入会话管线;无声源时给出可操作提示 |
| REQ-008 | 屏幕/窗口捕获:关键帧采样 + 变化检测 | 按目标窗口抓帧(DXGI),变化检测去重后送 OCR;可配采样间隔 |
| REQ-009 | 流式 ASR:Zipformer + Silero VAD 实时转写 | 边说边出(partial 节流推送);端点断句产出 final 段;静音期低 CPU |
| REQ-010 | 会话管理:列表/详情/检索 | 会话 CRUD + 转写段/OCR 块关联存储;按标题/时间检索 |
| REQ-011 | 实时字幕 OCR:字幕区识别 + 时间窗去重 | 底部区域启发式裁剪 → OCR;时间窗去重避免重复字幕刷屏 |
| REQ-012 | 双源转写融合:字幕为主,ASR 补全/校对 | 有字幕时段以字幕为准;无字幕时段回退 ASR;融合结果落会话 |
| 模块 | 方案 | 决策依据 |
|---|---|---|
| 音频捕获 | windows crate 0.61 手写 WASAPI(IAudioClient + LOOPBACK) |
ADR-001;与现有依赖一致,无新 crate 风险 |
| 屏幕捕获 | windows crate 0.61 手写 DXGI Desktop Duplication |
ADR-002;GPU 直取性能最优,按窗口句柄约束输出区域 |
| 变化检测 | 分块采样 hash 对比(移植原项目算法为 Rust 纯函数) | 原项目已验证:8 块 × 60 字节采样,≥2 块变化才判定,过滤鼠标微动 |
| 流式 ASR | sherpa-onnx OnlineRecognizer(zipformer 中文 fp16 2025-06-30 新版 + Silero VAD) |
ADR-003;参考原项目 streamingAsr.ts 流程(端点断句/partial 节流/尾句 flush) |
| 模型分发 | 应用内一键下载 + 脚本,hf-mirror.com 国内镜像;模型目录 models/streaming-zipformer/ |
ADR-003;2026-08 升级为 2025-06-30 新版(替代 2023-02-20 旧双语包) |
| 会话数据 | SQLite:sessions / session_segments / session_ocr_blocks 表 | ADR-004;与 notes 解耦,产物可一键转笔记 |
| 字幕 OCR | 底部 1/4 区域裁剪 + oar-ocr 识别 + 时间窗去重(纯函数) | ADR-005;复用 v0.1.0 OCR 引擎 |
| 双源融合 | 纯规则:字幕段权威 → ASR 段补缝;文本相似度对齐校对 | ADR-005;无 LLM 依赖(本地优先降级路径) |
- 选择一个目标窗口 → 点击开始 → 捕获其音频(若正在播放)+ 屏幕关键帧(代码已交付,真机待验)
- 流式 ASR 边讲边出字幕(partial 节流推送;静音隔块喂入降 CPU;端点断句)——代码已交付,模型下载后真机验收
- 带字幕视频(B站/网课)→ 字幕区 OCR 文本与画面字幕一致(底部 1/4 裁剪 + 去重 + 滚动检测已实现,真机待验)
- 融合转写:字幕为主 + ASR 补缝,无字幕时段自动回退 ASR(fusion.rs 四规则 + 21 项单测)
- 停止后会话可检索(标题/时间),转写段与 OCR 块时间轴对齐(sessions 三表 + 列表/详情页)
- 会话产物可一键转为笔记(session_to_note 复用拼接)
-
cargo test全绿(86 项:会话 CRUD/变化检测/字幕去重/融合/重采样/重打分) - 捕获中应用退出/窗口关闭 → 无泄漏、无崩溃(真机验收项;Drop 释放与崩溃恢复已实现)
| 步骤 | 内容 | 产出 |
|---|---|---|
| M1 | 会话管理数据层(REQ-010) | sessions 三表 + CRUD command + 单测 |
| M2 | WASAPI 端点环回 spike + 实现(REQ-007) | capture 模块:音频块流出 + 降级提示 |
| M3 | DXGI 屏幕捕获 + 变化检测(REQ-008) | frame 采样器 + 变化检测纯函数 + 单测 |
| M4 | 流式 ASR + VAD(REQ-009) | streaming_asr 模块:partial/final 事件流 |
| M5 | 字幕 OCR + 时间窗去重(REQ-011) | 字幕区裁剪 + 去重纯函数 + 单测 |
| M6 | 双源融合(REQ-012) | 融合纯函数 + 单测(字幕权威/ASR 补缝) |
| M7 | 实时会话编排 + 前端 UI + 端到端验收 | ClassroomPage 实时模式:开始/停止/会话列表 |
- WASAPI 环回捕获不到静音设备(无输出设备时)的处理:需设备枚举 + 可操作提示
- DXGI Desktop Duplication 在远程桌面/锁屏会话下不可用:需降级路径(GDI BitBlt 或提示用户)
- Zipformer 模型 ~650MB 下载体验:下载脚本需断点续传 + 进度提示 + 校验和
- 流式 Zipformer 中文 CER 实测:需自建课堂样本评测(SenseVoice 重打分作为质量兜底)
- 双速率字幕采样(字幕区高频 / 非字幕区低频)的帧率组合需实测调参
- 字幕 OCR 误识别(滚动字幕/弹幕混入):时间窗去重 + 区域过滤规则需实测校准