Skip to content
Back to skills

Transcribe Meeting

ASecurity

Transcribe a Kleoth meeting from within Claude Code by running the `kleoth transcribe` CLI (ElevenLabs Scribe) with the right flags, then reporting the diarized transcript and its cost. Use when the user wants to turn a meeting recording — an audio file or a meeting/recording folder — into a speaker-tagged transcript. Note: unlike summarization, Claude cannot do speech-to-text itself; this wraps the paid Scribe API and needs the user's own ElevenLabs key.

  • 7 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 27, 2026
ai-agentsswiftapi

Works with

  • claude code
  • cli
  • api

Security analysis

A100/100

Scanned September 27, 2026

npx -y skills add ofcRS/kleoth --skill transcribe-meeting --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Transcribe Meeting?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Transcribe Meeting
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/ofcrs-transcribe-meeting/badge)](https://www.skillsdirectory.com/skills/ofcrs-transcribe-meeting)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: transcribe-meeting
description: Transcribe a Kleoth meeting from within Claude Code by running the `kleoth transcribe` CLI (ElevenLabs Scribe) with the right flags, then reporting the diarized transcript and its cost. Use when the user wants to turn a meeting recording — an audio file or a meeting/recording folder — into a speaker-tagged transcript. Note: unlike summarization, Claude cannot do speech-to-text itself; this wraps the paid Scribe API and needs the user's own ElevenLabs key.
---

# Transcribe a Kleoth meeting (wraps `kleoth transcribe`)

This skill turns a meeting recording into a **diarized, speaker‑tagged transcript** by driving the `kleoth transcribe` CLI for the user, picking the correct flags, and reporting the result and its cost.

> **Why this isn't free (unlike summarize-meeting).** Summarization is a language task, so the `summarize-meeting` skill lets *you — Claude Code* — do it directly at $0.00. **Transcription is speech‑to‑text, which Claude cannot do itself.** It requires the **ElevenLabs Scribe** API, which is **paid and uses the user's own key**. This skill's value is convenience: it points Scribe at the right file with the right flags, then surfaces the transcript and cost — it does not (and cannot) transcribe audio on its own.

## When to use

- The user has an **audio file** (`.m4a`, `.wav`, `.mp3`, `.flac`, …) and wants a transcript.
- The user points at a **meeting folder** produced by the Kleoth macOS app (named `meeting-YYYY-MM-DD-HHMMSS`, containing `mic.m4a` / `system.m4a` / `meeting.m4a`) and wants it transcribed.
- The user says "transcribe this meeting / call / recording" and wants speaker‑separated text out.

If they want a *summary*, transcribe first (this skill), then hand off to **`summarize-meeting`** (see below).

## Prerequisite: the user's ElevenLabs key (BYO, paid)

The CLI reads `ELEVEN_API_KEY` (or `ELEVENLABS_API_KEY`) from the environment, a `.env` file, or `~/.config/kleoth/config.json`. The key **must have the `speech_to_text` permission** — without it Scribe returns `401 {"status":"missing_permissions"}` even though auth otherwise succeeds.

- **Never read, print, or echo `.env` or any API key.** If the CLI reports a missing/invalid key, tell the user how to set one (env / `.env` / `~/.config/kleoth/config.json`) and the `speech_to_text` requirement — don't try to fish the key out yourself.
- This is a billed call against the user's account. Cost scales with audio length (~$0.22/hour of audio). For a long recording, it's polite to confirm before running.

## Input: pick the file and the mode

Ask for the input if none was given. There are two shapes, and they need **different flags**:

1. **A single mixed audio file** (one track, everyone audible on it) → use **diarization**: Scribe separates speakers into `speaker_0`, `speaker_1`, … Pass `--num-speakers N` when the count is known (better accuracy); omit it to let Scribe guess. **Do not** pass `--multi-channel`.

2. **A Kleoth meeting/recording folder** (mic + system audio) → use **multi‑channel**: one speaker per channel, giving clean "you vs. them" separation. The folder contains a pre‑built 2‑channel `meeting.m4a` (mic = ch 0, system = ch 1); transcribe **that file** with `--multi-channel`. If only `mic.m4a` is present (the 2‑channel build didn't happen), fall back to treating it as a single mixed file (option 1). `kleoth transcribe` takes a **single file argument**, so always point it at `meeting.m4a` inside the folder — not at the folder itself.

Build the CLI first if needed: `swift build`.

## Exact invocations

**Single mixed file (diarized):**
```sh
swift run kleoth transcribe /path/to/meeting.m4a --num-speakers 2
#   --num-speakers N   hint the speaker count (omit to auto-detect)
#   --language en      hint a language (auto-detected when omitted)
#   --out ./out        output directory (default: ~/Kleoth)
```

**A mic+system meeting folder (multi-channel):**
```sh
swift run kleoth transcribe "/path/to/meeting-YYYY-MM-DD-HHMMSS/meeting.m4a" --multi-channel
#   one speaker per channel — do NOT also pass --num-speakers
```

The command writes a fresh, uniquely-named meeting directory (default `~/Kleoth/meeting-<timestamp>/`, or under `--out`) containing `transcript.json` (raw Scribe response), `transcript.md` (speaker‑tagged `Name: text` lines), and `meta.json` (includes the cost breakdown). It **does not** produce a summary — that's a separate step.

> Each run gets its own timestamped folder, so transcribing twice never overwrites an earlier transcript.

## Surface the result and the cost

On success the CLI prints up to ~20 speaker turns, a `Cost:` line, and `Meeting saved to: <dir>`. Report back:

- **Where it landed** — the meeting directory path and that `transcript.md` holds the full diarized transcript.
- **The cost** — read it from `<dir>/meta.json` rather than re‑deriving it. The `cost` object uses snake_case: `transcription_cost` (USD; the billed amount), `summary_cost` (0 here — no summary was made), and `audio_duration_secs`. Quote the transcription cost and the audio length, e.g. *"Transcribed 53.7s of audio for ~$0.0033 (ElevenLabs Scribe)."* Be clear this was a **real, paid** API call on the user's key.
- **Speakers are anonymous** (`speaker_0`, `speaker_1`, …). If they want real names, point them at `swift run kleoth rename <dir>` (interactive — shows sample turns per speaker).

## Hand off to summarize-meeting

Transcription only produces the transcript. If the user wants decisions / action items / a TLDR, offer to continue with the **`summarize-meeting`** skill, passing it the **meeting directory** this skill just produced. That path is free (no OpenRouter key, $0.00) — *you* write `summary.json` + `summary.md` directly. So the natural flow is: **this skill (paid Scribe transcript) → `summarize-meeting` (free Claude Code summary)**, ending with both `transcript.md` and `summary.md` in the same folder.

## Notes

- Equivalent to the macOS app's record→transcribe path and to the transcription half of `kleoth summarize` — all share the same pipeline and write the same artifacts.
- For a summary in one shot via the *paid* model instead, `kleoth summarize <file>` transcribes and summarizes together (needs both an ElevenLabs **and** an OpenRouter key). Prefer transcribe + `summarize-meeting` to keep the LLM half free.
- Never read or echo `.env` or any API keys.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…