一键导入
gen-stt
Transcribe audio to text locally via NVIDIA Parakeet TDT 0.6B ONNX — single clip or batch parallel, no API key
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Transcribe audio to text locally via NVIDIA Parakeet TDT 0.6B ONNX — single clip or batch parallel, no API key
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Surface open PRs that have genuinely unaddressed review feedback, filtering out CodeRabbit auto-summaries and CI-bot noise. Use before ending a session, when asked "which of my PRs need attention", or to gate a session close on unresolved review threads.
Sync git repository with upstream. Use at the start of a session, when asked to sync, get up to date, check git status, or when working on a stale branch.
Analyze content and generate illustrations via Gemini image API
Brainstorm multiple visual directions for a blog image, generate them in parallel, build a comparison page, and optionally publish as a shareable link (Surge.sh or gist).
Bulk-parallel CLIs — turn N sequential gh/bd/git/file tool calls into a single fan-out JSON call. Use when the session is about to fire ≥3 similar sequential calls (gh pr view, bd show, Read of small files, up-to-date diagnose across repos).
Extract durable lessons from a completed Claude session and codify them in the right CLAUDE.md files or skills. Use at the end of a long session, after a bug hunt that surfaced a non-obvious constraint, or when the user asks "what can we learn from this session". Discovers CLAUDE.md files dynamically, routes lessons by generic scope (project / shared conventions / environment / machine-local), enforces neutral voice, and asks for approval before editing.
| name | gen-stt |
| description | Transcribe audio to text locally via NVIDIA Parakeet TDT 0.6B ONNX — single clip or batch parallel, no API key |
| argument-hint | single <file> | batch-dir <dir> | batch-files <file...> [--json] [--output path] |
| allowed-tools | Bash, Read, Write, Glob, Grep |
Turn audio files into text via the local nemo-parakeet-tdt-0.6b-v2
ONNX model. This is the LOCAL path — no API key, no network after
first model download, and no per-minute billing. The trade vs. cloud
STT (Whisper API, AssemblyAI, Google STT) is CPU time: ~30s wall for
5s of audio on Igor's 8-core dev box with 2-thread cap; competitive
accuracy on clean English.
Sibling skill: gen-tts (Gemini TTS). Together they form a full
voice-in / voice-out pipeline.
Parse the user's input for:
single subcommand), directory of audio
files (batch-dir subcommand), or space-separated list (batch-files
subcommand). Accepted
formats: WAV, OGG, OGA, MP3, M4A, FLAC, AAC, OPUS — anything ffmpeg
can read. Non-WAV (or non-16kHz-mono) inputs are auto-transcoded to
16 kHz mono 16-bit PCM WAV (Parakeet's training sample rate) in a
temp dir; already-16kHz-mono WAV inputs skip the transcode.--output path: Single-mode transcript destination. Defaults to
<input>.txt (or .json) alongside the input.--output-dir DIR: Batch-mode transcript destination dir.--json: Emit {text, duration_s, model, elapsed_s} JSON
instead of plain text.--keep-wav: Retain the intermediate transcoded WAV for
debugging. Has no effect when the input was already 16kHz mono.--model NAME: Override the default
nemo-parakeet-tdt-0.6b-v2 onnx-asr model.--max-workers N: Parallel batch workers. Default 1
(serial). Aggregate CPU = max_workers × per-process thread cap (2),
so --max-workers=2 already drives 4 threads and often runs slower
per file than serial on consumer CPUs (measured 2026-04-16: 3 files
at --max-workers=2 took 114s vs ~60s projected serial). Only raise
on a box with spare cores where wall-clock matters more than per-file
latency.~/.cache/huggingface/ — first invocation downloads
~2 GB. Subsequent runs are fully offline and fast.parakeet-stt.py — single Python entry point
handling transcode detection, ffmpeg invocation, onnx-asr dispatch,
and parallel batch via ThreadPoolExecutor. Uses PEP-723 inline
metadata with stdlib (subprocess, pathlib, wave, json,
concurrent.futures) plus typer>=0.12, launched via uv run --script.nemo-parakeet-tdt-0.6b-v2 (600M parameters; NVIDIA NeMo ASR)uvx --with onnxruntime --with huggingface_hub onnx-asrwave module and skips the
transcode; otherwise it invokes ffmpeg -ar 16000 -ac 1 -acodec pcm_s16le.Every Parakeet + ffmpeg invocation is wrapped with:
nice -n 19 ionice -c 3 env OMP_NUM_THREADS=2 ORT_NUM_THREADS=2 MKL_NUM_THREADS=2 <cmd>
The prefix is baked into a single _niced_run() helper in
parakeet-stt.py; there is no code path that invokes ffmpeg or
onnx-asr without it. Rationale:
nice alone does NOT cap CPU; it only yields on contention. On an
idle machine, onnxruntime will happily saturate all 8 cores.Verify on a live run with awk '{print $19}' /proc/<pid>/stat (nice
level) and ionice -p <pid> (IO class idle).
GEN_STT="$(git -C ~/gits/chop-conventions rev-parse --show-toplevel)/skills/gen-stt/parakeet-stt.py"
"$GEN_STT" single /tmp/clip.ogg --output /tmp/transcript.txt
"$GEN_STT" single /tmp/clip.wav --json --output /tmp/transcript.json
Produces:
{
"text": "Hello from Larry. This is the voice pipeline test.",
"duration_s": 5.4,
"model": "nemo-parakeet-tdt-0.6b-v2",
"elapsed_s": 29
}
"$GEN_STT" batch-dir /tmp/voice-memos --output-dir /tmp/transcripts
Every audio file under /tmp/voice-memos gets a <stem>.txt in
/tmp/transcripts (suffix is replaced, not appended). With --json,
writes <stem>.json and emits a summary JSON on stdout. Without
--output-dir, transcripts land alongside each input as <stem>.txt.
"$GEN_STT" batch-files /tmp/a.ogg /tmp/b.m4a /tmp/c.wav --json
Since gen-tts and gen-stt are exact siblings, the TTS → STT loop is
a tight end-to-end test:
GEN_TTS=~/gits/chop-conventions/skills/gen-tts/generate-tts.py
GEN_STT=~/gits/chop-conventions/skills/gen-stt/parakeet-stt.py
"$GEN_TTS" single --text "Hello from Larry. This is the voice pipeline test." --output /tmp/roundtrip.wav
"$GEN_STT" single /tmp/roundtrip.wav --output /tmp/roundtrip.txt
cat /tmp/roundtrip.txt
# → "Hello from Larry. This is the voice pipeline test."
brew install ffmpeg or apt install ffmpeg.onnx-asr. Install via
brew install uv or pip install uv.onnx-asr returns nothing (silent audio,
unsupported encoding that ffmpeg salvaged into unusable WAV), the
script raises with the last 2KB of onnx-asr stderr for diagnosis
rather than writing an empty file.--max-workers=1 (serial). Raising it is
rarely a win: the per-process thread cap stays at 2, so aggregate CPU is
max_workers × 2, and onnxruntime cold-start overhead per worker means
parallel runs often finish slower per file than serial. Keep
max_workers ≤ cores/2 if you do raise it./tmp/ or a consumer repo's private
assets dir.onnx-asr binary — swap --model whisper-base).