ffmpeg-audiolisted
Install: claude install-skill iansteitz1-eng/aria-skills
# ffmpeg-audio
One ffmpeg shape recurs across the voiceprint, diarization, whisper, and
training lanes: **mono · 16 kHz · signed-16-bit PCM WAV** —
`ffmpeg -ac 1 -ar 16000 -c:a pcm_s16le`. This skill is that convention as a
single idempotent CLI, so the same bytes come out every time regardless of who
runs it or what container went in.
**Defaults are the convention** (`SR=16000`, `CH=1`, `CODEC=pcm_s16le`). Change
them in one place at the top of `ffmpeg_audio.py` if a lane ever needs a
different target.
## Safety model
- **Dry-run by default.** Every op prints the exact `ffmpeg` command it *would*
run and changes nothing until `--apply`.
- **Idempotent.** An output that already exists and is newer than its input(s)
is **skipped** — re-running a batch is free. `--force` rebuilds anyway.
- **Read-only `probe`** never writes.
## The four ops
1. **normalize** — any audio → mono 16k PCM WAV (the canonical convention).
```sh
python3 ~/.claude/skills/ffmpeg-audio/ffmpeg_audio.py normalize output.m4a -o ian.wav --apply
```
Batch a roster with globs + `--suffix` (no `-o`):
```sh
python3 .../ffmpeg_audio.py normalize ian.* brandon.* stephen.* --suffix .16k.wav --apply
```
2. **trim** — slice `--start`/`--duration` then normalize (the enroll-clip
pattern: `superwhisper/recordings/<ts>/output.wav` → `~/enroll/ian.wav`, 22s).
```sh
python3 .../ffmpeg_audio.py trim output.wav --start 0 --duration 22 -o ~/enroll/ian.wav --apply
```
3. **concat**