Skip to content
Back to skills

Transcribe Video

ASecurity

Use when the user wants to transcribe a video or audio file to text with word-level timestamps — spins up a self-contained local Whisper (whisper.cpp) Docker service bundled in this skill and returns transcript.txt, transcript.srt, and word-level transcript.words.json. Also used as a building block by /produce-video. Triggers on "transcribe this video", "get a transcript", "transcribe-video".

  • 42 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 22, 2026
ai-agentsbashnodedockerapi

Works with

  • cli
  • api

Security analysis

A100/100

Pro scans all 12 files and shows the line behind each finding

Scanned October 22, 2026

npx -y skills add AlemTuzlak/skills --skill transcribe-video --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Transcribe Video?

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

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

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-video
description: Use when the user wants to transcribe a video or audio file to text with word-level timestamps — spins up a self-contained local Whisper (whisper.cpp) Docker service bundled in this skill and returns transcript.txt, transcript.srt, and word-level transcript.words.json. Also used as a building block by /produce-video. Triggers on "transcribe this video", "get a transcript", "transcribe-video".
---

# Transcribe Video

Transcribes any video/audio file locally using a bundled whisper.cpp service. No external project or cloud API. Returns word-level timestamps (needed for synced overlays/captions).

## When to use
- "Transcribe this clip / video / audio", "get me a transcript with timestamps".
- As a sub-step of `/produce-video`.

## How it runs
Everything is driven by the bundled runner — never ask the user to manage Docker:

```bash
node scripts/transcribe.mjs <path-to-video-or-audio> [--out <dir>] [--port 9111] [--language en] [--no-word-ts] [--task transcribe|translate]
node scripts/transcribe.mjs --stop      # stop the warm container
```

The runner:
1. Checks the Docker daemon is reachable (fails loud with guidance if not).
2. Builds the `transcribe-video-whisper` image from `assets/whisper-service/` if it is missing (first build is slow: it compiles whisper.cpp and bakes the `ggml-base.en.bin` model).
3. Starts the `transcribe-video-whisper` container (host port 9111 → container 9001); reuses it if already running, `docker start`s it if stopped.
4. Waits for `GET /healthz` to report ok.
5. Extracts a 16 kHz mono WAV from the input with local **ffmpeg** (whisper.cpp only decodes WAV), then POSTs it to `/transcribe` with `word_ts=true`.
6. Writes `transcript.txt`, `transcript.srt`, `transcript.words.json` to `--out` (default: the input file's directory), and prints a JSON result line to stdout.

## Outputs
- `transcript.txt` — plain text.
- `transcript.srt` — subtitle text.
- `transcript.words.json` — `[{ "word", "start", "end" }]`, seconds, time-ordered. This is the sync source for overlays/captions.

stdout result line (for programmatic callers like `/produce-video`):
```json
{ "ok": true, "outDir": "...", "wordCount": 38, "segmentCount": 2, "files": { "txt": "transcript.txt", "srt": "transcript.srt", "words": "transcript.words.json" } }
```

## Requirements
- **Docker is REQUIRED** — the Whisper service runs in a container, so Docker Desktop must be installed AND running. The runner checks this first and fails loud with install/start guidance if Docker is missing or its daemon is down; there is no non-Docker fallback.
- **ffmpeg is REQUIRED** (used to extract a 16 kHz mono WAV for Whisper) — the runner checks for it up front and fails loud if it is not on PATH.
- Node ≥ 22.

## Notes
- The container is left running (`--restart unless-stopped`) for warm reuse; stop with `--stop`.
- If word timestamps are requested but none come back, the runner fails loud (overlay sync depends on them).
- See `references/` for the Docker lifecycle, the API shape, and the vendoring provenance.

Files in this skill

  • .gitignore232 B
  • SKILL.md3 KB
  • assets/whisper-service/Dockerfile1.8 KB
  • assets/whisper-service/app.py7.1 KB
  • assets/whisper-service/requirements.txt85 B
  • references/docker-lifecycle.md1.5 KB
  • references/provenance.md1.4 KB
  • references/whisper-api.md1.3 KB
  • scripts/argparse.test.mjs864 B
  • scripts/fixtures/whisper-ojf-sample.json6.2 KB
  • scripts/test_parse_full_json.py1.2 KB
  • scripts/transcribe.mjs7.6 KB

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…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.