v1.0.0 — 首个正式版(字幕优先 / doctor / 运行溯源)
course2md v1.0.0 — 首个正式版
把网课视频变成图文并茂的 Markdown / HTML 笔记。
本版本以「正确性审计 + 架构收敛」为主题:修复全部已知的静默错误结果与数据丢失类缺陷。
✨ 新特性
- 平台字幕优先
--transcript-source auto|subtitle|asr(默认auto)
平台人工字幕 > 自动字幕 > 本地 ASR;命中字幕时完全不抽音频、不加载模型。
本地视频支持同名.srt/.vttsidecar 字幕。
👉 实现 #1 — 感谢 @kernerydel 的建议 course2md doctor:环境体检——依赖工具、平台后端(CoreML/NPU)、
配置文件(含权限告警)、模型缓存状态,一次命令定位大多数环境问题。run.json运行溯源:每次运行记录版本、转写来源、provider/模型、统计与耗时。
「这份文稿到底是什么模型跑的」从此可查。structured.json增加schema_version与generator;Section增加end时间。--resume/--no-resume互斥参数真正生效。
🐛 修复
--no-resume此前完全无效(声明了但从未被读取)--no-download不再删除用户已有视频(此前结束时会误删非本次下载的 media.mp4)- checkpoint 运行身份:换模型/后端/切分长度后,旧进度自动作废重算,
不再产出「混用两个模型」的转写文本;空语音 chunk 也计入进度,不再重复识别;
写盘失败不再标记完成;中间行损坏硬报错而非静默跳过 - NPU 后端三连修:内嵌 Python worker 语法错误(
--provider npu此前完全无法启动)、
硬编码<|zh|>强制中文(英文课产生中文幻觉转写)、Qwen 失败静默回退 Whisper - GGUF 下载尊重
HF_ENDPOINT镜像(此前硬编码 huggingface.co)
👉 Fixes #2 — 感谢 @little-q-exist 的详细报告与根因分析 - 预检校验:
max_speech=0panic、--formats拼错跑到最后才报错、
provider×模型不兼容被静默忽略、api 缺 key 切完音频才发现——全部提前到毫秒级失败 - 相似度阈值文案方向修正(实际语义:阈值越高越敏感、截图越多)
- 配置路径展开
~;配置未知字段直接报错;~/.config权限告警
🔧 重构
provider/slide_mode/formats裸字符串 → typed enum(CLI/TOML/运行时同源)ManagedChild子进程生命周期(kill-on-drop,修复 NPU worker 进程泄漏)- 四个 ASR 后端的重复 chunk 循环收敛为统一执行器
- 跨页文本切点吸附句读,不再词中切断;模型选择器去除不可复现的营销话术
⚠️ 迁移提示
- 1.0 前的 ASR checkpoint 会在下次运行时自动作废重算(保证转写来源可追溯)
--transcript-source auto成为默认:有平台字幕的视频不再走本地 ASR;
如需旧行为请传--transcript-source asr
📦 安装
# macOS (Homebrew)
brew install mizorewww/tap/course2md
# 或直接下载下方对应平台二进制完整变更见 CHANGELOG.md。
🙏 感谢 @kernerydel 与 @little-q-exist —— 本版本的两个用户可见改进均来自你们的 issue。