---
name: workflow-podcast-pipeline
description: Raw podcast recordings → polished, loudness-compliant (EBU R128 / Spotify / Apple Podcasts / ACX), caption-accurate (Whisper), chapter-tagged deliverables across MP3 / M4A / video-podcast. Covers multi-mic capture, AI denoise, sidechain ducking, auto-chaptering, multi-language subtitles, ID3/MP4 metadata, and batch release. Use when the user says "publish a podcast episode", "normalize loudness to −16 LUFS", "auto-chapter", "podcast subtitles", "batch process episodes", "interview diarization", or anything podcast-production-related.
argument-hint: [episode]
---

# Workflow — Podcast Pipeline

**What:** Take a raw multi-mic recording and ship a broadcast-clean, caption-complete, chapter-tagged, loudness-compliant episode to every podcast platform.

## Skills used

`media-whisper`, `media-demucs`, `media-denoise-ai`, `media-subtitle-sync`, `media-sox`, `ffmpeg-audio-filter`, `ffmpeg-audio-fx`, `ffmpeg-audio-spatial`, `media-ffmpeg-normalize`, `ffmpeg-detect`, `ffmpeg-metadata`, `ffmpeg-subtitles`, `ffmpeg-captions`, `media-batch`, `media-cloud-upload`, `media-imagemagick`.

## Pipeline

### Step 1 — Capture + concat multi-source

Join separate mic files into aligned tracks via `amix` / `amerge`. Auto time-align against a clap or common audio marker.

### Step 2 — AI denoise per stem BEFORE mixing

`media-denoise-ai`:
- **DeepFilterNet** per mic (general use, 48 kHz mono).
- **RNNoise** for steady-state hum.
- **Resemble Enhance** for speech clarity.

### Step 3 — Classical audio polish

SoX or `ffmpeg-audio-filter`: `highpass=f=80`, parametric EQ boost at ~3 kHz, compand for consistent level.

### Step 4 — Music bed + ducking

Sidechain compression (`sidechaincompress`) ducks music under voice. **Order matters:** key input (voice) FIRST, compressed signal (music) SECOND.

### Step 5 — Transcription

`media-whisper`:
- `large-v3` (3 GB) for best quality.
- `base.en` (140 MB) CPU-friendly; gap to `medium` (1.5 GB) is small on clean studio audio.

Use `--word_timestamps True` (faster-whisper) or `--max-len 1 --split-on-word` (whisper.cpp) for word-accurate subs.

### Step 6 — Auto-sync drifted subs (optional)

`media-subtitle-sync`: `alass` first, `ffsubsync` as fallback.

### Step 7 — Auto-chapter

- **Silence-based** — `ffmpeg-detect` silencedetect at `-35 dB` min-duration `5 s`.
- **Diarization-based** — pyannote.audio or simple-diarizer (external to Whisper).

### Step 8 — Loudness normalize

`media-ffmpeg-normalize` EBU R128 two-pass:

| Target | LUFS |
|---|---|
| Spotify Master | −14 |
| Apple Podcasts | −16 |
| ACX audiobooks | −19 |
| General podcast | −16 to −19 |

### Step 9 — Package deliverables

- **MP3** — `id3v2_version 3`, UTF-16 text, cover 1400–3000 px square ≤ 500 KB.
- **M4A / AAC** — Apple Podcasts. Chapters via `@chpl` atom (ffmpeg writes automatically).
- **Video podcast** — `showwaves` static waveform or pre-mix video track.

### Step 10 — Batch + publish

`media-batch` (GNU parallel) for N-episode throughput. `media-cloud-upload` to host + YouTube.

## Variants

- **Interview podcast** — pyannote diarization, SRT with speaker labels.
- **Music podcast / DJ set** — `media-demucs` stem isolation for promo clips.
- **Binaural / ASMR** — `ffmpeg-audio-spatial` sofalizer HRTF, azimuth/elevation per track.
- **Video podcast with scene detection** — multi-camera auto-cut at detected scenes.
- **Transcript → blog post** — Whisper + external LLM formatting.
- **Multi-language release** — transcribe original, translate externally, mux multiple sub tracks with language metadata.
- **AI-generated intro** — TTS branded intro + Riffusion bed + mix. See `workflow-ai-generation`.

## Gotchas

- **Whisper wants 16 kHz mono** — resamples internally, but explicit `-ar 16000 -ac 1` is cleaner.
- **Demucs wants 44.1 or 48 kHz STEREO.** Mono input → degraded stems.
- **DeepFilterNet: 16 kHz or 48 kHz MONO only.** Mix inputs at 48 kHz mono.
- **RNNoise: 48 kHz mono 16-bit, strict.** Resample first or it fails silently.
- **`loudnorm -target -14` is Spotify Master, NOT podcasts.** Podcasts want −16 (Apple) or −19 (ACX).
- **Single-pass `loudnorm` uses guardrails** — two-pass measures then applies. For compliance, use `media-ffmpeg-normalize` (two-pass).
- **`loudnorm` applies a limiter** — over-loudnormed audio sounds compressed. Tune `lra` to preserve dynamics.
- **Sidechain compression order: key input FIRST, compressed signal SECOND.** Wrong order = wrong ducking.
- **Whisper hallucinates on silence.** `silenceremove` leading/trailing before transcription.
- **Whisper timestamps end-of-chunk by default.** Word-level requires `--word_timestamps`.
- **Whisper `--language auto` is fragile on accents.** Specify explicitly.
- **MP3 ID3v2.4 vs v2.3:** Apple Podcasts requires v2.3 + UTF-16 text. `-id3v2_version 3`.
- **Cover art: 1400–3000 px square, < 500 KB JPEG/PNG.** Apple rejects larger.
- **MP3 chapter metadata** uses CTOC + CHAP frames. ffmpeg writes from `-metadata chapters` but older players ignore.
- **M4A chapter metadata** uses `@chpl` atoms — ffmpeg writes automatically.
- **RSS enclosures need exact file size + MIME type.** Post-publish file change = hash mismatch → listeners re-download.
- **Serialize loudness normalization if sharing GPU** with other jobs — two parallel `loudnorm` = memory contention.
- **`alass` fails on already-synced audio** (returns input unchanged). `--force` won't help.
- **`ffsubsync` pattern-matches audio to existing subtitle anchors.** Naive use on very-drifted subs = drift amplification.
- **`showwaves` locks to one audio stream.** For multi-stream, use `showwavespic` (static) or pre-mix.

## Example — 60-minute interview → deliverables

Multi-mic input → DeepFilterNet per mic → amix → EQ + compand → music bed with sidechain duck → Whisper large-v3 word-timestamps → alass subtitle sync → silencedetect auto-chapter → loudnorm −16 LUFS two-pass → MP3 + M4A with chapter atoms + cover art → upload.

## Related

- `workflow-audio-production` — deeper audio-chain recipes.
- `workflow-ai-generation` — AI intro / voice clone / thumbnails.
- `workflow-analysis-quality` — loudness compliance verification.


---
Source attribution: damionrashford
Original project: https://github.com/damionrashford/media-os/blob/5014c1e8b23fd3e18d49926d9aa147d15a3aa08e/skills/workflow-podcast-pipeline/SKILL.md
License: MIT
License information: https://opensource.org/license/mit
Original upstream instructions; downloaded from Mega AI Hub.

## Upstream license notice

MIT License

Copyright (c) 2026 Media OS

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



# Mega AI Hub resource metadata

Creator / publisher: damionrashford
Original project: https://github.com/damionrashford/media-os/blob/5014c1e8b23fd3e18d49926d9aa147d15a3aa08e/skills/workflow-podcast-pipeline/SKILL.md
Attribution basis: Source repository record

Fields of work: Content & Media, Marketing
Roles: Content Marketer, Podcast Producer, Video Producer
Specialties: Specialty not specified
Tools: FFmpeg, Whisper
Country applicability: Country not specified
Classification basis: Source catalog labels
Instruction SHA-256: e4496c39687dc181e1dd49d914b99e9b05468e530c3bff50b26803b39cf57209
