agentleFS
JipletJiplet/transformation-os/skills/utility/utility-transcribe/SKILL.md

utility-transcribe

Skill2 starsChanged 4 months agoMITView on GitHub

Transcribe voice memos and audio recordings using OpenAI Whisper, then structure and write to the Obsidian wiki (99-Voice notes folder). Two modes — (1) Single-file: user drops an audio path or says "transcribe this", "voice memo". (2) Scan inbox: user says "process voice memos", "any new memos", "scan voice folder" — processes every audio file in the Google Drive inbox folder and moves each to processed/ after success. Also trigger when the user asks to capture a meeting or conversation from audio.

  • Reads credentials
  • Installs packages

The file

Show its rules and text

We split this skill into the rules it gives an agent

13 rules. About 0 are common, 5 are distinctive, and 8 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈5

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 8

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    If scan mode finds no audio files in the inbox, tell the user "Inbox is empty" and stop.

    line 31
  2. Very specific:

    If the venv doesn't have openai or requests, install first:

    line 51
  3. Distinctive:

    Check the user's request for a mode flag.

    line 58
  4. Distinctive:

    Use when the recording contains technical depth, methodology, systems context, or analysis recommendations that would be lost in a summary.

    line 90
  5. Very specific:

    Create one markdown file at: <workspace>/1 - Knowledge/99-Voice notes/<YYYY-MM-DD> - <slug>.md

    line 114
  6. Distinctive:

    Date: Use the audio file's mtime (when the recording happened), not today's date.

    line 117
  7. Very specific:

    Collisions: If the target filename exists, append (2), (3), etc.

    line 119
  8. Very specific:

    Body: Use the structured format matching the output mode (Summary or Detailed) — same section headings (## Summary (BLUF), ## Actions, ## …

    line 135
  9. Very specific:

    Do NOT include a top-level # heading in the body — the frontmatter title and filename carry the title.

    line 137
  10. Very specific:

    After a successful wiki write, move the source audio to the processed/ subfolder of the inbox:

    line 141
  11. Distinctive:

    Only move on success: If the wiki write failed, leave the file in the inbox so the next scan retries it.

    line 147
  12. Very specific:

    If the key is missing, prompt: "Add your OpenAI API key to .claude/skills/utility-transcribe/.env — see .env.example for format."

    line 158
  13. Very specific:

    No manual chunking required.

    line 167

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Voice Memo Transcriber

Transcribes audio using OpenAI Whisper, structures it into meeting notes, and writes one markdown file per memo to the Obsidian wiki.

Inbox folder (scan mode)

/Users/<user>/Library/CloudStorage/GoogleDrive-<your-email>@gmail.com/My Drive/99 Voice memos

Voice files arrive here automatically via Samsung → Autosync → Google Drive → Drive Desktop on Mac. After a successful wiki write, files move to the processed/ subfolder so the inbox always shows pending work.

Output target

Voice notes are written as markdown files to:

<workspace>/1 - Knowledge/99-Voice notes/

One file per memo. Filename: YYYY-MM-DD - <slug>.md (5–8 word slug derived from the BLUF). YAML frontmatter so Dataview / search-by-area works.

Step 0 — Determine mode

TriggerModeAction
User supplies a specific file pathSingle-fileUse that path, run Steps 1–4 once
"process voice memos", "any new memos", "scan voice folder", "new memos to process"Scan inboxList audio files in inbox root (NOT in processed/), run Steps 1–4 for each, in mtime order (oldest first)

If scan mode finds no audio files in the inbox, tell the user "Inbox is empty" and stop.

Step 1 — Get the transcript

Check the file extension first:

ExtensionAction
.m4a .mp3 .mp4 .wav .webm .ogg .mpeg .mpgaRun the transcription script (see below)
.txtRead the file directly with the Read tool
.docxExtract text: source <workspace>/.venv/bin/activate && python3 -c "import docx; print('\n'.join([p.text for p in docx.Document('PATH').paragraphs]))"
Pasted text in chatUse as-is — skip to Step 2

For audio files, run the transcription script:

source <workspace>/.venv/bin/activate && \
python3 <workspace>/.claude/skills/utility-transcribe/scripts/transcribe.py "<audio_file_path>"

If the venv doesn't have openai or requests, install first:

pip install openai requests

Step 2 — Determine output mode

Check the user's request for a mode flag. Default to Summary if not specified.

FlagModeUse when
--summary or no flagSummaryQuick capture — what happened, what's next
--detailedDetailedDeep technical/strategic content — methodology, systems, recommendations needed

Summary mode

Produce this structure. Be concise and executive-ready throughout.

Summary (BLUF)

2–3 sentences. Lead with the single most important point. What was decided or what matters most?

Actions

Bullet list. Each item: what, who (if named), by when (if stated). Use "TBC" if unclear.

Discussion & Notes

Full context in cleaned prose. Remove filler, preserve substance. Organise by topic if multiple threads.

Risks & Blockers

Bullet list. Only include if genuinely present in the recording — don't fabricate. If none, write "None identified."

Stakeholder Pulse

1–2 lines per person mentioned. Tone, position, concerns, alignment. If no named stakeholders, omit this section.


Detailed mode

Use when the recording contains technical depth, methodology, systems context, or analysis recommendations that would be lost in a summary. Produce an expanded structure:

Summary (BLUF)

2–3 sentences. Lead with the single most important point.

Actions

Bullet list. Each item: what, who, by when. Use "TBC" if unclear.

Discussion & Notes

Expand each topic thread fully. Include:

  • Background and context
  • System/data landscape (tools, sources, access status)
  • What's measurable vs not — and why
  • Recommended analysis approach (phased if appropriate)
  • Data requirements and access blockers

Risks & Blockers

Bullet list. Flag structural, data, access, and timeline risks explicitly.

Stakeholder Pulse

1–2 lines per person. Tone, position, concerns, alignment.

Step 3 — Write to Obsidian wiki

Create one markdown file at: <workspace>/1 - Knowledge/99-Voice notes/<YYYY-MM-DD> - <slug>.md

  • Date: Use the audio file's mtime (when the recording happened), not today's date.
  • Slug: 5–8 words derived from the BLUF. Plain ASCII, spaces between words, no punctuation. e.g. Plan maintenance fire pilot Teeth.
  • Collisions: If the target filename exists, append (2), (3), etc.

Frontmatter (YAML):

---
title: "<slug>"
type: voice-note
date: <YYYY-MM-DD>
source: "<original audio filename>"
area: <Telecommunications|D&SI|Transport|Infrastructure|PMO|Team|General>
people: [Name1, Name2]   # named participants — omit field entirely if none
tags: [voice-note, <2-4 topical tags in kebab-case>]
---

Body: Use the structured format matching the output mode (Summary or Detailed) — same section headings (## Summary (BLUF), ## Actions, ## Discussion & Notes, ## Risks & Blockers, ## Stakeholder Pulse). Detailed mode just has fuller content in each section.

Do NOT include a top-level # heading in the body — the frontmatter title and filename carry the title; Obsidian renders the filename as the H1.

Step 4 — Move processed file

After a successful wiki write, move the source audio to the processed/ subfolder of the inbox:

mv "<source_path>" "/Users/<user>/Library/CloudStorage/GoogleDrive-<your-email>@gmail.com/My Drive/99 Voice memos/processed/"

Only move on success. If the wiki write failed, leave the file in the inbox so the next scan retries it. Tell the user which files succeeded and which failed.

For single-file mode where the source isn't in the Drive inbox (e.g. an ad-hoc path the user gave you), skip the move — just tell the user the path of the new wiki note.

API Key

The script loads OPENAI_API_KEY from .env in this skill directory:

<workspace>/.claude/skills/utility-transcribe/.env

If the key is missing, prompt: "Add your OpenAI API key to .claude/skills/utility-transcribe/.env — see .env.example for format."

Supported formats

m4a, mp3, mp4, mpeg, mpga, m4a, wav, webm, ogg (OpenAI Whisper limits: 25MB per file)

Large files (auto-handled)

The script handles oversize files automatically:

  1. >25 MB → compress to 32 kbps mono AAC via afconvert
  2. Still >25 MB after compression (calls >~1.5 hrs) → split into 60-min chunks via ffmpeg, transcribe each, concatenate with \n\n separators No manual chunking required. Requires ffmpeg on PATH (installed via brew install ffmpeg).

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.