Ffmpeg audio
Open-source Claude Code Skills that replace clicking through vendor dashboards — Stripe, Cloudflare DNS, ElevenLabs, GitHub, and more. Powered by Aria Code.
npx -y skills add iansteitz1-eng/aria-skills --skill ffmpeg-audioAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
The prod audio convention made declarative — coerce any container (.m4a/.mp3/.webm/.wav) to mono 16 kHz signed-16-bit PCM WAV (`-ac 1 -ar 16000 -c:a pcm_s16le`), the exact input shape TitaNet/voiceprint, NeMo diarization, whisper, and the training corpus all expect. Four ops (normalize · trim-to-clip · concat · probe) plus a YAML reconcile mode. Idempotent (skips up-to-date outputs), dry-run by default (nothing runs without --apply). Use when Ian says "normalize this audio", "make a 16k wav", "extract an enroll clip", "trim that recording", "convert to mono 16k", "prep audio for whisper/diarization/voiceprint", "batch-convert these recordings", or any time audio needs the prod mono-16k-PCM shape.
SKILL.md
3.9 KB, as published. Nobody here has run it
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
ffmpegcommand 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.
--forcerebuilds anyway. - Read-only
probenever writes.
The four ops
-
normalize — any audio → mono 16k PCM WAV (the canonical convention).
python3 ~/.claude/skills/ffmpeg-audio/ffmpeg_audio.py normalize output.m4a -o ian.wav --applyBatch a roster with globs +
--suffix(no-o):python3 .../ffmpeg_audio.py normalize ian.* brandon.* stephen.* --suffix .16k.wav --apply -
trim — slice
--start/--durationthen normalize (the enroll-clip pattern:superwhisper/recordings/<ts>/output.wav→~/enroll/ian.wav, 22s).python3 .../ffmpeg_audio.py trim output.wav --start 0 --duration 22 -o ~/enroll/ian.wav --apply -
concat — join N inputs into one normalized WAV (filter_complex concat).
python3 .../ffmpeg_audio.py concat a.wav b.wav c.wav -o joined.wav --apply -
probe — ffprobe readout (codec · channels · rate · duration). Read-only.
python3 .../ffmpeg_audio.py probe ian.wav
Reconcile a YAML catalog
For a fixed set of jobs (e.g. the enroll roster), declare them once and reconcile — idempotent, so it's safe to re-run after adding one person.
python3 .../ffmpeg_audio.py reconcile jobs.yaml # dry-run
python3 .../ffmpeg_audio.py reconcile jobs.yaml --apply # execute
See examples/enroll_roster.yaml for the shape:
jobs:
- op: trim
input: ~/superwhisper/recordings/2026-06-05/output.wav
start: 0
duration: 22
output: ~/enroll/ian.wav
- op: normalize
input: ~/recordings/brandon.m4a
output: ~/enroll/brandon.wav
- op: concat
inputs: [~/clips/a.wav, ~/clips/b.wav]
output: ~/enroll/merged.wav
Flags
--apply— actually run ffmpeg (default: dry-run preview)--force— rebuild even if the output is up-to-date--json— machine-readable result array (for chaining)--suffix— output name when-ois omitted (normalize/trim batch mode)
Notes
- macOS:
brew install ffmpeg· Ubuntu:apt-get install -y ffmpeg. The script hard-fails on a missingffmpeg/ffproberather than running half a batch. - Stdlib only for the four ops;
reconcileneeds PyYAML. - Output dirs are created as needed. Inputs are glob-expanded (order-preserving, de-duped); a missing input surfaces as a per-job error, never silent.
License
Apache 2.0