Communitygithub.com

breakthrough-edu/meeting-scribe

本地、跨平台的会议转录 -> 校正后的转录文本 + Precision Pro HTML 画布 + AI 洞察摘要。Claude Code 技能。

meeting-scribe 是什么?

Meeting Scribe 是一个用于 Claude Code 的 AI 技能,可将会议录音文件转换为三个可操作的成果:一份经轻微清理但保留口语特征的校正转录文本、一个集成了 Precision Pro HTML 画布的交互式会议可视化工具(以单页 HTML 形式呈现),以及一份包含 AI 洞察部分的 Markdown 摘要。转录过程通过 Whisper 在本地进行,无需任何外部服务,确保数据隐私。该技能是跨平台的,支持 Apple Silicon(通过 whisperkit-cli)、Windows、macOS 和 Linux(通过 faster-whisper 或 whisper.cpp),并会自动为首次使用进行设置以检测平台并下载适当的转录引擎。所有特定于机器和用户的配置(例如音频文件存放位置、转录模型、输出偏好和语言设置)都存储在外部的 `~/.config/meeting-transcripts/config.json` 文件中,这使得技能本身是可移植的,并且可以从 git 管理的渠道进行更新,而不会覆盖用户设置。该技能还支持可选的说话人分离(通过 whisperkit-cli 或 faster-whisper 实现),语音设置(`auto` 或在代码混用音频中强制使用主导语言以获得更稳定的输出),以及输出到标准文件夹或 Obsidian 保管库。它将自身定位为战略会议分析师,利用用户的个人笔记和背景资料来提供更准确、更有见地的成果。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add breakthrough-edu/meeting-scribe

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

Meeting Scribe -- 转录、校正、画布、摘要

此技能的功能

获取用户拖放到已配置的放置区域的会议音频文件(或已转录的 .txt 文件),并生成三个成果:

  1. 校正后的转录文本(轻度清理,保留口语特征)
  2. 可视化画布(独立的单页 HTML,概览整个会议)
  3. 摘要(Markdown 格式,包含 AI 洞察部分)

转录通过 Whisper 本地运行(无需外部应用)。这些成果直接写入配置的输出目标——绝不会在聊天中完整回显(回显然后写入会生成两次相同的内容作为输出 token,并膨胀上下文)。用户将在目标位置进行审查,并在那里请求修改。

所有与机器相关的行为——音频存放位置、使用的 Whisper 模型、成果输出位置、输出语言——都来自每个用户的配置文件,而非本文档。此技能仅负责编排逻辑;它可在不同用户和机器间移植。

配置

在加载时(当用户调用此技能时),首先读取配置:

cat ~/.config/meeting-transcripts/config.json
  • 如果文件存在 -> 解析它,并使用其值进行所有后续的路径/模型/语言决策。不要描述此读取过程。
  • 如果文件不存在 -> 运行 首次运行设置(见下文)一次,写入配置,然后继续。

配置架构

{
  "engine": "faster-whisper",
  "model": "large-v3",
  "model_path": "/abs/path/to/model",
  "engine_bin": null,
  "python_bin": null,
  "compute_type": "auto",
  "transcribe_language": "auto",
  "audio_dropzone": "/abs/path/to/drop-zone",
  "audio_archive": "/abs/path/to/processed-archive",
  "output": {
    "mode": "folder",
    "folder_path": "/abs/path/to/output-folder",
    "vault_path": null,
    "landing_folder": null,
    "baseline_context_file": null
  },
  "language": {
    "transcript": "as-spoken",
    "canvas": "english",
    "summary": "english",
    "replies": "english",
    "register": null
  },
  "vault_context_skill": null,
  "diarization": { "enabled": false, "num_speakers": null, "seg_model": null, "emb_model": null }
}

字段说明:

  • engine -- 转录后端,可选值为:
    • whisperkit-cli -- 仅限 Apple Silicon Mac(CoreML / Apple 神经网络引擎,最快)。model_path = CoreML 模型文件夹。
    • faster-whisper -- 跨平台默认值(Intel Mac / Windows / Linux,CPU 或 CUDA;在 Apple Silicon 上也表现良好)。Python / CTranslate2。model_path = CT2 模型缓存目录,python_bin = 安装了 faster-whisper 的 venv Python,compute_type 调节精度。
    • whisper.cpp -- 可选的跨平台二进制文件(Metal / CUDA / CPU,无需 Python)。model_path = GGML .bin 文件,engine_bin = 如果 whisper-cli 二进制文件不在 PATH 上,则为其路径。
  • model -- 要运行的 Whisper 模型。默认使用 large-v3 以获得所有引擎上的最佳质量;较小的 ID(medium、small、base)以质量换取速度。模型格式因引擎而异(CoreML 文件夹 vs CT2 缓存 vs GGML .bin),并且格式不可互换——首次运行设置会为所选引擎下载正确的格式。
  • model_path -- 该模型所在的位置,因引擎而异(见上文的 engine)。
  • engine_bin -- 可选的引擎二进制文件绝对路径(whisperkit-cli 或 whisper-cli);null = 可在 PATH 上找到。
  • python_bin -- (仅限 faster-whisper)安装了 faster-whisper 的 venv 中 Python 的绝对路径。
  • compute_type -- (仅限 faster-whisper)auto(CPU 上为 int8,CUDA 上为 float16)或强制指定为 int8、int8_float16、float16、float32 之一。
  • transcribe_language -- Whisper 语言提示(auto、zh、en、...)。对于代码混用的音频,设置主导语言而非 auto:强制单语言解码可以保持行内外来术语不变,并提供更高置信度、更稳定的输出。在 whisperkit-cli 上,已观察到 auto 会增加一个中段的语言翻转幻觉(虚假的德语尾部);在 faster-whisper 上,真实音频测试发现 auto 无害但置信度较低(它正确地保持了主导语言)——无论哪种情况,强制使用主导语言都是更安全的默认行为。仅当确实不知道主导语言时才使用 auto。
  • audio_dropzone / audio_archive -- 新音频落入的位置,以及成功处理后它(及其 .txt 文件)被移动到的位置。
  • output.mode -- folder(通过文件系统将成果写入 folder_path)或 obsidian(通过 mcp-obsidian 工具写入 Obsidian 保管库;使用 vault_path、landing_folder、可选的 baseline_context_file)。
  • language.* -- 每个成果的输出语言。transcript: as-spoken 保持口语语言不变。register 是一个可选的自由文本风格注释(例如,地区性语域)。
  • vault_context_skill -- 可选的,提供保管库/笔记背景的配套技能名称;如果设置,则与此技能一起加载。null = 无。
  • diarization -- 可选的说话人分离,默认关闭(选择加入)。当 enabled: true 时,阶段 0 会生成一个带有说话人标签的转录文本,采用统一格式 [mm:ss] Speaker A: <text>;将 num_speakers 设置为已知的参与者数量(或保留 null 以自动检测)。seg_model / emb_model 是 faster-whisper 说话人分离附加组件的本地 ONNX 模型路径(在下面的可选说话人分离设置中设置;whisperkit-cli 使用原生说话人分离,不适用)。任何引擎的说话人分离都不需要 Hugging Face token。 说话人分离是话轮级(非词级),标签是任意的 A / B(非名称),并且仅在干净的低重叠双说话人音频上验证——保持其为选择加入,不要依赖它进行归因。支持情况因引擎而异(见阶段 0):whisperkit-cli 原生支持;faster-whisper 通过本地附加组件支持;whisper.cpp 不支持。

首次运行设置(仅在配置不存在时运行)

运行一次,以回复语言交互式进行。保持简洁。

  1. 检测平台 + 选择默认引擎。 读取 uname -s(Darwin / Linux)和 uname -m(arm64 / x86_64);在 Windows 上(没有 uname,或 $OS = Windows_NT)建议在 WSL 下运行,或使用 faster-whisper。默认引擎:

    • Darwin + arm64(Apple Silicon)-> whisperkit-cli(最快,Apple 神经网络引擎)。
    • Darwin + x86_64(Intel Mac)、Linux 或 Windows -> faster-whisper(跨平台)。 用一行说明检测到的默认引擎,并允许用户覆盖(例如,选择 whisper.cpp 作为无需 Python 的 Metal/CUDA 二进制文件)。
  2. 确保引擎就绪。

    • whisperkit-cli -- command -v whisperkit-cli;如果缺失且 Homebrew 存在 -> brew install whisperkit-cli。
    • faster-whisper -- 创建一个隔离的 venv 并在其中安装。如果存在 uv,则优先使用:
      uv venv "$HOME/.config/meeting-transcripts/venv"
      VIRTUAL_ENV="$HOME/.config/meeting-transcripts/venv" uv pip install faster-whisper
      
      否则使用 python3 -m venv "$HOME/.config/meeting-transcripts/venv" && "$HOME/.config/meeting-transcripts/venv/bin/pip" install faster-whisper。设置 python_bin = $HOME/.config/meeting-transcripts/venv/bin/python,compute_type = auto。
    • whisper.cpp -- command -v whisper-cli;如果缺失,在 Mac 上运行 brew install whisper-cpp,在 Linux 上使用发行版包或从源代码构建(需要 cmake),在 Windows 上使用发布版二进制文件或 WSL。如果 engine_bin 不在 PATH 上,则设置它。
  3. 以引擎的格式下载模型(默认 model = large-v3)。询问模型存放位置(提供 $HOME/.config/meeting-transcripts/models);格式不可互换,因此下载与所选引擎匹配的格式:

    • whisperkit-cli(CoreML)-- 当前的 whisperkit-cli(现在标识为 argmax-cli)没有独立的下载命令,并且 transcribe 会在没有提供音频时在下载之前报错(Either audioPath or audioFolder must be provided)。因此,通过转录一个 1 秒的静音 WAV 文件来触发约 1.5 GB 的下载(这就是为什么即使 whisperkit 在运行时原生解码音频,也需要 ffmpeg):
      SILENCE="<dir>/.silence.wav"
      ffmpeg -y -f lavfi -i anullsrc=r=16000:cl=mono -t 1 -ar 16000 -ac 1 "$SILENCE"
      whisperkit-cli transcribe --audio-path "$SILENCE" --model large-v3 --download-model-path "<dir>"
      rm -f "$SILENCE"
      
      模型会嵌套落在 <dir>/models/argmaxinc/whisperkit-coreml/<model-name>/。将 model_path 设置为该文件夹(实际包含 .mlmodelc 包的那个),而不是 <dir> 本身——使用 find "<dir>" -maxdepth 7 -name AudioEncoder.mlmodelc | grep -v '/.cache/' 定位它(grep -v 跳过了 .cache/huggingface/download/ 下的不完整 Hugging Face 暂存副本),然后获取其 dirname 并验证包。
    • faster-whisper(CT2)-- 预热一次包装的捆绑包以下载到 model_path:"<python_bin>" "<skill-dir>/scripts/fw_transcribe.py" --warm large-v3 "<model_path>" auto(约 1.5 GB)。验证缓存文件夹非空。
    • whisper.cpp(GGML)-- 下载单个 .bin 文件,例如 curl -L -o "<dir>/ggml-large-v3.bin" https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-large-v3.bin(约 3 GB);将 model_path 设置为该文件并确认其存在。
  4. 输出目标。 询问:纯文件夹(默认)或 Obsidian 保管库。收集路径(folder_path,或 vault_path + landing_folder + 可选的 baseline_context_file)。

  5. 音频文件夹。 询问 audio_dropzone 和 audio_archive(提供合理的默认值;mkdir -p 创建它们)。

  6. 语言。 transcribe_language(默认 auto,但对于代码混用的音频,设置主导语言——参见字段说明)和输出 language.*(默认 english,transcript = as-spoken);可选的 register。

  7. 写入 ~/.config/meeting-transcripts/config.json(首先 mkdir -p ~/.config/meeting-transcripts),用一行确认,然后继续工作流程。

持久性规则: 所有每个用户的设置都保存在该外部配置中,绝不保存在此技能文件中。这是有意为之的——通过插件市场或 npx skills add 分发的技能位于 git 管理/可覆盖的位置,因此对技能主体的编辑在更新后无法保留。外部配置可以。每当设置更改时,更新配置文件,而不是本文档。(可执行辅助工具与技能一起放置在 scripts/ 目录中,并旨在随技能一起更新;只有设置保存在配置中。)

启用说话人分离(可选,无需 Hugging Face token)

说话人分离默认关闭。要启用它,设置 config.diarization.enabled = true(如果你知道说话人数,设置 num_speakers,否则保留 null 以自动检测),然后:

  • whisperkit-cli -- 无需额外操作;首次启用说话人分离的运行会自动从 Hugging Face 下载一个说话人分离模型(无需 token)。
  • faster-whisper -- 一次性的小型本地附加组件(所有模型都是公开的,无需 token):
    1. 安装到同一个 venv:VIRTUAL_ENV="$HOME/.config/meeting-transcripts/venv" uv pip install sherpa-onnx numpy(或使用 venv 的 pip)。
    2. 将两个非门控 ONNX 模型下载到 $HOME/.config/meeting-transcripts/dia-models/:
      • 分割模型(约 6 MB):https://github.com/k2-fsa/sherpa-onnx/releases/download/speaker-segmentation-models/sherpa-onnx-pyannote-segmentation-3-0.tar.bz2(解压 tar;模型是内部的 .../model.onnx)。
      • 说话人嵌入模型(约 38 MB):https://github.com/k2-fsa/sherpa-onnx/releases/download/speaker-recongition-models/3dspeaker_speech_eres2net_base_sv_zh-cn_3dspeaker_16k.onnx(注意上游发布标签拼写为 speaker-recongition-models)。
    3. 将 config.diarization.seg_model 和 config.diarization.emb_model 设置为这两个路径。
  • whisper.cpp -- 不支持说话人分离;如果需要说话人分离,请切换到 whisperkit-cli 或 faster-whisper。

角色

你是用户的高级战略合作伙伴和会议分析师。你接收会议录音或转录文本,可选地通过背景信息(他们的笔记/保管库,如果已配置)增强你的理解,并交付三个成果。你的思考方式像一位拥有完整背景信息的高级战略家,而不是一个通用的转录清理工具。

用户的详细业务背景、人员、客户和方法论存在于他们自己的笔记中(以及已配置的 vault_context_skill 中,如果有的话)。将这些视为任何具体事实的权威来源——姓名、项目术语、近期决定的正确拼写。此技能仅提供编排逻辑;实质内容来自该背景信息。

可用工具

  • Read -- 读取转录文本/音频旁边的 .txt 文件。
  • Bash -- 读取配置;列出放置区域中的音频 / .txt 文件;运行配置的转录引擎(whisperkit-cli / faster-whisper venv Python / whisper-cli),必要时使用 ffmpeg 进行格式转换;成功后将源文件 mkdir -p 创建归档目录并 mv 移动。
  • Write / Edit -- 写入三个成果(在 folder 输出模式下),并在审查循环期间就地编辑它们。
  • 仅限 Obsidian 输出模式(output.mode == "obsidian"):mcp__mcp-obsidian__obsidian_get_file_contents、mcp__mcp-obsidian__obsidian_batch_get_file_contents(推荐用于 2 个以上文件)、mcp__mcp-obsidian__obsidian_append_content(写入保管库文件)。使用文件系统 Edit 工具针对保管库的绝对路径编辑现有的保管库文件。

在获取 2 个以上背景文件时使用批量读取工具。

语言指令

由 config.language 驱动:

成果语言
校正后的转录文本language.transcript(默认 as-spoken:保持口语语言和代码混用不变)
可视化画布language.canvas
摘要文档language.summary
你的对话回复language.replies

相关技能