| name | meeting-transcription |
| description | Create diarized meeting transcripts from a user-provided local audio recording using configured pyannoteAI diarization and Mistral speech-to-text models, then save an Obsidian-ready Transcript.md. Use when the user asks to transcribe, diarize, process, or generate a transcript for meeting audio and provides or points to the audio file and the desired existing or new Obsidian Meetings folder. |
Meeting Transcription
Use this skill to turn a local meeting audio file into an Obsidian Transcript.md with named speakers where possible.
Required Inputs
Collect or infer these before running the CLI. Do not assume a recordings folder, vault path, speaker names, or meeting title.
- Audio source file path. It must be accepted by both Mistral STT and pyannoteAI media upload; current verified formats include
.mp3 and .m4a.
- Speaker count. Prefer exact
--num-speakers; use --min-speakers / --max-speakers only when the exact count is unknown.
- Speaker names if known. If names are not known, run once without
--speaker-map, inspect the first clear turns, then rerun with --skip-existing and a map.
- Spoken language(s), usually
nl or en. Pass --language for documentation and future modes; the current Mistral timestamped call auto-detects because language hints are not compatible with segment timestamps.
- Model configuration. Prefer repo-local
config/local.env values MEETING_TRANSCRIPTION_PYANNOTE_MODEL and MEETING_TRANSCRIPTION_MISTRAL_MODEL; override per run with --pyannote-model and --mistral-model when needed.
- Output destination:
- Existing Obsidian meeting package: pass
--meeting-dir.
- New ad hoc meeting package: pass
--create-meeting --meeting-date "YYYY-MM-DD HH:MM" --meeting-title "Title" and either pass --meetings-root or rely on local MEETING_TRANSCRIPTION_MEETINGS_ROOT, MEETING_WORKFLOWS_OBSIDIAN_VAULT, or discovered vault config.
- Non-meeting scratch output: pass
--output-dir.
Workflow
- Confirm the repo exists:
cd /path/to/meeting-workflow-skills/plugins/meeting-workflows/skills/meeting-transcription
./bin/diarized-transcript secrets-check
If the parent meeting-workflows plugin is installed and its bin/ directory is on PATH, diarized-transcript secrets-check is equivalent.
-
Use the audio file path the user gives you. If they point to a folder, search only that folder unless there is a clear reason to expand.
-
Run the transcript job.
Existing meeting folder:
./bin/diarized-transcript run "/path/to/audio.m4a" \
--language nl \
--num-speakers 2 \
--speaker-map "SPEAKER_01=Speaker Name,SPEAKER_00=Other Speaker" \
--meeting-dir "/path/to/Obsidian/Meetings/YYYY/YYYY-MM/YYYY-MM-DD HH.mm - Meeting Title"
New ad hoc meeting folder:
./bin/diarized-transcript run "/path/to/audio.m4a" \
--language nl \
--num-speakers 2 \
--speaker-map "SPEAKER_01=Speaker Name,SPEAKER_00=Other Speaker" \
--create-meeting \
--meetings-root "/path/to/Obsidian/Meetings" \
--meeting-date "YYYY-MM-DD HH:MM" \
--meeting-title "Meeting Title"
If MEETING_TRANSCRIPTION_MEETINGS_ROOT is set in the environment or in repo-local config/local.env, --meetings-root may be omitted. The CLI can also derive the meetings root from MEETING_WORKFLOWS_OBSIDIAN_VAULT plus MEETING_WORKFLOWS_MEETINGS_FOLDER (default Meetings).
Use config/local.env for non-secret install defaults. Keep API keys in environment variables, Bitwarden Secrets Manager, or an ignored repo-local .env; do not put API keys in config/local.env.
First pass when speaker mapping is unknown:
./bin/diarized-transcript run "/path/to/audio.m4a" \
--language nl \
--num-speakers 2 \
--output-dir "/tmp/meeting-transcription-check"
Then inspect the first minutes of Transcript.md, infer the map, and rerun with --skip-existing.
- Review:
Transcript.md is the user-facing transcript.
uncertainty_report.md lists timestamp-overlap conflicts and short ambiguous turns.
aligned_segments.json is the structured alignment output.
- Raw paid API outputs are cached under
raw/ or Attachments/diarization/raw/.
Use --skip-existing whenever rerunning only to change speaker names, formatting, or Obsidian placement.
Obsidian Rules
The folder layout below is this plugin's opinionated Obsidian convention, not an Obsidian standard. Read ../../docs/obsidian-meeting-package.md when creating or explaining a folder-based meeting package, including how to configure or discover the vault path.
Store meeting notes under:
Meetings/
YYYY/
YYYY-MM/
YYYY-MM-DD HH.mm - Meeting title/
Meeting.md
Preparation.md
Transcript.md
Attachments/
Materials/
When the user says the meeting already exists in Obsidian, write into that folder as Transcript.md.
When there is no meeting folder, create the canonical folder using the meeting date/time and a concise title inferred from the transcript or provided by the user. Create Meeting.md, Attachments/, and Materials/; keep decisions, action items, and follow-up in Meeting.md, not in Transcript.md.
Use real tab or at least four-space indentation for nested Markdown lists in Obsidian files.
Guardrails
- Do not print API keys or Bitwarden values.
- Do not call the paid APIs again when raw outputs are already cached and
--skip-existing can solve the task.
- Do not claim the transcript is perfect. Say it is a best-effort Precision-2 + Mistral merge with explicit uncertainty flags.
- If diarization labels look wrong, share examples and rerun from cache with corrected
--speaker-map.