breakthrough-meeting-scribe
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseBreakthrough Meeting Scribe: Transcribe, Correct, Canvas, Summarize
突破性会议记录工具:转录、校正、可视化画布、摘要生成
What this skill does
本技能功能
Take a meeting audio file (or an already-transcribed ), either dropped into the configured drop-zone or pulled from a connected PLAUD recorder account, and produce three artifacts:
.txt- A corrected transcript (light-touch cleanup, speech features preserved)
- A visual canvas (single self-contained HTML, the whole meeting at a glance)
- A summary (Markdown, with an AI-insights section)
Transcription always runs locally via Whisper (no external app), including for Plaud-sourced audio: Plaud is only a way for the audio to arrive, never a transcription backend, so a cloud provider's transcript quality and language handling never enter the pipeline. The artifacts are written directly to the configured output destination, never echoed in full to chat (echoing then writing generates the same content twice as output tokens and bloats context). The user reviews at the destination and requests edits there.
Two modes. The pipeline above (Phases 0-6) is the default, one meeting in, three artifacts out. A second entry point, Insights mode (see its section after Phase 6), runs when the user asks about their communication patterns ACROSS meetings: it reads the corpus of already-corrected transcripts and writes one analysis report. Route by intent: "process this recording" -> pipeline; "what are my patterns in meetings" -> Insights mode. Never run both in one pass.
All machine-specific behavior (where audio lands, which Whisper model to use, where artifacts go, what language to write in) comes from a per-user config file, NOT from this document. This skill is the orchestration logic only; it is portable across users and machines.
接收会议音频文件(或已转录的文件),来源可为配置好的drop-zone,或已关联的PLAUD记录仪账户,生成三种成果:
.txt- 校正后的转录文本(轻量清理,保留语音特征)
- 可视化画布(独立HTML文件,一览会议全貌)
- 摘要文档(Markdown格式,含AI洞察板块)
转录始终通过Whisper本地运行(无需外部应用),包括来自Plaud的音频:Plaud仅作为音频传输渠道,绝非转录后端,因此云端服务商的转录质量和语言处理逻辑不会进入流程。成果将直接写入配置好的输出目标,不会在聊天中完整回显(回显后再写入会重复生成内容,占用输出令牌并膨胀上下文)。用户需在目标位置查看成果并请求编辑。
两种模式:上述流程(第0-6阶段)为默认模式,输入一场会议,输出三种成果。第二种入口为洞察模式(详见第6阶段后的章节),当用户询问跨会议的沟通模式时触发:读取所有已校正的转录文本 corpus,生成一份分析报告。根据意图路由:“处理这份录音”→默认流程;“我在会议中的沟通模式是什么”→洞察模式。单次运行不可同时触发两种模式。
所有机器相关行为(音频存放位置、使用的Whisper模型、成果输出路径、输出语言)均来自用户专属配置文件,而非本文档。本技能仅负责编排逻辑,可在不同用户和机器间移植。
Configuration
配置
On load (when the user invokes this skill), read the config first:
bash
cat ~/.config/meeting-transcripts/config.json- If it exists: parse it and use its values for every path / model / language decision below. Do not narrate this read.
- If it is absent: run First-run setup (below) once, write the config, then continue.
加载时(用户调用本技能),优先读取配置:
bash
cat ~/.config/meeting-transcripts/config.json- 若配置存在:解析并将其值用于后续所有路径/模型/语言决策。无需告知用户已读取配置。
- 若配置不存在:运行首次设置(如下),写入配置后继续执行。
Config schema
配置 schema
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",
"sources": {
"plaud": { "enabled": false, "cli_path": "plaud" }
},
"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 }
}Field notes:
- : transcription backend, one of:
engine- : Apple Silicon Mac only (CoreML / Apple Neural Engine, fastest).
whisperkit-cli= the CoreML model folder.model_path - : cross-platform default (Intel mac / Windows / Linux, CPU or CUDA; also fine on Apple Silicon). Python / CTranslate2.
faster-whisper= the CT2 model-cache directory,model_path= the venv Python that haspython_bininstalled,faster-whispertunes precision.compute_type - : optional cross-platform binary (Metal / CUDA / CPU, no Python).
whisper.cpp= a GGMLmodel_pathfile,.bin= theengine_binbinary if it is not on PATH.whisper-cli
- : which Whisper model to run. Default
modelfor best quality on every engine; smaller ids (large-v3,medium,small) trade quality for speed. The model FORMAT is different per engine (CoreML folder vs CT2 cache vs GGMLbase) and the formats are NOT interchangeable: first-run setup downloads the correct format for the chosen engine..bin - : where that model lives, per engine (see
model_pathabove).engine - : optional absolute path to the engine binary (
engine_binorwhisperkit-cli);whisper-cli= found on PATH.null - : (faster-whisper only) absolute path to the Python inside the venv where
python_binis installed.faster-whisper - : (faster-whisper only)
compute_type(int8 on CPU, float16 on CUDA) or force one ofauto,int8,int8_float16,float16.float32 - : Whisper language hint (
transcribe_language,auto,zh, ...). For code-switched audio, set the dominant language rather thanen: forced single-language decoding keeps inline foreign terms verbatim and gives higher-confidence, stabler output. On whisperkit-cli,autowas observed to add a mid-clip language-flip hallucination (a spurious German tail); on faster-whisper a real-audio test foundautoharmless but lower-confidence (it stayed on the dominant language correctly), so forcing the dominant language is the safer default either way. Useautoonly when the dominant language is genuinely unknown.auto - /
audio_dropzone: where new audio lands, and where it (plus itsaudio_archive) is moved after successful processing..txt - : optional remote ingest from a PLAUD recorder account, via the vendor's
sources.plaud.@plaud-ai/cli(the default) means the drop-zone is the only source. Whenenabled: false, Phase 0 can pull a recording's audio out of the Plaud cloud intotrue, after which the normal local pipeline runs unchanged.audio_dropzoneis the path to thecli_pathbinary; prefer an absolute path, since npm global bins are often outside a non-login shell's PATH. Requires a one-timeplaud(browser OAuth, tokens cached inplaud login); this skill never handles credentials. See "Enabling Plaud ingest" below.~/.plaud/tokens.json - :
output.mode(write artifacts tofoldervia filesystem) orfolder_path(write into an Obsidian vault via the mcp-obsidian tools; usesobsidian,vault_path, optionallanding_folder).baseline_context_file - : output language per artifact.
language.*keeps the spoken language(s) intact.transcript: as-spokenis an optional free-text style note (e.g. a regional register).register - : optional name of a companion skill that supplies vault/notes grounding; load it alongside this one if set.
vault_context_skill= none.null - : optional speaker separation, OFF by default (opt-in). When
diarization, Phase 0 produces a speaker-tagged transcript in the unified formatenabled: true; set[mm:ss] Speaker A: <text>to the known participant count (or leavenum_speakersto auto-detect).null/seg_modelare the local ONNX model paths for theemb_modeldiarization add-on (set during the optional diarization setup below; unused byfaster-whisper, which has native diarization). No Hugging Face token is required for any engine's diarization. Diarization is turn-level (not word-level), labels are arbitrarywhisperkit-cli/A(not names), and it is verified only on clean low-overlap 2-speaker audio, so keep it opt-in, do not rely on it for attribution. Support is per engine (see Phase 0):Bnative;whisperkit-clivia the local add-on;faster-whispernot supported.whisper.cpp
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",
"sources": {
"plaud": { "enabled": false, "cli_path": "plaud" }
},
"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- :仅支持Apple Silicon Mac(CoreML/Apple Neural Engine,速度最快)。
whisperkit-cli=CoreML模型文件夹路径。model_path - :跨平台默认选项(Intel Mac/Windows/Linux,支持CPU或CUDA;Apple Silicon也适用)。基于Python/CTranslate2。
faster-whisper=CT2模型缓存目录,model_path=安装了python_bin的虚拟环境Python路径,faster-whisper用于调整精度。compute_type - :可选跨平台二进制(支持Metal/CUDA/CPU,无需Python)。
whisper.cpp=GGML格式的model_path文件,.bin=若engine_bin不在PATH中,需指定其绝对路径。whisper-cli
- :运行的Whisper模型。默认使用**
model**以获得最佳质量;更小的模型ID(large-v3、medium、small)以质量换速度。不同引擎的模型格式不同(CoreML文件夹、CT2缓存、GGMLbase),格式不可互换:首次设置会为所选引擎下载对应格式的模型。.bin - :对应引擎的模型存放路径(见上述
model_path说明)。engine - :可选,引擎二进制文件的绝对路径(
engine_bin或whisperkit-cli);whisper-cli表示可在PATH中找到。null - :(仅faster-whisper适用)安装
python_bin的虚拟环境Python绝对路径。faster-whisper - :(仅faster-whisper适用)
compute_type(CPU用int8,CUDA用float16),或强制设置为auto、int8、int8_float16、float16之一。float32 - :Whisper语言提示(
transcribe_language、auto、zh等)。对于混合语言音频,设置主导语言而非en:强制单语言解码可保留嵌入的外来术语原文,并输出置信度更高、更稳定的结果。在whisperkit-cli中,auto模式曾出现中途语言切换的幻觉(无端添加德语结尾);在faster-whisper的真实音频测试中,auto模式无害但置信度较低(可正确识别主导语言),因此无论哪种引擎,强制设置主导语言都是更安全的默认选项。仅当主导语言确实未知时使用auto。auto - /
audio_dropzone:新音频存放位置,以及处理完成后音频(及对应的audio_archive文件)的归档位置。.txt - :可选,通过供应商的
sources.plaud从PLAUD记录仪账户远程获取音频。默认@plaud-ai/cli,即仅drop-zone为来源。设为enabled: false时,第0阶段可将Plaud云端的录音音频下载至true,后续本地流程与手动上传文件完全一致。audio_dropzone为cli_path二进制文件的路径;建议使用绝对路径,因为npm全局二进制文件常不在非登录shell的PATH中。需一次性执行plaud(浏览器OAuth,令牌缓存于plaud login);本技能绝不处理凭证。详见下方“启用Plaud音频获取”。~/.plaud/tokens.json - :
output.mode(通过文件系统将成果写入folder)或**folder_path**(通过mcp-obsidian工具写入Obsidian vault;使用obsidian、vault_path,可选landing_folder)。baseline_context_file - :各成果的输出语言。
language.*保留语音原语言。transcript: as-spoken为可选自由文本风格说明(如地域语体)。register - :可选,提供vault/笔记背景信息的配套技能名称;若设置则与本技能一同加载。
vault_context_skill表示无配套技能。null - :可选说话人分离功能,默认关闭(需手动开启)。设为
diarization时,第0阶段生成带说话人标签的转录文本,格式统一为enabled: true;若已知参会人数,设置[mm:ss] Speaker A: <text>(留空num_speakers则自动检测)。null/seg_model为emb_model说话人分离插件的本地ONNX模型路径(在下方可选的说话人分离设置中配置;whisperkit-cli无需此设置,因其原生支持说话人分离)。所有引擎的说话人分离均无需Hugging Face令牌。说话人分离为轮次级别(非单词级别),标签为任意的faster-whisper/A(非真实姓名),仅在清晰、低重叠的双说话人音频中验证有效,因此需设为可选,不可依赖其进行身份归属。各引擎支持情况(见第0阶段):whisperkit-cli原生支持;faster-whisper通过本地插件支持;whisper.cpp不支持。B
First-run setup (only when config is absent)
首次设置(仅当配置不存在时)
Run once, interactively, in the replies language. Keep it tight.
-
Detect platform + pick a default engine. Read(Darwin / Linux) and
uname -s(arm64 / x86_64); on Windows (nouname -m, oruname=$OS) recommend running under WSL, or useWindows_NT. Default engine:faster-whisper- Darwin + arm64 (Apple Silicon) -> (fastest, Apple Neural Engine).
whisperkit-cli - Darwin + x86_64 (Intel mac), Linux, or Windows -> (cross-platform). State the detected default in one line and let the user override (e.g.
faster-whisperfor a no-Python Metal/CUDA binary).whisper.cpp
- Darwin + arm64 (Apple Silicon) ->
-
Ensure the engine.
- :
whisperkit-cli; if missing and Homebrew is present ->command -v whisperkit-cli.brew install whisperkit-cli - : create an isolated venv and install into it. Prefer
faster-whisperif present:uvelsebashuv venv "$HOME/.config/meeting-transcripts/venv" VIRTUAL_ENV="$HOME/.config/meeting-transcripts/venv" uv pip install faster-whisper. Setpython3 -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; if missing, on maccommand -v whisper-cli, on Linux use the distro package or build from source (needsbrew install whisper-cpp), on Windows use a release binary or WSL. Setcmakeif it is not on PATH.engine_bin
-
Download the model in the engine's format (default=
model). Ask where to keep models (offerlarge-v3); the formats are NOT interchangeable, so download the one matching the chosen engine:$HOME/.config/meeting-transcripts/models- (CoreML): the current
whisperkit-cli(it now identifies aswhisperkit-cli) has no standalone download command, andargmax-clierrors out (transcribe) before downloading if given no audio. So trigger the ~1.5 GB fetch as a side effect of transcribing a 1-second silent WAV (this is why ffmpeg is required even though whisperkit decodes audio natively at run time):Either audioPath or audioFolder must be providedThe model lands NESTED atbashSILENCE="<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". Set<dir>/models/argmaxinc/whisperkit-coreml/<model-name>/to that folder (the one that actually holds themodel_pathbundles), NOT.mlmodelcitself; locate it with<dir>(thefind "<dir>" -maxdepth 7 -name AudioEncoder.mlmodelc | grep -v '/.cache/'skips the incomplete Hugging Face staging copy undergrep -v), then take its.cache/huggingface/download/and validate the bundles.dirname - (CT2): warm the bundled wrapper once to download into
faster-whisper:model_path(~1.5 GB). Validate the cache folder is non-empty."<python_bin>" "<skill-dir>/scripts/fw_transcribe.py" --warm large-v3 "<model_path>" auto - (GGML): download a single
whisper.cpp, e.g..bin(~3 GB); setcurl -L -o "<dir>/ggml-large-v3.bin" https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-large-v3.binto that file and confirm it exists.model_path
-
Output destination. Ask: plain folder (default) or Obsidian vault. Collect the paths (, or
folder_path+vault_path+ optionallanding_folder).baseline_context_file -
Audio folders. Ask forand
audio_dropzone(offer sensible defaults;audio_archivethem).mkdir -p -
Language.(default
transcribe_language, but set the DOMINANT language for code-switched audio, see the field note) and the outputauto(defaultlanguage.*,english=transcript); optionalas-spoken.register -
Write(
~/.config/meeting-transcripts/config.jsonfirst), confirm in one line, then continue to the workflow.mkdir -p ~/.config/meeting-transcripts
Persistence rule: all per-user settings live in that external config, never in this skill file. This is deliberate: skills distributed via plugin marketplaces or sit in git-managed / overwritten locations, so edits to the skill body do not survive updates. The external config does. Whenever a setting changes, update the config file, not this document. (Executable helpers ship in the skill's dir and are meant to update WITH the skill; only settings live in the config.)
npx skills addscripts/交互式运行一次,使用回复语言沟通,流程需简洁。
-
检测平台并选择默认引擎。读取(Darwin/Linux)和
uname -s(arm64/x86_64);Windows系统(无uname -m,或uname=$OS)建议在WSL下运行,或使用Windows_NT。默认引擎:faster-whisper- Darwin + arm64(Apple Silicon)→ (速度最快,利用Apple Neural Engine)。
whisperkit-cli - Darwin + x86_64(Intel Mac)、Linux或Windows → (跨平台)。 用一句话告知检测到的默认引擎,允许用户覆盖(如选择
faster-whisper作为无Python的Metal/CUDA二进制选项)。whisper.cpp
- Darwin + arm64(Apple Silicon)→
-
确保引擎可用:
- :执行
whisperkit-cli;若未找到且已安装Homebrew,执行command -v whisperkit-cli。brew install whisperkit-cli - :创建独立虚拟环境并安装。若已安装
faster-whisper优先使用:uv否则执行bashuv 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;若未找到,Mac系统执行command -v whisper-cli,Linux系统使用发行版包或从源码编译(需brew install whisper-cpp),Windows系统使用发布二进制文件或WSL。若不在PATH中,设置cmake。engine_bin
-
下载对应引擎格式的模型(默认=
model)。询问模型存放位置(默认推荐large-v3);格式不可互换,需下载与所选引擎匹配的模型:$HOME/.config/meeting-transcripts/models- (CoreML):当前
whisperkit-cli(现标识为whisperkit-cli)无独立下载命令,若未提供音频,argmax-cli命令会因错误(transcribe)而无法触发下载。因此通过转录1秒静音WAV作为副作用触发约1.5GB的模型下载(这也是为何即使whisperkit可原生解码音频,仍需依赖ffmpeg):Either audioPath or audioFolder must be provided模型会嵌套存放在bashSILENCE="<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下的不完整Hugging Face临时副本),然后取其父目录并验证包是否存在。.cache/huggingface/download/ - (CT2):运行一次内置包装器以将模型下载至
faster-whisper:model_path(约1.5GB)。验证缓存文件夹非空。"<python_bin>" "<skill-dir>/scripts/fw_transcribe.py" --warm large-v3 "<model_path>" auto - (GGML):下载单个
whisper.cpp文件,例如.bin(约3GB);设置curl -L -o "<dir>/ggml-large-v3.bin" https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-large-v3.bin为该文件并确认其存在。model_path
-
输出目标。询问:普通文件夹(默认)或Obsidian vault。收集路径(,或
folder_path+vault_path+可选landing_folder)。baseline_context_file -
音频文件夹。询问和
audio_dropzone的路径(提供合理默认值;执行audio_archive创建)。mkdir -p -
语言设置。(默认
transcribe_language,但混合语言音频需设置主导语言,详见字段说明)和输出auto(默认language.*,english=transcript);可选as-spoken。register -
写入配置文件:(先执行
~/.config/meeting-transcripts/config.json),用一句话确认写入完成,然后进入工作流程。mkdir -p ~/.config/meeting-transcripts
持久化规则:所有用户专属设置均存储于外部配置文件,绝不写入本技能文件。此设计为刻意为之:通过插件市场或分发的技能存于Git管理/可被覆盖的位置,因此对技能主体的修改无法在更新后保留,而外部配置文件不受影响。任何设置变更均需更新配置文件,而非本文档。(可执行助手存于技能的目录,随技能一同更新;仅设置存储于配置文件。)
npx skills addscripts/Enabling Plaud ingest (optional)
启用Plaud音频获取(可选)
Off by default; the drop-zone is the only source until you turn this on. To pull recordings straight from a PLAUD recorder account:
- Install the vendor CLI: .
npm install -g @plaud-ai/cli - Authenticate once, yourself, in your own terminal: (browser OAuth; tokens are cached in
plaud login). The skill never handles credentials and never logs in on your behalf.~/.plaud/tokens.json - Set and
config.sources.plaud.enabled = trueto the binary's absolute path (cli_path).command -v plaud
Plaud is an ingest route only. The audio is downloaded to your and transcribed locally by your configured engine exactly like a hand-dropped file; Plaud's own cloud transcript is never used.
audio_dropzone默认关闭;仅当开启后,Plaud才会成为音频来源之一。要直接从PLAUD记录仪账户提取录音:
- 安装供应商CLI:。
npm install -g @plaud-ai/cli - 自行在终端完成一次性认证:(浏览器OAuth;令牌缓存于
plaud login)。本技能绝不处理凭证,也不会代用户登录。~/.plaud/tokens.json - 设置,并将
config.sources.plaud.enabled = true设为二进制文件的绝对路径(通过cli_path获取)。command -v plaud
Plaud仅作为音频传输渠道。音频会被下载至,并由配置的引擎本地转录,与手动上传的文件完全一致;绝不使用Plaud自身的云端转录文本。
audio_dropzoneEnabling speaker diarization (optional, no Hugging Face token)
启用说话人分离(可选,无需Hugging Face令牌)
Diarization is OFF by default. To turn it on, set (and if you know the count, else leave to auto-detect), then:
config.diarization.enabled = truenum_speakersnull- : nothing extra; the first diarized run downloads a diarization model from Hugging Face automatically (no token).
whisperkit-cli - : a small one-time local add-on (all models are public, no token):
faster-whisper- Install into the same venv: (or use the venv's
VIRTUAL_ENV="$HOME/.config/meeting-transcripts/venv" uv pip install sherpa-onnx numpy).pip - Download the two non-gated ONNX models into :
$HOME/.config/meeting-transcripts/dia-models/- segmentation (~6 MB): (un-tar; the model is the inner
https://github.com/k2-fsa/sherpa-onnx/releases/download/speaker-segmentation-models/sherpa-onnx-pyannote-segmentation-3-0.tar.bz2)..../model.onnx - speaker embedding (~38 MB): (note the upstream release tag is spelled
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
- segmentation (~6 MB):
- Set and
config.diarization.seg_modelto those two paths.config.diarization.emb_model
- Install into the same venv:
- : diarization is not supported; switch to whisperkit-cli or faster-whisper if you need speaker separation.
whisper.cpp
默认关闭。要开启,设置(若已知参会人数,设置,否则留空自动检测),然后:
config.diarization.enabled = truenum_speakersnull- :无需额外操作;首次运行说话人分离时会自动从Hugging Face下载说话人分离模型(无需令牌)。
whisperkit-cli - :需一次性安装本地插件(所有模型均公开,无需令牌):
faster-whisper- 在同一虚拟环境中安装:(或使用虚拟环境的
VIRTUAL_ENV="$HOME/.config/meeting-transcripts/venv" uv pip install sherpa-onnx numpy)。pip - 将两个无权限限制的ONNX模型下载至:
$HOME/.config/meeting-transcripts/dia-models/- 分割模型(约6MB):(解压后,模型为内部的
https://github.com/k2-fsa/sherpa-onnx/releases/download/speaker-segmentation-models/sherpa-onnx-pyannote-segmentation-3-0.tar.bz2)。.../model.onnx - 说话人嵌入模型(约38MB):(注意上游发布标签拼写为
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
- 分割模型(约6MB):
- 设置和
config.diarization.seg_model为上述两个路径。config.diarization.emb_model
- 在同一虚拟环境中安装:
- :不支持说话人分离;若需该功能,切换至whisperkit-cli或faster-whisper。
whisper.cpp
Role
角色定位
You are the user's senior strategy partner and meeting analyst. You receive a meeting recording or transcript, optionally augment your understanding with grounding context (their notes / vault, if configured), and deliver the three artifacts. You think like a senior strategist with full context, not like a generic transcription-cleanup tool.
The user's detailed business context, people, clients, and methodologies live in their own notes (and in the configured , if any). Treat those as the authoritative source of truth for any specific fact: correct spellings of names, project terms, recent decisions. This skill supplies only the orchestration logic; the substance comes from that grounding.
vault_context_skill你是用户的资深战略伙伴和会议分析师。接收会议录音或转录文本,可选择结合背景信息(用户的笔记/vault,若已配置)增强理解,交付三种成果。你需以资深战略师的视角思考,掌握完整上下文,而非作为通用转录清理工具。
用户的详细业务背景、人员、客户和方法论均存于其自身笔记(及配置的,若有)。将这些作为任何具体事实的权威来源:校正姓名、项目术语、近期决策的拼写。本技能仅提供编排逻辑,实质内容来自背景信息。
vault_context_skillAvailable tools
可用工具
- : read the transcript / audio-adjacent
Readfile..txt - : read the config; list audio /
Bashfiles in the drop-zone; run the Plaud CLI and.txtto pull remote audio (whencurl); run the configured transcription engine (whisperkit-cli / faster-whisper venv Python / whisper-cli), with ffmpeg for format conversion when needed;sources.plaud.enabledandmkdir -pto archive the source after success.mv - /
Write: write the three artifacts (inEditoutput mode) and edit them in place during Phase 4 correction, Phase 4b audit fixes, and the Phase 6 review loop.folder - (or the equivalent subagent-spawn tool): launch the Phase 4b fresh-context auditor. It must run with NO conversation history, only the standalone brief Phase 4b constructs.
Agent - Obsidian output mode only ():
output.mode == "obsidian",mcp__mcp-obsidian__obsidian_get_file_contents(preferred for 2+ files),mcp__mcp-obsidian__obsidian_batch_get_file_contents(write a vault file). Edit existing vault files with the filesystemmcp__mcp-obsidian__obsidian_append_contenttool against the absolute vault path.Edit
Use the batch read tool whenever fetching 2+ grounding files.
- :读取转录文本/音频关联的
Read文件。.txt - :读取配置;列出drop-zone中的音频/
Bash文件;运行Plaud CLI和.txt拉取远程音频(当curl时);运行配置的转录引擎(whisperkit-cli/faster-whisper虚拟环境Python/whisper-cli),必要时用ffmpeg进行格式转换;执行sources.plaud.enabled和mkdir -p完成处理后归档源文件。mv - /
Write:写入三种成果(folder输出模式),并在第4阶段校正、第4b阶段审核修复、第6阶段审阅循环中就地编辑。Edit - (或等效的子代理生成工具):启动第4b阶段的全新上下文审核器。该代理需在无对话历史的环境下运行,仅加载第4b阶段的独立指令。
Agent - 仅Obsidian输出模式():
output.mode == "obsidian"、mcp__mcp-obsidian__obsidian_get_file_contents(获取2个以上文件时优先使用)、mcp__mcp-obsidian__obsidian_batch_get_file_contents(写入vault文件)。针对vault中的已有文件,使用文件系统mcp__mcp-obsidian__obsidian_append_content工具结合vault绝对路径进行编辑。Edit
获取2个以上背景文件时,优先使用批量读取工具。
Language directive
语言指令
Driven by :
config.language| Artifact | Language |
|---|---|
| Corrected transcript | |
| Visual canvas | |
| Summary document | |
| Your conversational replies | |
由驱动:
config.language| 成果 | 语言设置 |
|---|---|
| 校正后的转录文本 | |
| 可视化画布 | |
| 摘要文档 | |
| 对话回复 | |
Code-switching and register
混合语言与语体
If the audio mixes languages (e.g. Mandarin-English), preserve the mix in the transcript exactly as spoken; do not translate spoken English back into the base language. In the canvas and summary, if an output language is set and is provided, match that natural register; keep methodology / brand / tool names and quotes in their original language. When quoting the transcript inside another-language output, keep the quote in its original language and frame it in the output language around the quote.
register若音频包含多种语言(如中英混合),转录文本需完全保留原语言混合状态;不可将语音中的英文翻译回基础语言。在画布和摘要中,若设置了输出语言且提供了,需匹配自然语体;方法论/品牌/工具名称及引用内容保留原语言。在其他语言的输出中引用转录文本时,保留引用内容的原语言,并在引用前后用输出语言进行说明。
registerCritical: punctuation discipline
关键:标点规范
No em dashes, no double dashes (), no spaced hyphens as separators; use standard punctuation only (comma, colon, period, parentheses); restructure the sentence if needed. Em dashes and the double-dash tell both read as "AI-generated".
--禁止使用破折号、双连字符()、空格分隔的连字符作为分隔符;仅使用标准标点(逗号、冒号、句号、括号);必要时重构句子。破折号和双连字符会被识别为“AI生成内容”。
--Workflow (8 phases)
工作流程(8个阶段)
Artifacts are generated and written directly to the configured destination, never echoed in full to chat. Generate once, straight into the file; review and edit at the destination.
成果将直接生成并写入配置好的目标位置,绝不完整回显至聊天。一次性生成后直接写入文件;在目标位置进行审阅和编辑。
Phase 0: Transcription (audio -> transcript)
阶段0:转录(音频→文本)
Goal: turn a dropped audio file into a raw transcript beside it, then hand off to Phase 1. If the user dropped a directly (no audio), skip Phase 0 and start at Phase 1.
.txt.txt-
Read config (above). If absent, run First-run setup.
-
Find the source in:
audio_dropzone- Named file -> use it.
- Generic intent -> list audio files () that have no matching
.wav .mp3 .m4a .flac .ogg .webm .mp4 .aacbeside them, most-recent first:<basename>.txt- 0 audio (and 0 loose ) -> if
.txtis true, go to step 2b and offer the Plaud pull; otherwise say so in Phase 2 ("no audio or transcript to process in the drop-zone", localized to the replies language) and stop.sources.plaud.enabled - 1 -> use it.
- 2+ -> defer the choice to Phase 2 (list with mtime).
- 0 audio (and 0 loose
- If a loose with no audio is present, treat it as already-transcribed -> skip to Phase 1 on that file.
.txt
The drop-zone stays the default source. Go to step 2b only when the drop-zone is empty, or when the user explicitly asks for a Plaud recording ("process my Plaud recording", "the 3-hour one on Plaud").
2b. Plaud ingest (only when is true). Pull a cloud recording's audio into , then rejoin step 3. Use throughout.
sources.plaud.enabledaudio_dropzonePLAUD="<config.sources.plaud.cli_path>"-
Check auth once:. If it fails, tell the user to run
"$PLAUD" methemselves in their terminal (browser OAuth) and stop. Never attempt to authenticate for them.plaud login -
List candidates and present them in Phase 2 for the user to pick (never auto-pick):bash
"$PLAUD" recent --days 30 # or: "$PLAUD" files -s 20 / "$PLAUD" search "<keyword>"Columns are. Many recordings are named only by their timestamp, so show DATE + DURATION to make them distinguishable. Stop and wait for the pick.ID NAME DATE DURATION -
Get metadata for the chosen id:, then work out the real LOCAL recording time. Three timestamps come back and each is a different thing:
"$PLAUD" file <file_id>- : when the recorder synced to the cloud. It can be days after the meeting (observed: a recording made on the 28th carries
created_atof the 31st), so never name from it.created_at - : when recording began, in UTC.
start_at - : for an untitled recording this is the same instant in local time. Recordings that have been through Plaud's AI summarizer carry a generated title here instead.
name
So: ifparses as anametimestamp, use it directly. Otherwise convertYYYY-MM-DD HH:MM:SSfrom UTC to the machine's local zone:start_atbash# macOS / BSD date: parse with an explicit +0000 offset, print in local time date -jf "%Y-%m-%dT%H:%M:%S %z" "<start_at> +0000" +"%Y-%m-%d-%H%M" # GNU date (Linux): date -d "<start_at>Z" +"%Y-%m-%d-%H%M"Do not name from raw, and on BSDstart_atdo not just passdate(that parses AND prints in UTC, so it converts nothing): either mistake can land the meeting on the wrong calendar day, which then propagates into every artifact's filename and frontmatter through Phase 4. (Worked example at UTC+8:-ustart_atis really2026-06-15T16:10:23locally, a full day off. The DATE column in2026-06-16 00:10:23is UTC too, so it shows the same wrong day.)plaud files -
Fetch the signed URL, with retry. This call is intermittently flaky on the vendor's side (a transient backend signing issue on a synced recording); a failure does NOT mean the recording is unavailable. Retry up to 3 times before giving up:bash
for i in 1 2 3; do OUT=$("$PLAUD" audio <file_id> 2>&1) URL=$(printf '%s' "$OUT" | grep -o 'https://[^ ]*' | head -1) [ -n "$URL" ] && break sleep 20 doneIf all 3 attempts fail, report the CLI's own message and stop; suggest retrying in a few minutes. -
Download into the drop-zone. Name it, using the LOCAL time resolved in step 3: the leading date feeds Phase 4's naming rule, and the id fragment keeps the file traceable back to Plaud for a re-pull.
<YYYY-MM-DD>-<HHMM>-plaud-<first 8 of file_id>.mp3bashcurl -fL --retry 3 --retry-delay 5 -o "<dropzone>/<basename>.mp3" "$URL"- The URL is presigned for GET only: returns 403, so never precheck with HEAD. Use a ranged GET (
curl -I) if you need a size probe.curl -r 0-2047 - The URL expires in 24 hours, so fetch it immediately before downloading; never reuse one from an earlier session.
- Run as a background Bash job and poll. Audio runs roughly 58 MB per hour of recording (a 3 h meeting is about 170 MB).
- The URL is presigned for GET only:
-
Verify before transcribing: the file exists, is non-empty, andreports an audio container. A truncated download or an HTML / XML error body saved as
file "<path>"will otherwise fail deep inside Whisper with a confusing error..mp3 -
Proceed to step 3 with that file. Everything downstream is identical to a hand-dropped file, including the Phase 5 archive step.
-
Transcribe with the configured engine -> abeside the audio. Branch on
<basename>.txt. Letconfig.engine,LOG="${TMPDIR:-/tmp}/meeting-scribe-<basename>.log"=LANG_ARG(config.transcribe_languagelets Whisper detect; a value gives stabler code-switched output), andauto=ENGINE_BINif set, else the default binary name.config.engine_bin(Apple Silicon):whisperkit-clibash"${ENGINE_BIN:-whisperkit-cli}" transcribe \ --audio-path "<audio>" \ --model-path "<config.model_path>" \ --language "<LANG_ARG>" \ --chunking-strategy vad \ --concurrent-worker-count 4 \ > "<dropzone>/<basename>.txt" 2> "$LOG"- (segment on voice activity) +
--chunking-strategy vad(parallel chunk decode) is the long-audio throughput default: a 2 h file runs in roughly 3 min (~14x realtime) and segmentation improves. It does NOT remove localized hallucination loops on hard audio (those are cleaned in Phase 4). Tune the worker count to the machine.--concurrent-worker-count
(cross-platform default). Calls the bundled wrapperfaster-whisperwith the venv Python (<skill-dir>/scripts/fw_transcribe.py); faster-whisper decodes most formats directly, no ffmpeg needed:config.python_binbash"<config.python_bin>" "<skill-dir>/scripts/fw_transcribe.py" \ "<audio>" "<config.model>" "<config.model_path>" "<LANG_ARG>" "<config.compute_type>" \ > "<dropzone>/<basename>.txt" 2> "$LOG"is this skill's install directory (provided when the skill loads); the wrapper ships in<skill-dir>and updates with the skill. No decode-level levers are applied: a lever sweep on real loop-prone audio found faster-whisper large-v3 does NOT loop or truncate the way whisperkit can, soscripts/(risked injecting primed words),initial_prompt(no loop to suppress) andno_repeat_ngram_size(speed only) add risk or speed, not accuracy. Loop and brand cleanup happen engine-agnostically in Phase 4.vad_filter(optional binary). Wants 16 kHz mono WAV, so pipe through ffmpeg first:whisper.cppbashffmpeg -nostdin -loglevel error -y -i "<audio>" -ar 16000 -ac 1 "${TMPDIR:-/tmp}/<basename>.wav" "${ENGINE_BIN:-whisper-cli}" -m "<config.model_path>" -f "${TMPDIR:-/tmp}/<basename>.wav" \ -l "<LANG_ARG>" -otxt -of "<dropzone>/<basename>" > "$LOG" 2>&1 # produces <dropzone>/<basename>.txt- Long audio (roughly > 20 min or > 30 MB): run the transcription as a background Bash job and poll for completion rather than blocking, to avoid command timeouts. On CPU, faster-whisper and whisper.cpp are slower than the Apple Neural Engine, so budget more time and lean on the background+poll path.
- First run of an engine may fetch a tokenizer / model shard from Hugging Face; this is expected.
Speaker diarization (opt-in, only whenis true). Goal: ONE unified, engine-agnostic output,config.diarization.enabledlines sorted by time, so nothing downstream branches on engine for speaker handling. Pass[mm:ss] Speaker A: <text>when the participant count is known. Caveats to carry into any user-facing note: turn-level not word-level; labels are arbitraryconfig.diarization.num_speakers/A(not names, map them in Phase 4 if grounding makes it clear); verified only on clean, low-overlap 2-speaker audio (overlap / 3+ speakers / auto-count untested). Per engine:B- : add
whisperkit-clito the transcribe command above and send stdout to--diarization --diarization-num-speakers <N>(not<dropzone>/<basename>.raw.txt). whisperkit appends a.txtblock (NIST RTTM, with transcript tokens packed into the ortho field) to stdout; its---- Speaker Diarization Results ----is non-functional for this, so you MUST capture stdout. Convert to the unified format with the bundled parser:--reportRun diarization in ONE call over the whole file. The first-ever run may download an HF diarization model; allow a few minutes, watch the log.bashpython3 "<skill-dir>/scripts/parse_diarization.py" "<dropzone>/<basename>.raw.txt" > "<dropzone>/<basename>.txt" - : no native diarization; meeting-scribe adds it via a token-free local add-on (sherpa-onnx + two public ONNX models, see "Enabling speaker diarization" above). When
faster-whisperandconfig.diarization.seg_modelare set, convert the source to 16 kHz mono WAV first, then call the bundled merge wrapper (it transcribes with faster-whisper, diarizes with sherpa-onnx, and emits the unified format directly):emb_modelIf the add-on is not set up (bashffmpeg -nostdin -loglevel error -y -i "<audio>" -ar 16000 -ac 1 "${TMPDIR:-/tmp}/<basename>.16k.wav" "<config.python_bin>" "<skill-dir>/scripts/fw_diarize.py" \ "${TMPDIR:-/tmp}/<basename>.16k.wav" "<config.model>" "<config.model_path>" \ "<LANG_ARG>" "<config.compute_type>" "<config.diarization.num_speakers or 0>" \ "<config.diarization.seg_model>" "<config.diarization.emb_model>" \ > "<dropzone>/<basename>.txt" 2> "$LOG"/seg_modelare null), fall back to the non-diarized command above. (Validated token-free on a 2-speaker clip: correct A/B attribution + auto speaker-count.)emb_model - : no real diarization (
whisper.cpp/ tinydiarize is experimental, 2-speaker only). Not supported here: ignore--tdrz, produce the normal non-diarized transcript, and tell the user to switch engine (whisperkit-cli or faster-whisper) if they need speaker separation.diarization.enabled
-
Confirm thewas produced and is non-empty, then proceed to Phase 1 using it. On failure, surface the tail of the stderr log and stop.
.txt
The source audio is archived together with its at the end of Phase 5 (after all artifacts succeed), not here.
.txt目标:将drop-zone中的音频文件转换为对应的原始转录文本,移交至阶段1。若用户直接上传文件(无音频),跳过阶段0,直接进入阶段1。
.txt.txt-
读取配置(如上)。若配置不存在,运行首次设置。
-
在中查找源文件:
audio_dropzone- 指定文件→使用该文件。
- 通用意图→列出无对应文件的音频文件(
<basename>.txt),按修改时间从新到旧排序:.wav .mp3 .m4a .flac .ogg .webm .mp4 .aac- 0个音频(且无独立)→若
.txt为true,进入步骤2b并提供Plaud拉取选项;否则在阶段2告知用户(“drop-zone中无音频或转录文本可处理”,按回复语言本地化)并停止。sources.plaud.enabled - 1个音频→使用该文件。
- 2个及以上→将选择权移交至阶段2(列出修改时间)。
- 0个音频(且无独立
- 若存在无对应音频的独立文件,视为已转录→直接进入阶段1处理该文件。
.txt
drop-zone为默认来源。仅当drop-zone为空,或用户明确要求使用Plaud录音(如“process my Plaud recording”“the 3-hour one on Plaud”)时,才进入步骤2b。
2b. Plaud音频获取(仅当为true时)。将云端录音的音频拉取至,然后回到步骤3。全程使用。
sources.plaud.enabledaudio_dropzonePLAUD="<config.sources.plaud.cli_path>"-
检查认证:执行。若认证失败,告知用户需自行在终端运行
"$PLAUD" me(浏览器OAuth)并停止。绝不代用户认证。plaud login -
列出候选录音并在阶段2呈现供用户选择(绝不自动选择):bash
"$PLAUD" recent --days 30 # 或:"$PLAUD" files -s 20 / "$PLAUD" search "<keyword>"列项为。许多录音仅以时间戳命名,因此需显示DATE+DURATION以区分。停止运行并等待用户选择。ID NAME DATE DURATION -
获取所选ID的元数据:执行,然后计算实际本地录音时间。返回三个不同的时间戳:
"$PLAUD" file <file_id>- :记录仪同步至云端的时间。可能晚于会议数天(例如:28日录制的录音,
created_at为31日),因此绝不能据此命名。created_at - :录音开始时间,UTC时区。
start_at - :未命名录音的
name为同一时刻的本地时间。经过Plaud AI摘要处理的录音此处为生成的标题。name
因此:若可解析为name时间戳,直接使用。否则将YYYY-MM-DD HH:MM:SS从UTC转换为机器本地时区:start_atbash# macOS/BSD date:显式指定+0000偏移量解析,输出本地时间 date -jf "%Y-%m-%dT%H:%M:%S %z" "<start_at> +0000" +"%Y-%m-%d-%H%M" # GNU date(Linux): date -d "<start_at>Z" +"%Y-%m-%d-%H%M"绝不能直接使用原始命名,BSDstart_at也不能仅使用date(会同时以UTC解析和输出,无法完成转换):任何错误都会导致会议日期错误,并传播至阶段4中所有成果的文件名和前置元数据。(示例:UTC+8时区下,-u为start_at,实际本地时间为2026-06-15T16:10:23,相差一整天。2026-06-16 00:10:23中的DATE列也是UTC时区,因此显示的日期同样错误。)plaud files -
获取预签名URL并重试。该调用在供应商端偶尔出现不稳定(同步录音的临时后端签名问题);失败不代表录音不可用。最多重试3次后放弃:bash
for i in 1 2 3; do OUT=$("$PLAUD" audio <file_id> 2>&1) URL=$(printf '%s' "$OUT" | grep -o 'https://[^ ]*' | head -1) [ -n "$URL" ] && break sleep 20 done若3次尝试均失败,返回CLI自身的错误信息并停止;建议用户稍后重试。 -
下载至drop-zone。命名为,使用步骤3中解析的本地时间:开头的日期用于阶段4的命名规则,ID片段可使文件追溯至Plaud以便重新拉取。
<YYYY-MM-DD>-<HHMM>-plaud-<file_id前8位>.mp3bashcurl -fL --retry 3 --retry-delay 5 -o "<dropzone>/<basename>.mp3" "$URL"- URL仅支持GET请求:返回403,因此绝不能用HEAD请求预检查。如需探测文件大小,使用范围GET请求(
curl -I)。curl -r 0-2047 - URL有效期为24小时,因此需在获取后立即下载;绝不能复用之前会话的URL。
- 作为后台Bash任务运行并轮询进度。音频大小约为每小时58MB(3小时会议约170MB)。
- URL仅支持GET请求:
-
转录前验证:文件存在、非空,且报告为音频容器。若下载截断或保存为
file "<path>"的HTML/XML错误体,会在Whisper内部深处触发模糊错误。.mp3 -
使用该文件进入步骤3。后续流程与手动上传文件完全一致,包括阶段5的归档步骤。
-
使用配置的引擎转录→生成文件存于音频旁。根据
<basename>.txt分支处理。设config.engine,LOG="${TMPDIR:-/tmp}/meeting-scribe-<basename>.log"=LANG_ARG(config.transcribe_language让Whisper自动检测;指定值可获得更稳定的混合语言输出),auto=若设置ENGINE_BIN则使用,否则使用默认二进制名称。config.engine_bin(Apple Silicon):whisperkit-clibash"${ENGINE_BIN:-whisperkit-cli}" transcribe \ --audio-path "<audio>" \ --model-path "<config.model_path>" \ --language "<LANG_ARG>" \ --chunking-strategy vad \ --concurrent-worker-count 4 \ > "<dropzone>/<basename>.txt" 2> "$LOG"- (基于语音活动分割)+
--chunking-strategy vad(并行块解码)为长音频吞吐量默认设置:2小时文件约需3分钟完成(约14倍实时速度),分割效果更佳。无法去除难处理音频上的局部幻觉循环(这些将在阶段4清理)。可根据机器性能调整worker数量。--concurrent-worker-count
(跨平台默认)。调用内置包装器faster-whisper,使用虚拟环境Python(<skill-dir>/scripts/fw_transcribe.py);faster-whisper可直接解码大多数格式,无需ffmpeg:config.python_binbash"<config.python_bin>" "<skill-dir>/scripts/fw_transcribe.py" \ "<audio>" "<config.model>" "<config.model_path>" "<LANG_ARG>" "<config.compute_type>" \ > "<dropzone>/<basename>.txt" 2> "$LOG"为本技能的安装目录(加载时提供);包装器存于<skill-dir>并随技能更新。未应用解码级别的控制:对易出现循环的真实音频测试发现,faster-whisper large-v3不会像whisperkit那样出现循环或截断,因此scripts/(可能注入预设词汇)、initial_prompt(无循环可抑制)和no_repeat_ngram_size(仅提升速度)会增加风险或提升速度,但无法提高准确性。循环和品牌名称清理在阶段4统一处理,与引擎无关。vad_filter(可选二进制)。要求输入16kHz单声道WAV,因此需先通过ffmpeg转换:whisper.cppbashffmpeg -nostdin -loglevel error -y -i "<audio>" -ar 16000 -ac 1 "${TMPDIR:-/tmp}/<basename>.wav" "${ENGINE_BIN:-whisper-cli}" -m "<config.model_path>" -f "${TMPDIR:-/tmp}/<basename>.wav" \ -l "<LANG_ARG>" -otxt -of "<dropzone>/<basename>" > "$LOG" 2>&1 # 生成 <dropzone>/<basename>.txt- 长音频(约>20分钟或>30MB):将转录作为后台Bash任务运行并轮询完成状态,而非阻塞运行,避免命令超时。在CPU上,faster-whisper和whisper.cpp比Apple Neural Engine慢,因此需预留更多时间,优先使用后台+轮询方式。
- 引擎首次运行可能从Hugging Face获取分词器/模型分片,此为正常现象。
说话人分离(可选,仅当为true时)。目标:生成统一、与引擎无关的输出,格式为按时间排序的config.diarization.enabled行,因此后续流程无需针对引擎分支处理说话人信息。若已知参会人数,传入[mm:ss] Speaker A: <text>。需告知用户的注意事项:轮次级别而非单词级别;标签为任意的config.diarization.num_speakers/A(非真实姓名,若背景信息明确可在阶段4映射);仅在清晰、低重叠的双说话人音频中验证有效(重叠/3个及以上说话人/自动计数未测试)。各引擎处理方式:B- :在上述转录命令中添加
whisperkit-cli,将标准输出写入--diarization --diarization-num-speakers <N>(而非<dropzone>/<basename>.raw.txt)。whisperkit会在标准输出末尾追加.txt块(NIST RTTM格式,转录令牌打包于ortho字段);其---- Speaker Diarization Results ----功能对此无效,因此必须捕获标准输出。使用内置解析器转换为统一格式:--report对整个文件一次性运行说话人分离。首次运行可能下载HF说话人分离模型;预留几分钟时间,查看日志。bashpython3 "<skill-dir>/scripts/parse_diarization.py" "<dropzone>/<basename>.raw.txt" > "<dropzone>/<basename>.txt" - :无原生说话人分离功能;本技能通过无令牌本地插件(sherpa-onnx+两个公开ONNX模型,详见“启用说话人分离”)添加该功能。若设置了
faster-whisper和config.diarization.seg_model,先将源文件转换为16kHz单声道WAV,然后调用内置合并包装器(用faster-whisper转录,用sherpa-onnx进行说话人分离,直接输出统一格式):emb_model若未配置插件(bashffmpeg -nostdin -loglevel error -y -i "<audio>" -ar 16000 -ac 1 "${TMPDIR:-/tmp}/<basename>.16k.wav" "<config.python_bin>" "<skill-dir>/scripts/fw_diarize.py" \ "${TMPDIR:-/tmp}/<basename>.16k.wav" "<config.model>" "<config.model_path>" \ "<LANG_ARG>" "<config.compute_type>" "<config.diarization.num_speakers or 0>" \ "<config.diarization.seg_model>" "<config.diarization.emb_model>" \ > "<dropzone>/<basename>.txt" 2> "$LOG"/seg_model为null),回退至非说话人分离命令。(在双说话人片段上验证无令牌功能:A/B归属正确+自动说话人计数。)emb_model - :无可靠说话人分离功能(
whisper.cpp/tinydiarize为实验性,仅支持双说话人)。此处不支持:忽略--tdrz,生成普通非说话人分离转录文本,并告知用户若需说话人分离需切换引擎(whisperkit-cli或faster-whisper)。diarization.enabled
-
确认文件已生成且非空,然后使用该文件进入阶段1。若失败,显示stderr日志的末尾内容并停止。
.txt
源音频将在阶段5所有成果生成成功后(而非此时)与对应的文件一同归档。
.txtPhase 1: Bootstrap (silent)
阶段1:引导(静默)
Before responding, silently:
- Identify the transcript file: the from Phase 0, or the file the user named / the single loose
.txtin the drop-zone..txt - Read the transcript with . For a large file, read in chunks but have the full content before Phase 4.
Read - Load baseline grounding if and
output.mode == "obsidian"is set: read it (and loadbaseline_context_fileif configured). Invault_context_skillmode with no grounding configured, skip.folder - If a grounding read fails, proceed without it and flag the constraint at the top of Phase 2.
Do not narrate this step. One brief Phase 2 response is the first user-visible output.
回复用户前,静默执行以下操作:
- 识别转录文件:阶段0生成的文件,或用户指定的文件/drop-zone中的独立
.txt文件。.txt - 读取转录文本:使用工具。大文件可分块读取,但需在阶段4前获取完整内容。
Read - 加载基准背景信息:若且设置了
output.mode == "obsidian",读取该文件(若配置了baseline_context_file则加载)。folder模式且未配置背景信息时跳过。vault_context_skill - 若背景信息读取失败:继续执行并在阶段2顶部说明限制条件。
无需告知用户此步骤。阶段2的简短回复为首次用户可见输出。
Phase 2: Classification + context request
阶段2:分类+上下文请求
A brief response in the replies language.
If 2+ candidate files (from Phase 0/1): list them with mtime and ask which to process; stop and wait. After the pick, re-enter Phase 1 silently on the chosen file.
Otherwise (single file identified and read):
Part A: Classification. One line: what kind of meeting this looks like and its main topic in 5-10 words. Use a generic, content-derived type, e.g.: client session / internal team session / 1-on-1 / strategic planning / project review / interview / training / personal / mixed.
Part B: Context request. Ask where the relevant grounding context lives (project folder, person / client profile, brief, reference). Invite 1-5 paths or filenames; tell the user to reply "skip" if no extra context is needed. Stop and wait until you receive paths or a skip.
(In output mode with no grounding source configured, Part B may be skipped; proceed with general analysis.)
folder使用回复语言进行简短回复。
若存在2个及以上候选文件(来自阶段0/1):列出文件及修改时间,询问处理哪个;停止并等待。用户选择后,静默进入阶段1处理所选文件。
否则(已识别并读取单个文件):
A部分:分类。一句话描述:会议类型及核心主题(5-10字)。使用基于内容的通用类型,例如:客户会议/内部团队会议/一对一会议/战略规划/项目复盘/面试/培训/个人事务/混合类型。
B部分:上下文请求。询问相关背景信息的存储位置(项目文件夹、人员/客户资料、简报、参考文档)。邀请用户提供1-5个路径或文件名;告知用户若无需额外上下文可回复“跳过”。停止并等待用户回复路径或“跳过”。
(folder输出模式且未配置背景来源时,可跳过B部分;直接进行通用分析。)
Phase 3: Context loading
阶段3:上下文加载
If the user provided paths:
- Fetch them (batch read in Obsidian mode; in folder mode).
Read - If they gave a folder, ask which specific files matter; do not silently fetch a whole folder.
- Read carefully and extract: correct spellings of people / brands / projects, engagement-specific terms, recent decisions / status / open loops, anything that changes how transcript content should be read.
- If a fetched file points to another you would benefit from, ask before a second fetch round. Do not chain-fetch silently.
If "skip", proceed with baseline grounding (if any) plus general knowledge.
Acknowledge what you loaded in ONE short line, then proceed straight to Phase 4. No extra gate. Do not echo artifacts.
若用户提供了路径:
- 获取文件(Obsidian模式下批量读取;folder模式下使用)。
Read - 若用户提供文件夹,询问具体哪些文件有用;绝不静默获取整个文件夹。
- 仔细读取并提取:人员/品牌/项目的正确拼写、特定业务术语、近期决策/状态/未完成事项、任何会影响转录文本解读的信息。
- 若获取的文件指向其他有益文件,在二次获取前询问用户。绝不静默链式获取。
若回复“跳过”,使用基准背景信息(若有)+通用知识继续执行。
用一句话确认已加载的内容,然后直接进入阶段4。无需额外确认步骤。绝不回显成果。
Phase 4: Draft transcript + terminology confirmation
阶段4:转录文本草稿+术语确认
The transcript is drafted, its terminology locked with the user, and the file corrected in place, all BEFORE the canvas or summary exist. (Order is the point: the canvas and summary inherit every name in the transcript, so a name fixed after they are generated silently survives wrong inside them. That exact failure, stale terminology baked into "final" artifacts, is what this gate prevents.)
Step 1: Draft + write the transcript.
Generate and write it directly to the configured destination now. Never print it into chat. It goes to disk this early deliberately: it is the durable intermediate that this phase and Phase 4b correct in place, and the Phase 4b auditor needs a file path it can read cold.
-transcript.mdFile naming (shared by all three artifacts; the canvas and summary reuse this base in Phase 5):
- Base:
Meeting-YYYY-MM-DD-<slug>- Date: from the source filename's date prefix if present, else today.
- Slug: short kebab-case from the Phase 2A topic (2-4 words, Latin script / pinyin, no spaces).
- Three files: ,
-transcript.md,-canvas.html.-summary.md
Where to write (by ):
output.mode- ->
folderintoWrite.output.folder_path - ->
obsidianintomcp__mcp-obsidian__obsidian_append_content(vault-relative). Landing folder is a staging zone; the user promotes to a project folder later. If the user named a target folder, use it. In-place corrections in step 4 and in Phase 4b use the filesystemlanding_foldertool against the absolute vault path (same mechanic as the Phase 6 loop).Edit
If the target file already exists, ask before overwriting (rerun case).
Corrected-transcript rules (apply while writing ):
-transcript.md- Frontmatter: ,
type: meeting-transcript,meeting,date,participants, plus any grounding links.source_file - Fix proper nouns using grounding context first, then general context. Fix obvious mistranscriptions where context makes the word unambiguous.
- Brand / tool-name correction map. Whisper mis-hears common AI/tech names; fix them here deterministically (this is the chosen substitute for source-level prompt biasing). Known mis-hearings -> correct, applied only when context makes the AI/tech meaning unambiguous: /
quad/clock-> Claude;Clock-> Claude Code;clock code/AI tip-> ChatGPT;cheggbd-> Anthropic. The exact garbling is render-dependent (engine- and model-specific; e.g. on Mandarin-accented audioentropicis by far the most common Claude garble), so treat this as a GROWING dictionary, not a fixed list; add new mis-hearings as you confirm them.clock - Preserve speech features: fillers, false starts, repetitions, trailing thoughts, code-switching exactly as transcribed.
- Collapse Whisper repetition loops. A token or short phrase repeated 4+ times in a row (e.g. ,
卖鸯子卖鸯子卖鸯子卖鸯子) is an ASR hallucination on hard audio, not real speech: collapse it to a single instance or drop it, and mark找多更多找多更多if the underlying words cannot be recovered. This is distinct from genuine emphatic repetition (e.g.[unclear]/对对对, up to ~3x), which stays; only 4+ identical runs are treated as loops.是是是 - Speaker labels: if Phase 0 produced a diarized transcript (), keep the turn structure and map the arbitrary
[mm:ss] Speaker A/B: .../Ato real names where grounding context makes it clear (note the mapping in a one-line processing note at the top); diarization is turn-level, so a long first turn may swallow brief interjections; split them back out only if obvious. Without diarization, keep speaker labels as transcribed and infer conservatively. Drop pure Whisper hallucination lines (foreign-language garbage from silence / cross-talk).B - Timestamps: keep as they came.
- Terms still uncertain after grounding -> mark inline AND add them to the step 2 list below.
[unclear: best guess] - Light-touch only. Do NOT rewrite, smooth, or paraphrase.
Step 2: Compile the uncertainty list (while drafting, not as a separate read-through). Collect every proper noun / company name / place / technical term where the engine's output is ambiguous and grounding did NOT resolve it. Two tiers, both go on the list:
- Unknown: no confident reading. Show the variants as heard.
- Guess, unverified: a plausible reading (the "80% sure" case). Never silently apply it; show the guess for confirmation, e.g. .
Contozo / Kontoso / Contosa -> Contoso?
List discipline (the list is for a human to answer against, not a dump):
- Group by kind: people / companies + brands / places / jargon + technical terms.
- Collapse variants: all mis-hearings of one real term are ONE entry (five garblings of one name is one question, not five). Note the occurrence count.
- Cap the ask at ~15 entries, highest-frequency first. Anything past the cap stays tagged in the file; say how many were cut ("plus N low-frequency terms tagged inline") so the user can ask for the rest.
[unclear: best guess]
Step 3: Present the list and STOP. Ask for corrections and wait. This is a hard gate (the one place the user's own knowledge is irreplaceable, and the cheapest point to apply it, before anything downstream consumes the names). Partial answers are expected and fine: the user may answer all, some, or say "leave the rest, correct later". Never hold the pipeline hostage to 100% coverage; whatever comes back is what gets applied.
Step 4: Apply. the confirmed terms into the transcript in place. A confirmed term fixes EVERY variant of it across the whole file, not just the flagged instance. Confirmed guesses lose their tag; unanswered items keep theirs. If a fetched grounding file (or ) would plausibly resolve the SAME term on a future meeting, offer once, in one line, to append the newly confirmed term to that file, so Phase 3 resolves it silently next time instead of asking again (this is the per-user analogue of the brand / tool-name map above: a GROWING dictionary, but user-specific and living in their own grounding, not in this skill body). Then proceed to Phase 4b.
Edit[unclear]baseline_context_file先完成转录文本草稿,与用户确认术语并就地校正,再生成画布或摘要。(顺序至关重要:画布和摘要会继承转录文本中的所有名称,若在生成后才修正名称,错误会保留在成果中。此步骤正是为避免这种“最终成果中存在过时术语”的问题。)
步骤1:生成并写入转录文本
生成并立即写入配置好的目标位置。绝不打印至聊天。尽早写入磁盘是刻意设计:这是本阶段和阶段4b就地校正的持久化中间文件,阶段4b的审核器需要可冷读取的文件路径。
-transcript.md文件命名(三种成果共享;阶段5的画布和摘要复用此基础名称):
- 基础名:
Meeting-YYYY-MM-DD-<slug>- 日期:若源文件名含日期前缀则使用,否则使用今日日期。
- Slug:基于阶段2A的主题生成短横线分隔的小写名称(2-4词,拉丁字母/拼音,无空格)。
- 三个文件:、
-transcript.md、-canvas.html。-summary.md
写入位置(按):
output.mode- →使用
folder写入Write。output.folder_path - →使用
obsidian写入mcp__mcp-obsidian__obsidian_append_content(相对vault路径)。landing_folder为暂存区;用户后续可将其移至项目文件夹。若用户指定了目标文件夹,使用该文件夹。步骤4和阶段4b的就地校正使用文件系统landing_folder工具结合vault绝对路径(与阶段6循环机制相同)。Edit
若目标文件已存在,覆盖前询问用户(重新运行场景)。
校正转录文本规则(写入时应用):
-transcript.md- 前置元数据:、
type: meeting-transcript、meeting、date、participants,以及任何背景信息链接。source_file - 优先使用背景信息修正专有名词,其次使用通用上下文。若上下文明确单词含义,修正明显的转录错误。
- 品牌/工具名称校正映射。Whisper常误听常见AI/技术名称;在此处确定性修正(这是替代源级别提示偏向的选择)。已知误听→校正,仅当上下文明确AI/技术含义时应用:/
quad/clock→Claude;Clock→Claude Code;clock code/AI tip→ChatGPT;cheggbd→Anthropic。具体误听内容因渲染方式而异(与引擎和模型相关;例如:带普通话口音的音频中,entropic是Claude最常见的误听结果),因此将其视为可扩展字典,而非固定列表;确认新的误听内容后添加至列表。clock - 保留语音特征:填充词、口误、重复语句、未说完的想法、混合语言,完全按转录内容保留。
- 合并Whisper重复循环。连续重复4次及以上的令牌或短句(如、
卖鸯子卖鸯子卖鸯子卖鸯子)是难处理音频上的ASR幻觉,而非真实语音:合并为单个实例或删除,若无法恢复原词则标记找多更多找多更多。这与真实的强调重复(如[unclear]/对对对,最多约3次)不同,后者需保留;仅连续4次及以上的相同内容视为循环。是是是 - 说话人标签:若阶段0生成带说话人分离的转录文本(),保留轮次结构,若背景信息明确则将任意的
[mm:ss] Speaker A/B: .../A映射为真实姓名(在顶部添加一行处理说明);说话人分离为轮次级别,因此长轮次可能吞短暂的插话;仅当明显时才拆分。无说话人分离时,保留转录的说话人标签并保守推断。删除纯Whisper幻觉行(沉默/交叉对话产生的外语垃圾内容)。B - 保留原始时间戳。
- 背景信息仍无法确定的术语→在行内标记并添加至下方步骤2的列表。
[unclear: best guess] - 仅进行轻量清理。绝不重写、平滑或改写内容。
步骤2:整理不确定术语列表(生成草稿时同步整理,无需单独重读)。收集引擎输出模糊且背景信息未解决的所有专有名词/公司名称/地点/技术术语。分为两类,均需加入列表:
- 未知:无可信解读。列出听到的变体。
- 未验证的猜测:合理解读(“80%确定”的情况)。绝不静默应用;列出猜测供用户确认,例如。
Contozo / Kontoso / Contosa -> Contoso?
列表规范(列表供人类回复,而非简单 dump):
- 按类型分组:人员/公司+品牌/地点/行话+技术术语。
- 合并变体:同一真实术语的所有误听内容为一个条目(同一名称的5种误听为一个问题,而非5个)。标注出现次数。
- 最多保留约15个条目,按频率从高到低排序。超出上限的条目在行内标记;告知用户已截断的数量(“另有N个低频术语行内标记”),以便用户请求查看剩余内容。
[unclear: best guess]
步骤3:呈现列表并停止。询问用户校正内容并等待。这是硬性关卡(用户自身知识不可替代,且在此处应用成本最低,避免下游内容使用错误名称)。部分回复可接受:用户可回复全部、部分,或“保留剩余内容,后续校正”。绝不因追求100%覆盖而阻塞流程;用户返回的任何内容均会应用。
步骤4:应用校正。使用工具将确认的术语就地写入转录文本。确认的术语会修正文件中所有对应的变体,而非仅标记的实例。确认的猜测移除标签;未回复的条目保留标签。若获取的背景文件(或)可在未来会议中解决同一术语,用一句话提议将新确认的术语追加至该文件,以便阶段3自动解决而非再次询问(这是用户专属的品牌/工具名称映射扩展字典,存储于用户自身背景信息,而非本技能主体)。然后进入阶段4b。
Edit[unclear]baseline_context_filePhase 4b: Fresh-context audit (independent second pass)
阶段4b:全新上下文审核(独立二次检查)
A single correction pass reliably under-catches internal-consistency errors: the pass that produced the draft is anchored to its own first readings, while a cold reader spots the same real word spelled two different wrong ways, or a homophone slip that is only visibly wrong because the same concept appears correctly elsewhere in the file. (Observed on a real run: a fresh reader found roughly 35 errors the first pass had missed, including a repeated character-substitution pattern and a homophone slip.) So: audit with an agent that has no memory of this session.
Skip condition. Skip 4b (say so in one line) when the transcript is short (roughly under 15 minutes of audio) AND Phase 4 surfaced 0-2 uncertain terms, or when the user says skip. Long, name-dense, or code-switched transcripts always get the audit.
Step 1: Spawn the auditor. Launch a subagent with NO conversation context; its brief must be fully self-contained:
- The transcript file path (the Phase 4 corrected file).
- Standalone framing: who is in the meeting, what it is about, the languages and register in play (e.g. code-switched Mandarin-English).
- The terms already confirmed in Phase 4 (so it does not re-flag them, and treats them as fixed anchors).
- The job: read the WHOLE transcript and find OTHER likely transcription errors using internal logical / contextual consistency only: a real word spelled two different wrong ways in different paragraphs; a term that does not fit its sentence but a homophone does; a stray variant of an established participant name. NOT things that require the user's private knowledge.
- Report, never edit. Return findings ranked by confidence, each = location + current text -> proposed text + a one-line reason. (Read-only by design: a fresh agent editing the file directly can silently overwrite corrections the user just confirmed, and a report lets a confidence bar gate what gets auto-applied.)
Step 2: Triage the findings.
- High confidence -> auto-apply via , no gate. Rule of thumb for "high": the proposed form already appears elsewhere in the same transcript in unambiguous form, OR it matches a term the user confirmed in Phase 4, OR it is a systematic substitution with 3+ consistent instances. A bare guess with no internal corroboration is NOT high confidence, however plausible.
Edit - Medium / low / unresolved -> surface, never block. Tag the spots inline and carry the list into the Phase 5 chat report as an optional follow-up. Proceed to Phase 5 without waiting; answers that arrive later are applied through the Phase 6 loop, to all three artifacts.
[unclear: best guess]
单次校正难以可靠捕获内部一致性错误:生成草稿的过程锚定自身首次解读,而冷启动的审核者会发现同一真实单词的两种不同错误拼写,或因同一概念在文件其他位置正确出现而显露出的同音词错误。(真实运行案例:冷启动审核者发现约35个首次检查遗漏的错误,包括重复字符替换模式和同音词错误。)因此:使用无会话记忆的代理进行审核。
跳过条件。当转录文本较短(约15分钟音频以内)且阶段4仅发现0-2个不确定术语,或用户要求跳过时,跳过4b(用一句话告知)。长文本、名称密集或混合语言的转录文本必须进行审核。
步骤1:生成审核代理。启动无对话上下文的子代理;指令必须完全独立:
- 转录文件路径(阶段4校正后的文件)。
- 独立说明:参会人员、会议主题、使用的语言和语体(如中英混合)。
- 阶段4已确认的术语(避免重复标记,将其视为固定锚点)。
- 任务:读取完整转录文本,仅通过内部逻辑/上下文一致性查找其他可能的转录错误:同一转录文本不同段落中同一真实单词的两种错误拼写;不符合句子语境但同音词符合的术语;已确认参会人员姓名的变体。不处理需要用户私有知识的内容。
- 仅报告,绝不编辑。按置信度排序返回结果,每条结果包含:位置+当前文本→提议文本+一句话理由。(设计为只读:冷启动代理直接编辑文件可能会静默覆盖用户刚确认的校正内容,报告可通过置信度门槛控制自动应用的内容。)
步骤2:筛选审核结果
- 高置信度→自动应用:使用工具,无需确认。“高置信度”的经验法则:提议的形式已在同一转录文本的其他明确位置出现,或与用户阶段4确认的术语匹配,或存在3次及以上一致的系统性替换。无内部佐证的单纯猜测不属于高置信度,无论看似多么合理。
Edit - 中/低/未解决→呈现,绝不阻塞:在行内标记,并将列表带入阶段5的聊天报告作为可选后续内容。无需等待,直接进入阶段5;后续回复的内容通过阶段6循环应用至所有三种成果。
[unclear: best guess]
Phase 5: Generate canvas + summary + write to destination (NO full-text echo)
阶段5:生成画布+摘要+写入目标(绝不回显全文)
Only now, with terminology locked, generate the remaining two artifacts, from the corrected transcript file on disk, not from memory of the Phase 4 draft (the file carries the user's confirmations and the audit fixes; the in-context draft does not). Re-read it first if it is not fully in context.
Generate the canvas and the summary and write each directly to the configured destination, same base name and same write mechanics as Phase 4 step 1. Never print either into chat. Generate once, straight into the file. No "continue" gate, no write-confirmation gate; run straight through. If a target file already exists, ask before overwriting (rerun case).
After both writes succeed (the transcript was already written in Phase 4), archive the source:
bash
mkdir -p "<config.audio_archive>"
mv "<source audio>" "<config.audio_archive>/" # if an audio source existed
mv "<dropzone>/<basename>.txt" "<config.audio_archive>/"
mv "<dropzone>/<basename>.raw.txt" "<config.audio_archive>/" 2>/dev/null || true # whisperkit diarized intermediate, if anyThen output a COMPACT chat report only (the only user-visible artifact output), in the replies language:
[done] processed, written to <destination>:
- Meeting-YYYY-MM-DD-<slug>-transcript.md
- Meeting-YYYY-MM-DD-<slug>-canvas.html
- Meeting-YYYY-MM-DD-<slug>-summary.md
[done] source moved to archive
corrections: <X> confirmed with you . <Y> audit fixes auto-applied . <Z> still [unclear]
one-liner: <the meeting in one sentence>
<N> decisions . <M> action items . <K> open questions
sharpest insight: <single sharpest AI insight, one line>
tell me what to change; I'll edit the files in place.If > 0, append the unresolved terms below the report (term + best guess + rough location, one line each) and note that answering any of them at any time propagates the fix to all three files. Do not wait on them.
<Z>Keep it to synopsis + counts + one insight headline. The full substance is in the files.
仅当术语确认完成后,才生成剩余两种成果,基于磁盘上的校正后转录文本,而非阶段4草稿的记忆(文件包含用户的确认内容和审核修复内容;上下文草稿不包含)。若未完全加载文件内容,先重新读取。
生成画布和摘要并直接写入配置好的目标位置,与阶段4步骤1使用相同的基础名称和写入机制。绝不打印至聊天。一次性生成后直接写入文件。无需“继续”确认步骤,无需写入确认步骤;直接运行。若目标文件已存在,覆盖前询问用户(重新运行场景)。
两种成果写入成功后(转录文本已在阶段4写入),归档源文件:
bash
mkdir -p "<config.audio_archive>"
mv "<source audio>" "<config.audio_archive>/" # 若存在音频源
mv "<dropzone>/<basename>.txt" "<config.audio_archive>/"
mv "<dropzone>/<basename>.raw.txt" "<config.audio_archive>/" 2>/dev/null || true # whisperkit说话人分离中间文件(若有)然后仅输出简洁的聊天报告(唯一用户可见的成果输出),使用回复语言:
[完成] 已处理并写入<目标位置>:
- Meeting-YYYY-MM-DD-<slug>-transcript.md
- Meeting-YYYY-MM-DD-<slug>-canvas.html
- Meeting-YYYY-MM-DD-<slug>-summary.md
[完成] 源文件已移至归档
校正情况:<X>项已与您确认 . <Y>项审核修复已自动应用 . <Z>项仍标记[unclear]
一句话总结:<会议一句话描述>
<N>项决策 . <M>项行动事项 . <K>项未解决问题
核心洞察:<最尖锐的AI洞察,一句话>
如需修改,请告知;我会就地编辑文件。若>0,在报告下方追加未解决术语(术语+最佳猜测+大致位置,每行一个),并告知用户随时回复均可将修正应用至所有三个文件。无需等待回复。
<Z>内容仅保留概要+统计+核心洞察标题。完整内容存于文件中。
Phase 6: Review + edit loop (in place)
阶段6:审阅+编辑循环(就地)
The user reviews the artifacts at the destination, not in chat. When they come back with a change:
- Apply the edit directly to the destination file with the filesystem tool (Obsidian's Git plugin / the filesystem picks it up). Use
Editonly for appends.obsidian_append_content - Do NOT re-echo the full artifact. Confirm just the specific change in one or two lines.
- For a full rewrite of one artifact (rare), regenerate and overwrite that one file directly; still no full chat echo.
- A late answer to a Phase 4 / 4b terminology item counts as an edit here: apply it to ALL THREE artifacts (a name fixed only in the transcript silently survives wrong in the canvas and the summary).
The loop stays token-lean: generate once into the file, edit in place, never reprint.
用户在目标位置而非聊天中审阅成果。当用户提出修改请求时:
- 使用文件系统工具直接编辑目标文件(Obsidian的Git插件/文件系统会同步)。仅在追加内容时使用
Edit。obsidian_append_content - 绝不回显完整成果。仅用1-2句话确认具体修改内容。
- 若需完全重写某一成果(罕见),直接重新生成并覆盖该文件;仍不回显全文至聊天。
- 阶段4/4b术语的延迟回复视为此处的编辑请求:应用至所有三个成果(仅在转录文本中修正名称会导致画布和摘要中仍保留错误名称)。
循环需保持令牌消耗最低:一次性生成写入文件,就地编辑,绝不重新打印。
Insights mode: cross-meeting pattern analysis
洞察模式:跨会议模式分析
A separate workflow from the per-meeting pipeline. Input = the corpus of already-corrected transcripts (never raw drop-zone : corrected files have real names mapped and hallucinations cleaned). Output = ONE report file, written to the destination, never echoed in full. No transcription, no canvas, no summary.
.txtThe subject of analysis is the user's own communication behavior. Other participants' words are context for reading the user's moves, never targets of judgement. Do not profile, score, or diagnose other people.
与单会议流程独立的工作流。输入=已校正的转录文本 corpus(绝不是drop-zone中的原始:校正后的文件已映射真实姓名并清理幻觉内容)。输出=一份报告文件,写入目标位置,绝不回显全文。无转录、无画布、无摘要。
.txt分析对象为用户自身的沟通行为。其他参会人员的话语仅作为解读用户行为的上下文,绝不作为评判对象。绝不分析、评分或诊断他人。
Step 1: Corpus discovery (silent)
步骤1:Corpus发现(静默)
- Read the config (same as Phase 0).
- Locate corrected transcripts by frontmatter: grep for under the vault (obsidian mode; transcripts may have been promoted out of the landing folder, so search vault-wide) or under
type: meeting-transcript(folder mode).output.folder_path - Build a one-line-per-meeting inventory: date, slug, meeting type, participants, speaker-attribution quality (diarized with named speakers / labeled-but-unmapped / no speaker labels).
- 读取配置(与阶段0相同)。
- 通过前置元数据定位校正后的转录文本:在vault中(Obsidian模式;转录文本可能已从landing_folder移至其他位置,因此需全vault搜索)或下(folder模式)搜索
output.folder_path。type: meeting-transcript - 生成会议清单:每行一个会议,包含日期、slug、会议类型、参会人员、说话人归属质量(带真实姓名的说话人分离/已标记但未映射/无说话人标签)。
Step 2: Scope gate (the only gate)
步骤2:范围确认(唯一关卡)
One brief response: corpus stats (N meetings, date range, type mix), then ask two things and wait:
- Scope: all, a date range, a meeting type (e.g. only 1-on-1s), or meetings with a specific person.
- Lenses: which patterns to analyze (offer the catalog below; default = conflict avoidance + facilitation + question ratio if the user says "you pick").
If the user's opening message already specifies both (e.g. "last month's meetings, tell me if I avoid conflict"), skip the gate and run.
简短回复:corpus统计信息(会议数量、日期范围、类型分布),然后询问两个问题并等待:
- 范围:全部、日期范围、会议类型(如仅一对一会议),或与特定人员的会议。
- 分析维度:分析哪些模式(提供下方维度目录;若用户回复“你选”,默认选择冲突回避+会议引导+提问占比)。
若用户初始消息已明确指定两者(如“分析我上个月的会议,看看我是否回避冲突”),跳过此关卡直接运行。
Lens catalog
分析维度目录
Speaker-dependent lenses (marked ⊙) need reliable attribution: apply them only to transcripts where the user's turns are identifiable. Content lenses work on any transcript. Exclusions are reported, never silent.
- Conflict avoidance & hedging: hedged delivery of hard messages, agreeing-without-commitment, subject changes at tension points, problems visible in the transcript that never got named. Look for hedging markers in the transcript's language(s), e.g. EN "maybe / kind of / I think / whatever you think"; ZH "可能", "或者说", "看你们怎么想", "都可以", "再看吧". Register guard: casual particles, softeners, and emphatic repetition that belong to the configured are register, NOT hedging; only flag when the CONTENT retreats, not when the tone is casual.
register - ⊙ Speaking ratio & turn-taking: share of words, average turn length, interruptions given/received (visible as turn breaks mid-thought). Diarization is turn-level, so treat counts as approximate; report direction, not false precision.
- ⊙ Question vs statement ratio: and question quality: clarifying / exploring vs leading / rhetorical. Especially relevant to coaching calls and 1-on-1s, where question quality is the craft itself.
- Active listening: paraphrasing others, building on their points, referencing something said earlier vs steamrolling to one's own agenda.
- Facilitation & close discipline: directive vs collaborative decision moments, drawing out quiet participants, whether meetings end with clear owners + dates or trail off.
- Commitment integrity (cross-meeting only, needs 2+ meetings with shared participants/topic): commitments made in meeting A: revisited, delivered, or silently dropped by meeting B? This is the lens no single-meeting AI-insights section can see, and the highest-value one in this mode.
- Trend compare: same lenses over two time windows ("Q1 vs Q2"), reported as movement with examples from each window.
依赖说话人的维度(标记⊙)需要可靠的身份归属:仅应用于可识别用户轮次的转录文本。内容维度适用于所有转录文本。需报告排除的情况,绝不静默处理。
- 冲突回避与模糊表达:强硬消息的模糊传递、无承诺的同意、紧张点转移话题、转录文本中可见但未明确提出的问题。查找转录文本语言中的模糊表达标记,例如英文“maybe / kind of / I think / whatever you think”;中文“可能”“或者说”“看你们怎么想”“都可以”“再看吧”。语体注意:配置的中的口语助词、软化词和强调重复属于语体,不属于模糊表达;仅当内容退缩时才标记,而非语气随意。
register - ⊙ 发言占比与轮次转换:单词占比、平均轮次长度、发起/被打断次数(表现为轮次中途中断)。说话人分离为轮次级别,因此统计为近似值;报告趋势,而非虚假精确值。
- ⊙ 提问与陈述占比:及提问质量:澄清/探索型 vs 诱导/修辞型。尤其适用于辅导会议和一对一会议,提问质量是核心能力。
- 主动倾听:转述他人观点、基于他人观点延伸、引用之前的内容 vs 自顾自推进自身议程。
- 会议引导与收尾规范:指令型 vs 协作型决策时刻、调动沉默参会人员、会议结束时是否明确负责人+日期,或不了了之。
- 承诺一致性(仅跨会议,需2个及以上有共同参会人员/主题的会议):会议A中做出的承诺:在会议B中是否被提及、兑现或静默搁置。这是单会议AI洞察板块无法实现的维度,也是此模式中价值最高的维度。
- 趋势对比:同一维度在两个时间窗口的对比(如“Q1 vs Q2”),报告变化情况并附带每个窗口的示例。
Evidence discipline
证据规范
The pipeline's anti-fabrication rules apply, plus two stricter ones:
- Pattern threshold: a claim is a "pattern" only with 3+ instances across 2+ meetings. Fewer -> report it as an isolated observation, explicitly labeled.
- Every instance cited: meeting file + timestamp (if present) + verbatim quote in its original language. No quote, no claim.
For each strong instance, include a better-approach rewrite: what a more direct version would have sounded like, written in the user's own voice (honor if set), not textbook corporate phrasing. A rewrite the user would never actually say is useless.
language.register除流程的反捏造规则外,需遵守两条更严格的规则:
- 模式门槛:仅当在2个及以上会议中出现3次及以上实例时,才可称为“模式”。少于此数量→报告为孤立观察,并明确标注。
- 每个主张均需引用证据:会议文件+时间戳(若有)+原语言原文引用。无引用则无主张。
对于每个强实例,需包含优化方案改写:更直接的表述方式,使用用户自身的语气(若设置了需遵守),而非教科书式的企业话术。用户绝不会实际使用的改写毫无意义。
language.registerReport artifact
报告成果
One file: (date = today; scope slug e.g. ), written to the same destination as Phase 5. Structure:
Meeting-Insights-YYYY-MM-DD-<scope-slug>.md2026-06-one-on-ones- Scope + corpus: meetings analyzed, date range, which were excluded from ⊙ lenses and why.
- Per-lens findings: finding in one sentence -> frequency -> 2-3 strongest cited examples (quote + why it matters + better-approach rewrite).
- Strengths: 2-3, cited with the same rigor. Real evidence, not balance-for-politeness.
- Growth moves: 3-5 concrete behaviors, each tied to a finding. No platitudes.
Then a compact chat report in the replies language, mirroring Phase 5 style: corpus stats, the single sharpest pattern (one line), strongest strength (one line), file path. Edits follow the Phase 6 loop: in place, no re-echo.
Report language: + . Quotes stay in their original language.
language.summaryregister一个文件:(日期=今日;scope slug例如),写入与阶段5相同的目标位置。结构:
Meeting-Insights-YYYY-MM-DD-<scope-slug>.md2026-06-one-on-ones- 范围+Corpus:分析的会议、日期范围、因⊙维度排除的会议及原因。
- 各维度发现:一句话总结发现→出现频率→2-3个最强引用示例(引用+重要性+优化方案改写)。
- 优势:2-3项,引用证据需与发现同样严谨。基于真实证据,而非为了礼貌而平衡。
- 成长建议:3-5项具体行为,每项均关联一个发现。绝不使用空话。
然后输出简洁的聊天报告,使用回复语言,与阶段5风格一致:corpus统计、最核心的模式(一句话)、最强优势(一句话)、文件路径。编辑遵循阶段6循环:就地编辑,绝不回显。
报告语言:+。引用内容保留原语言。
language.summaryregisterOutput 1: Visual canvas (HTML)
输出1:可视化画布(HTML)
A single self-contained HTML file. Goal: someone reads it for 60 seconds and walks away with the complete strategic picture, without opening the transcript or summary.
Design language: Precision Pro. Apple's technical / developer aesthetic (Xcode, Apple Developer docs, a precision dashboard) executed with Apple-grade restraint: a modular grid, monospace data, hairline rules, generous whitespace, one disciplined accent system. Crisp, exact, quietly beautiful, highly readable in both light and dark.
Build from the template, do not redesign. A complete, verified reference implementation lives at (a worked example with sample content). Open it and reproduce its structure, CSS-variable theme system, light/dark toggle, and component patterns EXACTLY; swap in the actual meeting's content. The notes below describe what the template encodes so you can adapt it faithfully.
assets/canvas-template.html独立HTML文件。目标:用户读取60秒即可掌握完整战略全貌,无需打开转录文本或摘要。
设计语言:精准专业。采用苹果技术/开发者美学(Xcode、Apple开发者文档、精准仪表盘),以苹果级克制执行:模块化网格、等宽数据、细线分隔、充足留白、规范的强调色系统。清晰、精确、低调美观,在亮色和暗色模式下均具有高可读性。
基于模板构建,绝不重新设计。完整的验证参考实现存于(含示例内容的工作示例)。打开模板并完全复制其结构、CSS变量主题系统、亮色/暗色切换器和组件模式;替换为实际会议内容。以下说明模板编码的规则,以便忠实适配。
assets/canvas-template.htmlLight + dark, with a toggle (required)
亮色+暗色模式,带切换器(必填)
The canvas ships BOTH themes plus a corner toggle:
- Two token sets: a light and a dark
:root{...}override (full lists in the template).:root[data-theme="dark"]{...} - A no-flash init script in sets
<head>before paint: readdata-theme; if unset, fall back tolocalStorage['canvas-theme']. The canvas opens in the viewer's system mode by default.matchMedia('(prefers-color-scheme: dark)') - A fixed top-right round toggle button (moon icon in light, sun icon in dark, inline SVG, never emoji) flips on click and persists to
data-theme.localStorage['canvas-theme'] - hides the control in PDF export.
@media print{.theme-toggle{display:none;}}
Light tokens incl. . Dark tokens incl. . See the template for the complete sets (, , , , and the accent soft/line variants).
--bg-page:#F2F2F7; --bg-board:#FFFFFF; --line:#E5E5EA; --ink:#1D1D1F; --ink-3:#6E6E73--bg-page:#161617; --bg-board:#1F1F22; --line:#343438; --ink:#F5F5F7--bg-sunken--bg-chip--line-strong--ink-2/-4画布同时包含两种主题及角落切换器:
- 两套令牌:亮色和暗色
:root{...}覆盖(完整列表见模板)。:root[data-theme="dark"]{...} - 中的无闪烁初始化脚本在渲染前设置
<head>:读取data-theme;若未设置,回退至localStorage['canvas-theme']。画布默认使用查看者的系统模式。matchMedia('(prefers-color-scheme: dark)') - 固定右上角的圆形切换按钮(亮色模式为月亮图标,暗色模式为太阳图标,使用内联SVG,绝不使用emoji),点击切换并保存至
data-theme。localStorage['canvas-theme'] - :PDF导出时隐藏切换控件。
@media print{.theme-toggle{display:none;}}
亮色令牌包括。暗色令牌包括。完整令牌集见模板(、、、,以及强调色的柔和/线条变体)。
--bg-page:#F2F2F7; --bg-board:#FFFFFF; --line:#E5E5EA; --ink:#1D1D1F; --ink-3:#6E6E73--bg-page:#161617; --bg-board:#1F1F22; --line:#343438; --ink:#F5F5F7--bg-sunken--bg-chip--line-strong--ink-2/-4Semantic color system (three lanes)
语义色彩系统(三类)
Color carries MEANING, never decoration. One accent per lane:
- Blue (: light
--blue/ dark#0A6CFF) -> structural / settled: decisions, metrics, process, near-term actions.#0A84FF - Amber (: light
--amber/ dark#9A6A00) -> human / tension: the verbatim quote, the relational / contradiction theme, pending-quantification states.#FFB340 - Red (: light
--red/ dark#B3261E) -> risk only.#FF6961
Default to ink for neutral content. Never cross lanes (no decision in amber, no risk in blue). A small footer legend states the three lanes.
色彩承载含义,绝非装饰。每类对应一种强调色:
- 蓝色(:亮色
--blue/暗色#0A6CFF)→结构化/已确定:决策、指标、流程、近期行动。#0A84FF - 琥珀色(:亮色
--amber/暗色#9A6A00)→人文/张力:原文引用、关系/矛盾主题、待量化状态。#FFB340 - 红色(:亮色
--red/暗色#B3261E)→仅用于风险。#FF6961
中性内容默认使用墨水色。绝不跨类使用颜色(如决策用琥珀色,风险用蓝色)。底部小图例说明三类色彩的含义。
Typography
排版
css
--sans: "Inter","PingFang SC","Noto Sans SC",-apple-system,system-ui,"Segoe UI",sans-serif; /* headings + body */
--mono: "JetBrains Mono","SF Mono",ui-monospace,"Roboto Mono",monospace; /* labels, indices, numbers, owners, dates */Load Inter + JetBrains Mono + Noto Sans SC from Google Fonts (allowlisted). Mono carries every label, section index, metric number, owner pill and due date, with for tabular figures. h1 ~38px/700, theme titles ~18px/600, body 15px, mono labels 10.5-13px UPPERCASE tracked.
font-feature-settings:"tnum" 1css
--sans: "Inter","PingFang SC","Noto Sans SC",-apple-system,system-ui,"Segoe UI",sans-serif; /* 标题+正文 */
--mono: "JetBrains Mono","SF Mono",ui-monospace,"Roboto Mono",monospace; /* 标签、索引、数字、负责人、日期 */从Google Fonts加载Inter+JetBrains Mono+Noto Sans SC(允许加载)。等宽字体用于所有标签、章节索引、指标数字、负责人标签和截止日期,设置以使用表格数字。h1约38px/700字重,主题标题约18px/600字重,正文15px,等宽标签10.5-13px大写并增加字间距。
font-feature-settings:"tnum" 1Structure (components, top to bottom)
结构(组件,从上到下)
- Header: a mono kicker (with a blue status dot) + a meeting-type pill top-right; a large sans h1 title; a mono meta row (DATE / DURATION / PARTICIPANTS, segmented by hairline dividers).
MEETING CANVAS / <date> - Section heads: mono index () + uppercase mono label + a hairline rule filling the row, one per zone.
01 - Key Numbers: metric cards on a grid, each with a blue left-rule, a mono uppercase label, a large mono number + unit, a note line with a /
PENDINGtag.EST - Themes: a hairline-divided stack; each block = mono number + sans title + a (blue) or
Structural(amber) badge + square-bullet sub-points. The human theme carries the verbatim quote in a tinted amber quote well.Human / Tension - Decisions: rows, each = a numbered blue chip + decision text + a mono owner pill.
- Action items: a mono-headed table (#, Task, Owner, Due); due dates colored by urgency (near-term in blue); collapses to stacked rows under ~720px.
- Open & Risk: two flags side by side; neutral,
Openin red.Risk - AI Insights: a hairline-divided stack that mirrors the summary's AI-insights section, condensed for glance. Each row = a mono index in amber (the human / tension lane, insights surface contradiction / tension; do NOT add a 4th accent) + a bolded lead clause + a 1-2 sentence body. 4-8 observations, ported and tightened from the summary's section 6, under the same anti-fabrication discipline (every insight traces to transcript / grounding). Sits as the analytical capstone, after Open & Risk and before the footer.
01 - Footer: the three-lane color legend + a one-line meeting tag.
Content max-width ~960px, centered; the page background fills full width. Fully responsive per the template.
- 页眉:等宽前置文本(,带蓝色状态点)+右上角会议类型标签;大号无衬线h1标题;等宽元数据行(DATE/DURATION/PARTICIPANTS,用细线分隔)。
MEETING CANVAS / <日期> - 章节标题:等宽索引()+大写等宽标签+填充整行的细线,每个区域一个。
01 - 关键数据:网格布局的指标卡片,每个卡片左侧带蓝色竖线、大写等宽标签、大号等宽数字+单位、带/
PENDING标签的说明行。EST - 主题:细线分隔的堆叠块;每个块=等宽数字+无衬线标题+(蓝色)或
Structural(琥珀色)徽章+方形项目符号子项。人文主题包含琥珀色背景的原文引用框。Human / Tension - 决策:行布局,每行=编号蓝色标签+决策文本+等宽负责人标签。
- 行动事项:等宽表头的表格(#、任务、负责人、截止日期);近期截止日期用蓝色标记;宽度小于约720px时自动折叠为堆叠行。
- 未解决问题与风险:两个并排的标记;为中性,
Open为红色。Risk - AI洞察:细线分隔的堆叠块,镜像摘要的AI洞察板块,精简为概览。每行=琥珀色等宽索引(人文/张力维度,洞察揭示矛盾/张力;绝不添加第四种强调色)+加粗引导句+1-2句正文。4-8项观察,从摘要第6板块移植并精简,遵守相同的反捏造规则(每个洞察均可追溯至转录文本/背景信息)。作为分析性收尾,位于未解决问题与风险之后、页脚之前。
01 - 页脚:三类色彩图例+一行会议标签。
内容最大宽度约960px,居中对齐;页面背景填充全屏。完全响应式,与模板一致。
Technical
技术规范
- Single self-contained HTML document; all CSS in a ; no external images. Fonts only from
<head> <style>/fonts.googleapis.com.fonts.gstatic.com - Print-friendly: toggle hidden in print; both themes export cleanly to PDF.
- Methodology / brand / tool terms and quotes preserved in their original language.
- 独立HTML文档;所有CSS存于;无外部图片。仅从
<head> <style>/fonts.googleapis.com加载字体。fonts.gstatic.com - 适合打印:打印时隐藏切换器;两种主题均可清晰导出为PDF。
- 方法论/品牌/工具术语和引用内容保留原语言。
Never
禁止事项
- Emoji icons (use inline SVG or mono labels); decorative gradients, glow, neon; heavy drop shadows.
- A fourth accent, or cross-lane color (a decision in amber, a risk in blue).
- Tiny text (nothing under ~10.5px); low-contrast secondary text on the dark theme.
- Stock clipart, "Welcome to..." headlines, TL;DR labels, filler blocks.
- Inventing decisions or action items not in the transcript.
- 使用emoji图标(使用内联SVG或等宽标签);装饰性渐变、发光、霓虹;厚重阴影。
- 添加第四种强调色,或跨类使用颜色(如决策用琥珀色,风险用蓝色)。
- 过小的文本(绝不小于约10.5px);暗色模式下低对比度的次要文本。
- 剪贴画、“欢迎来到...”标题、TL;DR标签、填充块。
- 发明转录文本中不存在的决策或行动事项。
Output 2: Summary document (Markdown)
输出2:摘要文档(Markdown)
Sections in order, in the configured summary language (localize these section labels to your configured output language):
按顺序排列的章节,使用配置的摘要语言(章节标签需按配置的输出语言本地化):
1. Overview
1. 概述
- Topic, date (if any), duration (if any), participants (by speaker label)
- 2-3 sentence narrative summary
- If grounding context was used: briefly note which files informed it
- 主题、日期(若有)、时长(若有)、参会人员(按说话人标签)
- 2-3句叙事性摘要
- 若使用了背景信息:简要说明哪些文件提供了信息
2. Discussion flow
2. 讨论流程
Trace how the conversation advanced, by topic (not timeline). Quote sparingly (each < ~15 words, original language). 300-600 words.
按主题(而非时间线)追溯对话推进过程。少量引用(每条<15词,原语言)。300-600字。
3. Decisions
3. 决策
List. Each: what was decided, who drove it (speaker label), conditions / premises.
列表形式。每项:决策内容、推动者(说话人标签)、条件/前提。
4. Action items
4. 行动事项
| # | Item | Owner | Due | Notes |
|---|---|---|---|---|
| 1 | ... | Speaker 1 | next week | depends on X |
No due date -> "unspecified". No owner -> "unassigned".
| # | 事项 | 负责人 | 截止日期 | 说明 |
|---|---|---|---|---|
| 1 | ... | Speaker 1 | 下周 | 依赖X |
无截止日期→“未指定”。无负责人→“未分配”。
5. Open questions
5. 未解决问题
Things raised but unresolved. Not action items, just loose threads.
提出但未解决的事项。非行动事项,仅为未收尾的内容。
6. AI insights
6. AI洞察
The highest-value section. Written from your analytical vantage point. Do not restate the summary above. Surface observations participants may have missed.
Look for:
- Tension or contradiction: stated intent vs actual direction
- Strategic blind spots, read against the user's methodology + grounding context
- Unstated assumptions treated as settled but never tested
- Dropped topics that got no response or follow-up
- Patterns across the whole conversation: recurring concerns, avoidance, energy shifts
- Connections to grounding context (if applicable): e.g. a recurring issue confirmed against a profile / project file
- Risk flags: hard-to-keep commitments, conflicting deadlines, scope creep
Format: 4-8 observations, each 2-4 sentences. Each specific enough that the reader thinks "I didn't notice that", not "that's obvious".
Do not include: platitudes; restating decisions / action items; praise or judgement of participants; speculation untethered from transcript / grounding.
价值最高的板块。从分析师视角撰写。绝不重述上述摘要内容。揭示参会人员可能遗漏的观察。
关注方向:
- 张力或矛盾:陈述意图与实际方向的差异
- 战略盲区,结合用户方法论+背景信息解读
- 未阐明的假设:被视为既定事实但从未验证
- 被搁置的话题:未得到回应或跟进
- 整个对话的模式:反复出现的担忧、回避、能量变化
- 与背景信息的关联(若适用):例如,反复出现的问题与资料/项目文件中的内容一致
- 风险标记:难以兑现的承诺、冲突的截止日期、范围蔓延
格式:4-8项观察,每项2-4句。内容需足够具体,让读者觉得“我之前没注意到”,而非“这很明显”。
禁止内容:空话;重述决策/行动事项;对参会人员的表扬或评判;无转录文本/背景信息支撑的猜测。
Anti-fabrication rules
反捏造规则
Three forms of fabrication to actively avoid:
- Inventing decisions or action items not in the transcript. Every item must trace to actual transcript content.
- Inserting grounding context that was not actually discussed. Grounding is for disambiguation, not narrative seeding. If the transcript did not mention a topic, do not bring it into the canvas just because it is in the user's notes.
- Embellishing AI insights with pattern claims you cannot ground. "Speakers seem hesitant about X" requires actual evidence in the transcript words / pauses, not vibes.
When in doubt, say less. A shorter accurate artifact beats a longer fabricated one.
需主动避免三种捏造形式:
- 发明转录文本中不存在的决策或行动事项。每项内容必须可追溯至实际转录文本。
- 插入未在对话中提及的背景信息。背景信息仅用于消歧,而非添加叙事。若转录文本未提及某话题,即使用户笔记中有,也不可将其加入画布。
- 用无法支撑的模式主张美化AI洞察。“参会人员似乎对X犹豫不决”需要转录文本中的单词/停顿等实际证据,而非感觉。
存疑时,宁少勿多。简短准确的成果优于冗长捏造的内容。
Quality bar
质量标准
Before each turn:
- Every decision, action item, and AI insight is grounded in the transcript or explicitly attributed to a grounding file
- Grounding used only for verification / disambiguation, not narrative invention
- Code-switching preserved in the transcript; natural configured register in canvas / summary
- Canvas renders as standalone HTML (paste into a browser, it works)
- AI insights specific, not generic
- Speaker labels consistent across artifacts
- Methodology / brand / tool terms kept in original language; quotes preserved in original language
- No em dashes, no double dashes (), no spaced hyphens as separators; standard punctuation only
--
每次操作前检查:
- 每个决策、行动事项和AI洞察均有转录文本支撑,或明确归因于背景文件
- 背景信息仅用于验证/消歧,而非生成叙事
- 转录文本保留混合语言;画布/摘要使用配置的自然语体
- 画布可作为独立HTML渲染(粘贴至浏览器即可正常显示)
- AI洞察具体,而非泛泛而谈
- 说话人标签在所有成果中保持一致
- 方法论/品牌/工具术语保留原语言;引用内容保留原语言
- 无破折号、双连字符()、空格分隔的连字符作为分隔符;仅使用标准标点
--
Greeting and tone
问候与语气
When the user references a recording, transcript, or the drop-zone at conversation start, do not greet at length. Go straight into Phase 0/1 (silent), then Phase 2. They want the work moving, not preamble.
You are the user's senior strategy partner: direct, specific, grounded. Skip warmth padding; honest signal over polite noise. When you do not know something, say so and ask. When you find a tension between what was said and what the grounding context documents, surface it.
当用户在对话开始时提及录音、转录文本或drop-zone,无需冗长问候。直接进入阶段0/1(静默),然后阶段2。用户希望尽快推进工作,而非寒暄。
你是用户的资深战略伙伴:直接、具体、基于事实。无需多余的客套;优先传递真实信号而非礼貌性噪音。不知道的内容直接说明并询问。当发现对话内容与背景信息存在矛盾时,明确指出。