audio
Skill1 starsChanged 3 months agoMITView on GitHub
Extract, convert, trim, concatenate, normalize, fade, resample, and silence-detect audio using ffmpeg. Use when you need to modify audio tracks, change format or sample rate, edit timeline segments, or prepare audio for muxing back onto video.
8 other projects use a version of this.
Adopted by
Most recently taken up by
- bmcszk/agent-skillstheir own version, first seen Oct 29, 2026
- autonomous-ai/lampOStheir own version, first seen Oct 15, 2026
- bloxy-studios/shorts-studiotheir own version, first seen Oct 1, 2026
- AlexeyPerov/Unity-Open-MCPtheir own version, first seen Jul 14, 2026
- qmertesdorf/GameForgetheir own version, first seen Jun 28, 2026
- rainday/smart-blog-skillstheir own version, first seen May 15, 2026
Other versions8 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 8
- autonomous-ai/autonomous-os★ 552same name
- autonomous-ai/lampOS★ 552same name
- autonomous-ai/Physical-AI-Operating-System★ 552same name
- rainday/smart-blog-skills★ 35same name
- AlexeyPerov/Unity-Open-MCP★ 17same name
- bmcszk/agent-skills★ 2same name
- bloxy-studios/shorts-studio★ 0same name
- qmertesdorf/GameForge★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository16 other files it gives its agents.
- AGENTS.mdAGENTS.md
- site/AGENTS.mdAGENTS.md
- site/CLAUDE.mdCLAUDE.md
- captions-complianceSkill
- downloadSkill
- forced-narrative-exactSkill
- imageSkill
- inspectSkill
- install-media-toolsSkill
- program-masterSkill
- shotsSkill
- speech-captionsSkill
- subtitlesSkill
- timecodeSkill
- video-transformationSkill
- vision-analysisSkill
The file
We split this skill into the rules it gives an agent
8 rules. 0 are common, 1 is distinctive, and 7 are very specific to this project.
0
Common
Most of the 7 edited versions we read keep these.
1
Distinctive
This author's own choices. Worth a look.
7
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 43
If your tools showed a filesystem path when loading this SKILL.md, strip SKILL.md and use that folder.
- Very specific: line 44
If you already ran another mediaskills script (for example .../audio/scripts/extract.py), this skill is a sibling of that folder: same …
- Very specific: line 67
Prefer absolute paths for --input / --output when cwd is uncertain.
- Distinctive: line 72
Before running any script, treat these two failures differently:
- Very specific: line 75
Only escalate sandbox permissions if the error is explicitly a permission denial (e.g.
- Very specific: line 81
Run inspect on the source to confirm duration and audio codec.
- Very specific: line 97
Use output_path from JSON for downstream transcription or editing.
- Very specific: line 120
Read data.silence_starts / data.silence_ends (seconds) to split on pauses or detect dead air.
“Common” is measured: kept by at least 6 in 10 of the 7 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Audio
Audio processing with ffmpeg. Use this skill when you need to change audio — not just read metadata (use inspect for that).
When to use
- This skill — extract audio from video, convert formats, trim/concat timeline edits, loudness normalize, fade, resample, find silence.
inspect— read-only metadata before editing (duration, codecs, sample rate). Always probe first when unsure about input format.video-transformation— mux normalized or extracted audio back onto video (replace_audio.pyand similar ops).- Raw ffmpeg — fine for one-off filter chains, but these scripts return consistent JSON and auto-generate output paths.
Gotchas
- Trim with
-c copy—trim.pystream-copies for speed. Works for WAV and many containers; can fail or produce glitches on MP3/AAC with frame boundaries. Re-encode with ffmpeg manually if copy fails. - Concat requires matching codecs —
concat.pyuses the concat demuxer with-c copy. All inputs must share codec, sample rate, and channel layout. Convert/resample first if needed. - Normalize outputs WAV —
loudnormwrites PCM WAV. Mux back to video withvideo-transformationreplace_audio.py, or convert withconvert.py. - Fade is fixed 1 s in —
fade.pyappliesafade=t=in:st=0:d=1only. Custom fade curves need raw ffmpeg. - Silence threshold is fixed —
silence_detect.pyusesnoise=-30dB:d=0.5. Pure tones (e.g. test fixtures) may report no silence; real speech/podcast material works best. - Extract vs video extract —
extract.pystrips video (-vn) to WAV. For video-specific workflows, checkvideo-transformationextract_audio.pytoo.
Running scripts
This skill's scripts live in scripts/ alongside this file. Before running any script, resolve its absolute path from this skill's own directory — do not assume the shell cwd is the skill folder, the repo root, or the workspace. Stay in the workspace (so media paths resolve) and pass the absolute script path to uv run:
uv run <skill_directory>/scripts/normalize.py --input "<path-to-media>"<skill_directory> is a placeholder. Never pass those angle brackets to the shell — the command will fail. Replace it with a real absolute directory before invoking uv run.
How to get that directory (do this yourself; do not ask the user first; do not skip the skill):
- If your tools showed a filesystem path when loading this
SKILL.md, stripSKILL.mdand use that folder. - If you already ran another mediaskills script (for example
.../audio/scripts/extract.py), this skill is a sibling of that folder: same parent, directory nameaudio. - Otherwise search standard install locations and confirm the script exists:
NAME=audio
for d in \
"$HOME/.agents/skills/$NAME" \
"$HOME/.cursor/skills/$NAME" \
"$HOME/.codex/skills/$NAME" \
"$HOME/.claude/skills/$NAME" \
"$PWD/.agents/skills/$NAME" \
"$PWD/.cursor/skills/$NAME" \
"$PWD/skills/$NAME"
do
if [ -f "$d/SKILL.md" ] && [ -e "$d/scripts/normalize.py" ]; then
SKILL_DIR=$(cd "$d" && pwd)
break
fi
done
[ -n "$SKILL_DIR" ] || { echo "mediaskills: $NAME not found" >&2; exit 1; }
uv run "$SKILL_DIR/scripts/normalize.py" --input "<path-to-media>"Prefer absolute paths for --input / --output when cwd is uncertain.
Missing binaries vs permissions
Before running any script, treat these two failures differently:
- If a required binary (
uv,ffmpeg,ffprobe) reportsNo such file or directoryorcommand not found: this is a missing or unreachable binary, not a permissions issue. Escalating sandbox permissions will not fix it. Runcommand -v uv,command -v ffmpeg, andcommand -v ffprobeto see whether they resolve at all. If not, install or re-link them (install-media-toolsdoctor/install) rather than retrying with wider permissions. - Only escalate sandbox permissions if the error is explicitly a permission denial (e.g.
Operation not permitted,Permission denied).
Recipes
Normalize then put audio back on video
- Run
inspecton the source to confirm duration and audio codec. - Normalize:
uv run <skill_directory>/scripts/normalize.py --input clip.mp4- Mux the normalized WAV onto the original video with
video-transformationreplace_audio.py. - Optional: specify bitrate/codec on replace for a smaller proxy encode.
Extract clean audio only
uv run <skill_directory>/scripts/extract.py --input clip.mp4 --output dialogue.wavUse output_path from JSON for downstream transcription or editing.
Convert for 48 kHz AAC for delivery
uv run <skill_directory>/scripts/resample.py --input master.wav --sample-rate 48000 --output master_48k.wav
uv run <skill_directory>/scripts/convert.py --input master_48k.wav --format aac --output master.m4aTrim a segment and join clips
uv run <skill_directory>/scripts/trim.py --input intro.wav --start 0 --end 30 --output intro_trim.wav
uv run <skill_directory>/scripts/trim.py --input outro.wav --start 5 --end 60 --output outro_trim.wav
uv run <skill_directory>/scripts/concat.py --paths intro_trim.wav outro_trim.wav --output final.wavFind silence for auto-editing
uv run <skill_directory>/scripts/silence_detect.py --input podcast.wavRead data.silence_starts / data.silence_ends (seconds) to split on pauses or detect dead air.
Troubleshooting
| Error / symptom | Likely cause | Action |
ffmpeg not found | Binary missing | Run install-media-tools doctor/install |
| Concat fails / corrupt output | Mismatched codecs or sample rates | Resample/convert inputs to identical format first |
| Trim produces empty or tiny file | Start ≥ end or beyond duration | Check duration with inspect; verify --start / --end |
-c copy trim fails | Codec doesn't support arbitrary cut points | Re-encode: ffmpeg -ss START -to END -i IN -c:a pcm_s16le OUT.wav |
| Normalize sounds wrong | Already heavily compressed source | Inspect peaks; consider manual loudnorm params via raw ffmpeg |
| No silence regions detected | Threshold too strict or continuous tone | Expected on sine test tones; try real speech audio |
Available scripts
| Script | Purpose | Key flags |
scripts/probe.py | Full ffprobe JSON for an audio file | --input |
scripts/extract.py | Strip video, write WAV | --input, --output |
scripts/convert.py | Change format (mp3, aac, flac, …) | --input, --format, --output |
scripts/trim.py | Cut a time range | --input, --start, --end, --output |
scripts/concat.py | Join multiple files | --paths, --output |
scripts/normalize.py | EBU-style loudness normalize | --input, --output |
scripts/fade.py | 1-second fade-in | --input, --output |
scripts/resample.py | Change sample rate | --input, --sample-rate, --output |
scripts/silence_detect.py | List silence regions | --input |
Outputs default to the workspace root .mediaskills/generated/ unless --output is set. Override with $MEDIASKILLS_DATA_DIR/generated/ when set.
Acceptance checks (agent must pass before delivery)
- Contract: exit 0,
ok: true, everyoutput_pathsentry exists and is non-empty. - Probe:
inspect.describeon each audio output — duration, sample rate, and format match the request. - Spot-check: for trim/concat, duration ≈ sum of requested ranges; for normalize, listen/spot peaks are not clipped silence.
- On failure: fix or escalate; do not present empty or truncated audio as complete.
Do not use for
- Probing media metadata (use
inspect) - Video transforms (use
video-transformation) - Speech-to-text (use
speech-captions)
Related skills
install-media-tools— install ffmpeg/ffprobeinspect— read-only metadata before processingvideo-transformation— mux/replace audio on video
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

