ワンクリックで
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).