录制内容转化为Obsidian笔记 是做什么的?
将一次会议或一次讲座转化为一个自包含、完全链接的Obsidian笔记库的一部分。两种模式共享相同的流水线、约定和验证步骤;它们的区别在于提取的内容和笔记的组织方式。
| 会议模式 | 讲座模式 | |
|---|---|---|
| 目的 | 记住决定了什么以及谁在何时做什么 | 随时快速重新学习知识 |
| 中心 | 每场会议一个会议中心 + 一个系列MOC,每次会议一条记录 | 每个讲座一个MOC |
| 主体笔记 | ADR风格的决策记录;持久知识的主题笔记 | 锚点笔记(密集)+ 原子笔记(每个笔记一个概念) |
| 可追溯性 | 决策和行动项上的转录时间戳 [00:12:34] | PDF++幻灯片链接 [[deck.pdf#page=5]];纯口头内容的时间戳 |
| 参考 | references/meeting-mode.md | references/lecture-mode.md |
<skill> 表示本文件所在的文件夹。
1. 流水线
materials ──► 1 setup ──► 2 transcribe ──► 3 pick mode ──► 4 note-writer ──► 5 verify ──► 6 report
config, scripts/ meeting or writes notes check_vault
python transcribe.py lecture (one subagent) scan_secrets
1.1 设置
首先记录开始时间:运行 date +%s 并保留该数字;验证只会检查在此之后写入的笔记。
读取 <skill>/config.toml。它设置了转录后端/模型/语言、说话人分离、notes.output_language、notes.default_mode 以及笔记库文件夹名称(notes_dir, moc_dir, meetings_dir, sources_dir;下面使用默认值)。脚本的解释器是 runtime.python;如果为空,则使用 ~/.local/share/recording-to-obsidian/venv/bin/python。称其为 $PY —— 这是一种约定:在命令中,完整写出解释器和脚本的文字路径,每次调用一个命令,不使用shell变量或 cd … && 链(代理权限规则匹配文字命令,变量使其无法检查)。如果该路径不存在,请告诉用户运行 install.sh(README)—— 不要将pip安装到用户自己的Python环境中。
在执行任何其他操作之前,先确定以下事实(只询问你无法推断的信息):
- vault — 用户的路径,如果当前工作目录包含
.obsidian/或用户说“此笔记库”,则使用当前工作目录;仅在其内部写入; - materials — 每个文件的绝对路径;按扩展名分类:音频/视频、字幕(
.srt/.vtt)、幻灯片(.pdf/.pptx)、笔记本/代码、图像/照片、文档; - title, series/course, date — 来自用户、文件名或材料;不要凭空编造日期或参与者列表(填写
TBD并说明); - output language — 使用
notes.output_language,除非用户指定了其他语言。
1.2 转录
对于每个没有匹配字幕文件(相同文件名主干)的录音,运行:
$PY <skill>/scripts/transcribe.py <recording> -o <scratch>/transcripts
<scratch>是笔记库外部的临时文件夹(例如$TMPDIR/recording-to-obsidian-<date>-<slug>),用于所有中间文件。- 可选的参数:
--model small(更快,结果较粗糙),--language en(跳过语言检测),--diarize(说话人标签;需要install.sh --diarize和diarize.hf_token_env指定的环境变量中的Hugging Face令牌)。首次运行会下载模型,可能需要几分钟;它会在stderr上打印进度——让它完成。 - 它会写入
<stem>.srt和<stem>.txt(每行一个[HH:MM:SS] Speaker N: text格式的片段),并打印JSON格式的摘要行(语言、模型、时长、说话人、清洗统计、文件路径)。保留该摘要:语言、模型和说话人分离信息应放入笔记的来源部分。 - 来自任何工具的现有字幕可以相同方式标准化:
$PY <skill>/scripts/transcribe.py talk.vtt -o <scratch>/transcripts(不涉及模型;重复循环会被折叠,并写入带时间戳的.txt)。 - 支持长时间录音:该脚本可以处理数小时的音频;不要拆分文件。
如果转录失败,报告错误行;$PY <skill>/scripts/transcribe.py --check 会显示缺少什么。
1.3 选择模式
明确的用户模式(或非 auto 的 notes.default_mode)优先。否则:
- 材料中包含幻灯片、笔记本、实验代码或讲义 → 讲座。
- 否则,阅读转录内容的前约5分钟,并浏览其余部分:
| 会议信号 | 讲座信号 |
|---|---|
| 多个发言人,各有相当的发言时间 | 一个主要发言人进行讲解 |
| 议程、状态更新、“我们进展到哪了……” | “今天我们将介绍……”,“上周我们看到了……” |
| 提案、权衡讨论、“我们就这么办”、“同意” | 定义、推导、示例练习、作业 |
| 负责人和截止日期:“你能在周五前处理这个吗?” | 听众提问是为了理解,而非决策 |
| 项目、客户、截止日期、风险 | 课程/讲座编号、阅读材料、作业 |
- 混合情况根据目的判断:设计评审、计划会、复盘会、汇报会和一对一对话是会议;录制的技术演讲、培训、研讨会和教程是讲座,即使包含一些讨论。
记录所选模式以及做出此决定的2-3个信号(它们将出现在报告中)。如果实在难以判断且可以询问,则询问;否则选择一个并说明原因。
1.4 执行模型:编排器 + 一个笔记编写器
阅读整个转录内容、逐页阅读幻灯片和笔记本文件,然后写入数十个文件会很快填满上下文窗口,因此将角色分离:
- 编排器 — 接收请求的会话。它执行步骤1.1–1.3(转录输出保留在磁盘上;它只读取足够多的转录内容以选择模式),然后将写入任务交给一个笔记编写器子代理,然后执行步骤1.5的验证并生成报告。
- 笔记编写器 — 一个子代理,在其自己的上下文中完成所选模式的整个写入任务:阅读所有材料、规划、编写、自我检查。一次会议或一次讲座可以舒适地放入一个上下文;不要将幻灯片或转录块拆分给多个代理(这会导致交叉引用丢失和笔记重复)。
在没有子代理工具可用,或者子代理无法完成工作需要(如图片处理、运行脚本、写入文件)时,请自行完成工作而非委托。在会议模式下,当会议足够短以至于指令和工作量差不多长时(大约15分钟以下的录音,且没有幻灯片或文档),你也可以直接写入。讲座模式始终使用笔记编写器,除非子代理不可用或无法完成工作:需要逐页阅读幻灯片,这属于编写器的上下文。在报告中说明你选择了哪种方式。验证(1.5)永远不会被跳过。对于多个会话,每个会话使用一个笔记编写器,当它们需要追加到同一个MOC时顺序执行。
给笔记编写器的指令——它开始时没有任何上下文,因此给它一切:
- 此技能文件的绝对路径;模式;需要遵循的文件:
references/meeting-mode.md或references/lecture-mode.md,以及references/note-templates.md、references/transcript-processing.md、references/mermaid-style.md; - 笔记库路径、临时文件夹、
$PY、输出语言、标题/系列/日期(或“推导”)、配置文件中的文件夹名称; - 所有材料和转录文件的绝对路径,以及转录摘要(语言、模型、说话人);
- 现有的系列/课程MOC和上一次会话的中心/MOC(如果有);用户特别要求的任何内容;
- 规则:仅在笔记库内写入;切勿修改预先存在的笔记,除非是文档化的追加操作;无秘密;
- 要返回的内容:第3节中的报告块以及任何它无法解决的内容。
1.5 验证(编排器)
当笔记编写器返回后,独立检查其工作,而非信任其摘要:
$PY <skill>/scripts/check_vault.py <vault> --since <epoch seconds when the job started>
$PY <skill>/scripts/scan_secrets.py <vault>/sources
check_vault.py 必须以 issues: 0 结束;除非有理由不修正(需说明原因),否则也要修复警告。它解析链接的方式与Obsidian相同(文件名或部分路径、不区分大小写、忽略 #heading/|alias、跳过代码块),因此它报告的任何损坏链接在Obsidian中都是损坏的。它检查:损坏的 [[links]]/嵌入/标记链接、不带 .pdf 的PDF++链接、frontmatter(title、type、date_created)、中心覆盖(每个新笔记都链接自一个MOC或会议中心;每个会议中心都链接自一个MOC)、秘密;对无连接的笔记、未样式化的Mermaid和歧义链接发出警告。
然后检查脚本无法检查的内容:
- 除了文档化的追加操作(系列MOC记录、被替代的决策状态、上一个讲座MOC的“下一个”链接)外,没有预先存在的笔记被更改;
- 会议模式:每个决策都有记录或明确标记为次要;每个行动项都有负责人(或
TBD)、截止日期(或TBD)和时间戳; - 讲座模式:MOC精确列出每个新笔记一次;满足讲座自查的粒度和锚点目标。
直接修复小问题;对于较大的问题,将其连同精确列表发回给笔记编写器。重新运行 check_vault.py,直到其报告0个问题。删除临时文件夹(它包含wav和页面图像),除非用户希望保留。
2. 共享约定
笔记库布局 —— 笔记是扁平的;导航来自MOC和中心,而非文件夹。
vault/
├── notes/ # 原子笔记、锚点笔记、决策笔记和主题笔记(扁平)
├── meetings/<series>/ # 会议中心:"YYYY-MM-DD <title>.md"
├── moc/<series or course>/ # 系列MOC(会议)/ 每个讲座一个MOC
└── sources/<series or course>/<YYYY-MM-DD or Lecture_NN>/
├── <prefix>_transcript.srt / .txt
├── <prefix>.pdf # 幻灯片,用于PDF++链接
├── slide_images/ whiteboard_photos/ notebooks/
└── structured_slides.json # 可选的逐页阅读记录
为复制到 sources/ 的每个文件添加系列/课程 + 会话前缀(Atlas_2026-11-12_transcript.srt、Optics101_L03.pdf、Optics101_L03_p08.jpg):Obsidian通过文件名解析链接,因此两个都包含 transcript.srt 或 page-08.jpg 的会话会发生交叉链接。文件夹名称使用系列/课程名称,并将空格替换为 -。
文件名 —— 使用人类可读的标题,无ID(会议中心是例外:它们以日期开头以便排序)。避免包含 / \ : * ? " < > | # ^ [ ];使用 — 代替 :。标题应足够具体以独立存在:Rate limits use a token bucket per API key.md,而不是 Rate limiting.md。
Frontmatter —— 每个笔记都以YAML frontmatter开头,至少包含 title、type 和 date_created。type 在会议模式中为 moc、meeting、decision 或 topic;在讲座模式中为 moc、anchor 或 atomic。模式特定的字段在 references/note-templates.md 中。标签使用全小写的英语kebab-case:一个系列/课程标签、2–4个主题标签、一个类型标签;在发明新标签之前,先重用笔记库中已有的标签。
语言 —— output_language = "auto" 表示:使用材料(转录内容检测到的语言或幻灯片的语言)的语言进行写作。当输出语言与材料的语言不同时,保留原始语言的技术术语,并在首次出现时提供注释——中文笔记记录英语会议:功能开关 (feature flag);英语笔记记录德语讲座:error propagation (Fehlerfortpflanzung)——然后使用读起来更自然的格式。代码、命令、路径、产品和工具名称从不翻译。标题遵循输出语言。
链接 —— 每个 [[wikilink]] 必须解析到笔记库中的一个笔记或文件。链接到现有笔记而非重复编写。当裸名称可能产生歧义时,使用路径([[sources/Atlas/2026-11-12/Atlas_2026-11-12_transcript.srt|transcript]])。PDF++页面链接始终保留 .pdf:[[Optics101_L03.pdf#page=5|Slide p.5 "Snell's law"]]。
时间戳 —— 对于每个仅来自口头表达的决策、行动项和主张,引用转录的 [HH:MM:SS]。它们是指向录音的审计追踪。
秘密 —— 切勿将凭据写入笔记库。在将笔记本或代码复制到 sources/ 之前,在副本上运行 $PY <skill>/scripts/scan_secrets.py --redact <copy>(值变为 <REDACTED>,变量名称保留)。会议中口头分享的密码、信用卡号或敏感的個人数据也不应记录——应写“以口头方式分享了凭据(此处未记录)”。
视觉元素 —— 在编写任何Mermaid图表之前,阅读 references/mermaid-style.md:其中包含调色板和保持图表正确渲染的规则。无效的语法比没有图表更糟糕。
模式输出
- 会议 →
references/meeting-mode.md:1个中心,每个重大决策1个决策记录,0–N个需要保留的知识的主题笔记,一条追加到系列MOC的记录(首次使用时创建),转录内容复制到sources/。 - 讲座 →
references/lecture-mode.md:1个MOC,对于正常的30多页幻灯片,生成8–15个锚点笔记,平均每张内容幻灯片至少有一个原子笔记,幻灯片/笔记本/转录内容复制到sources/。
3. 报告
会议模式:
Meeting 2026-11-12 — <title> (series: <series>) mode: meeting (signals: …)
Transcript: 00:41:07, mlx:whisper-large-v3-turbo, 3 speakers, en → notes en
Hub: meetings/<series>/2026-11-12 <title>.md
Decisions: 3 (records: 3) Action items: 7 (owner TBD: 1, due TBD: 2)
Topic notes: 2 Open questions: 2 Risks: 1
Series MOC: moc/<series>/MOC — <series>.md (entry appended)
check_vault: issues 0, warnings 0
Unresolved: <speakers not matched to names, unclear passages, …>
讲座模式:
Lecture NN — <topic> mode: lecture (signals: …)
Slides: 45 pages (content 37) Knowledge points: 68
Notes: 56 atomic + 12 anchor archetypes: concept=34, practice-demo=6, …
Notes per content slide: 1.5 Anchors with ≥2 rich elements: 12/12
Mermaid: 14 (types: sequence, mindmap, flowchart, …)
check_vault: issues 0, warnings 0
Unresolved: <page 21 diagram text missing, …>