Skip to content

Latest commit

 

History

History
60 lines (44 loc) · 7.09 KB

File metadata and controls

60 lines (44 loc) · 7.09 KB

v0.7.2 — 课堂助手实时体验深化(信息可见性 + 说话人 + 合集 + 断句自适应)

状态: 开发中(2026-08 用户需求批次;三连体验 + 信息面板 + 合集联动 + 断句自适应已完成,说话人分离弱化版实施中) 目标: 采集过程中右侧信息透明化(平台/时长/合集/字幕)· 说话人切换可见 · 合集识别与档案检测联动 · 断句随说话人语速停顿习惯自适应 关联: 档案检测准确度头脑风暴([ ] 已归档) · 视频数据提取清单 · 需求池(REQ-148~154)

一、阶段目标

  1. 体验三连(已完成):最近画面按时间顺序排列;ASR 未沉淀行多行展示(识别中按句读拆行 + 已定稿并存);档案新增「未知」选项
  2. 采集信息面板(REQ-151):采集过程右侧空白区显示播放平台、视频时长、是否合集及第几集、字幕情况(有无/内嵌/外部文件)
  3. 合集检测与联动(REQ-152):标题系列名/序号提取 → 档案检测系列名投票 + 记忆系列键 + 课程分组扩展
  4. 说话人分离弱化版(REQ-153):SpeakerEmbeddingExtractor 引擎接线 + VAD 段馈入 + 讲者切换事件;课堂助手使用说明提醒
  5. 语速停顿自适应(REQ-154):动态合并阈值 + 语速骤变事件

二、范围(需求追溯)

REQ 内容 验收要点 规划状态
REQ-148 最近画面按时间先后排列(用户需求) 缩略图条旧→新,新图追加末尾 已实现
REQ-149 ASR 未沉淀行多行展示 + 识别中按句拆行(用户需求) 识别中多句各占一行灰斜;连续定稿不覆盖丢失;定稿合并待沉淀 已实现
REQ-150 档案新增「未知」选项,无法识别时选中(用户需求) 零信号命中→候选 unknown→自动选中生效;参数默认档零回归 已实现
REQ-151 采集信息面板:平台/时长/合集集号/字幕情况 采集 30-60s 内信息齐全;播放器 OCR 识别时间与分P文本;字幕检测状态如实 已排期
REQ-152 合集检测与联动:extract_series/normalize_title + 档案系列名投票 + 记忆系列键 + 课程分组 标题 P/集/EP/括号/数字后缀正确识别(反例不误判);P1 与 P5 投票一致;选一次整系列生效;B站合集自动归组 已排期
REQ-153 说话人分离弱化版:引擎接线 + VAD 段馈入 + 切换事件 + 使用说明提醒 访谈/会议会话产出讲者切换时间轴;模型缺失降级无标注;使用说明含提醒 已排期
REQ-154 语速停顿自适应:动态合并阈值 + 语速骤变事件 机关枪说话人不再整段挂起;慢速说话人半句不丢;语速骤变事件落库 已排期

三、关键设计决策

  1. 信息面板数据全本地:平台=标题后缀规则(normalize_title,B站/YouTube/腾讯视频等剥离表);时长=播放器区域 OCR 时间文本(播放器区域检测已有,识别 当前/总时长 文本);合集=标题规则 + 播放器 OCR 分P文本(P2/12、第2集);字幕=subtitle_detect 实时状态。零网络请求。
  2. B站 p= 参数获取否决搜索接口:标题→搜索 API 反查 bvid→pagelist 拿分P——性能可行(两次请求 <1s 后台)但无 cookie 高频 412 风控、接口签名随前端变动、标题外发违背本地优先精神、同名视频搜错。替代=播放器 OCR(完全本地,顺带解决时长);搜索接口记为可选增强(需用户授权)。
  3. 合集检测纯规则:P/第X集/EP/括号/数字后缀五模式 + 边界反例(Python3/2026/UP主 不误判)+ 序号开头放弃(诚实降级);跨会话同系列 ≥2 确认合集。与 course_of(第X章前缀)合并为统一系列键。
  4. 说话人分离弱化版:不聚类身份、只标切换点(时间戳+置信度);sherpa-onnx SpeakerEmbeddingExtractor(A3 spike 已验证 1.13 可用)+ wespeaker 模型(Apache-2.0);会话后离线分析(session-audio WAV + VAD 段边界 → 每段 embedding → 相邻余弦,复用 speaker_change.rs 判定器);模型缺失 → 无讲者标注降级;产物/会话详情展示切换时间轴。
  5. 断句自适应:S-1 会话前段统计平均段前停顿(pause_ms 已落库)→ 合并 gap 从固定 600ms 参数化(asr_merge 阈值注入);S-2 speech_rate 已落库 → 段间骤变 → session_events 新事件(重点标注备数据,消费端后续接线)。

四、测试与验证

  • Rust 单测(实施中):series_detect 五模式+反例矩阵、平台后缀剥离、course_of 回归(第X章行为不变)、检测系列名投票一致性、ProfileMemory 系列键跨集命中+旧 JSON 兼容、断句自适应阈值统计/注入、语速骤变事件
  • 前端:npm run build 通过(TS 类型检查 + 打包);信息面板 UI 真机验证清单见下
  • 模型:wespeaker 说话人 embedding 模型(开发期手动下载至 models/,不入库;生产期捆绑/首启下载)

真机手动验证清单(实施完成后执行)

  1. 采集 B站视频:面板 30-60s 内显示平台=B站、总时长、合集集号(标题带 P 或播放器 OCR 识别)
  2. 采集无字幕视频:字幕状态显示"未检测到字幕";有字幕视频显示"内嵌/滚动字幕"
  3. 访谈/会议会话(模型就绪):会话详情出现讲者切换标记;模型缺失时无标记不报错
  4. 机关枪讲课(停顿 <600ms):段落粒度改善(不再整段挂起/停止时才冒)
  5. P1/P2 两个会话:档案检测结果一致;确认一次后 P2 直接生效(记忆系列键)

五、文件清单(实施中,按提交逐步更新)

Rust:series_detect.rs(新:normalize_title/extract_series/normalize_episode)· commands_session.rs(course_of 扩展)· video_profile.rs(ProfileMemory 系列键 + ObservedSignals.is_series)· commands_video.rs(检测入口系列名)· asr_merge.rs/live_session_persist.rs(动态合并阈值注入)· live_session_loop.rs(语速骤变事件)· live_session.rs/speaker_engine.rs(新:embedding 引擎接线)· session_events.rs(新事件类型)· commands_speaker.rs(新:会话讲者分析命令)· lib.rs(注册)· 测试文件若干

前端:types.ts(信息面板/讲者切换事件类型)· LiveActivityPanel.tsx(信息卡 UI)· SessionDetailPanel.tsx(讲者切换时间轴标记)· ProfileDetector.tsx/ClassroomPage.tsx(系列联动)

六、后续批次(本版本不做)

  • 讲者身份识别/聚类(A/B/C 时间轴归属,V1.0 模型分发波)
  • B站搜索接口反查(可选增强,需用户授权 + 降级设计)
  • 词级时间戳落库与"定位回听"(V1.0 升级 + schema 迁移)
  • 视频文件元数据提取展示(ffprobe 已捆绑,零成本,独立小批次)