GPU meeting transcription skill for Claude Code — 90x realtime on H100 using WhisperX
SaferSkills independently audited whisper-transcribe (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Batteries-included transcription for Steve's environment. Defaults tuned for 会议录音 on H100/H200 GPUs.
# Default: WhisperX large-v3, bs=16, auto language (best for Chinese+English meetings)
~/.claude/skills/whisper-transcribe/scripts/transcribe.sh <audio_file>
# Output files written to same dir as input:
# <input>.txt plain transcript
# <input>.segments.txt [timestamp] text lines
# <input>.json full WhisperX JSON| Use case | Command |
|---|---|
| Default (meeting, auto) | transcribe.sh meeting.m4a |
| Chinese only (faster, monolingual only) | transcribe.sh meeting.m4a --lang zh |
| English only (monolingual only) | transcribe.sh meeting.m4a --lang en |
| Fast mode (bs=32, nearly identical quality) | transcribe.sh meeting.m4a --fast |
| Quality mode (bs=8, slightly better) | transcribe.sh meeting.m4a --quality |
| Speaker diarization (who said what) | transcribe.sh meeting.m4a --diarize |
| SRT subtitles | transcribe.sh video.mp4 --srt |
| Word-level timestamps | transcribe.sh audio.wav --words |
| Audio length | Expected wall time | Realtime factor |
|---|---|---|
| 10 min | ~7s | 90x |
| 30 min | ~20s | 90x |
| 60 min | ~40s | 90x |
| 2 hours | ~80s | 90x |
Compared alternatives on 54-min Chinese-English meeting:
| Method | Time | Quality | Notes |
|---|---|---|---|
| openai-whisper (stock) | 18 min | ❌ mixes zh/en | Baseline |
| faster-whisper bs=32 | 28s | ⚠️ mixes zh/en in segments | Fastest |
| WhisperX bs=16 (this skill) | 36s | ✅ Correct zh/en segmentation | Best balance |
WhisperX wins on quality: Pyannote VAD correctly segments Chinese-English code-switched speech into language-consistent chunks.
Already installed in Steve's env (verified 2026-05-05):
whisperx (pip) — includes faster-whisper + Pyannoteffmpeg at /opt/ffmpeg/bin/ffmpeg (for audio conversion)If running on a fresh machine, the setup script handles everything:
~/.claude/skills/whisper-transcribe/scripts/setup.shDefault is the right answer 99% of the time. Just run:
~/.claude/skills/whisper-transcribe/scripts/transcribe.sh <audio>Only add flags when the user explicitly asks:
--lang zh / --lang en → only when audio is truly monolingual. Forcing a single language on code-switched audio causes hallucination loops. Leave blank for mixed zh/en — auto-detect + VAD handle it correctly.--diarize → user asks "谁说了什么", "who said what", speaker labels--srt → user asks for subtitles--fast → user says "快一点", "quick", "draft quality is fine"--quality → user says "最高质量", "highest accuracy"--words → user asks for word-level timestamps or karaoke-style outputAfter transcription:
| Problem | Fix |
|---|---|
Failed to load audio | The raw WAV may lack a header; script auto-reconverts via ffmpeg |
CUDA OOM | Use --fast with lower batch (8 or 4) via --bs 4 |
| Poor quality on a single language | Explicitly set --lang zh or --lang en |
| Missing HF token (for diarization) | Run huggingface-cli login once |
| Model download slow | First run downloads ~3 GB to ~/.cache/huggingface/; subsequent runs are cached |
scripts/transcribe.sh behavior:
<name>.txt — plain transcript (joined segments)<name>.segments.txt — [NNNs] text timestamped lines<name>.json — full WhisperX result (includes word timings if --words)Exit codes: 0 success, 1 bad input, 2 transcription error, 3 missing dependency.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.