Alchemy RecipeIntermediateworkflow

Podcast episode transcription, chapters and social clips generation

Published

You've just finished recording a podcast episode. It's solid content, but now comes the tedious part: transcribing it, identifying natural chapter breaks, uploading clips to social media, and writing accompanying copy. What should take an hour of clicking through three different tools actually takes three hours because you're copying text between platforms, manually trimming audio, and wrestling with export formats. For more on this, see Social media content calendar from blog posts and news feeds.

This is where most creators give up on repurposing content. The friction is too high, even though the payoff is obvious. A single episode can become dozens of social posts, a newsletter feature, and structured chapters that help listeners navigate your content. But only if you automate it.

We're going to show you how to build a workflow that takes a podcast episode from upload to social-ready clips without a single manual handoff. You'll record, upload once, and let the system handle the rest. Whisper API transcribes the audio, Mirra adds speaker identification and timing data, Clipwing generates social clips, and your orchestration tool ties it all together. The result: a finished podcast episode with chapters, transcripts, and five ready-to-post social videos, all generated in less than it takes to have a coffee. For more on this, see Podcast show notes, chapters and social clips generation.

The Automated Workflow

This workflow requires an intermediate understanding of API connections and conditional logic. We're using n8n as our primary orchestrator here because its visual node system handles complex branching well, but we'll note where Zapier or Make would work differently.

The overall flow looks like this:

  1. Podcast file uploaded to cloud storage (Dropbox, Google Drive, or S3)
  2. Webhook triggers n8n workflow
  3. Whisper API transcribes the full episode
  4. Transcription data sent to Mirra for speaker detection and timestamps
  5. Mirra output analysed for natural chapter boundaries
  6. Clipwing generates social clips based on identified segments
  7. Clips uploaded to social media platforms
  8. Episode data structured and sent to your CMS or email platform For more on this, see Podcast transcription to interactive learning module auto....

Setting up the trigger:

The workflow starts when you drop a file into your podcast folder. In n8n, create a webhook node that listens for file uploads. If you're using Dropbox, connect n8n's native Dropbox integration and set a trigger for files added to your /podcast-uploads folder.


Webhook configuration in n8n:
- Method: POST
- URL: Your n8n webhook URL (n8n generates this)
- Content-type: application/json

Dropbox connection:
- Authenticate n8n with your Dropbox account
- Select trigger: "File Added"
- Path: /podcast-uploads
- Include content: Yes (this lets us access the file directly)

Once a file lands in that folder, n8n captures its metadata (filename, timestamp, file path) and passes it to the next step.

Transcription with Whisper API:

Here's where the actual work begins. Whisper API needs the audio file URL and an API key. You'll make an HTTP POST request from n8n to OpenAI's endpoint.


POST https://api.openai.com/v1/audio/transcriptions

Headers:
Authorization: Bearer YOUR_OPENAI_API_KEY

Body (form-data):
file: [binary audio file]
model: whisper-1
language: en
timestamp_granularities: segment
response_format: verbose_json

In n8n, add an HTTP Request node configured like this:


Node type: HTTP Request
Method: POST
URL: https://api.openai.com/v1/audio/transcriptions
Authentication: Generic Credential Auth
Add Header:
- Key: Authorization
- Value: Bearer YOUR_API_KEY

Body configuration:
- Content-Type: Form Data Multipart
- Add multipart body:
  - file: [Link to file from Dropbox node]
  - model: whisper-1
  - timestamp_granularities: segment
  - response_format: verbose_json

Whisper returns JSON with the full transcript, individual segments with timestamps, and language confidence scores. Store this entire response; we'll need it in the next step.

Speaker identification with Mirra:

Mirra takes the Whisper transcript and enriches it with speaker labels and improved timing data. This step assumes you have a Mirra account and API access. Mirra's API is simpler than Whisper's.


POST https://api.mirra.ai/v1/enrich

Headers:
Authorization: Bearer YOUR_MIRRA_API_KEY
Content-Type: application/json

Body:
{
  "transcript": "full transcript text from Whisper",
  "segments": [array of Whisper segments],
  "language": "en",
  "speaker_count": 2
}

Add another HTTP Request node in n8n:


Node type: HTTP Request
Method: POST
URL: https://api.mirra.ai/v1/enrich
Authentication: Bearer token (YOUR_MIRRA_API_KEY)

Body (JSON):
{
  "transcript": "{{ $node.Whisper.data.text }}",
  "segments": "{{ $node.Whisper.data.segments }}",
  "language": "en",
  "speaker_count": 2
}

Mirra returns enriched data including speaker names (or Speaker 1, Speaker 2, etc. if autodetection), adjusted timestamps, and confidence metrics. This is crucial for the next step.

Identifying chapter boundaries:

Now we need to intelligently split the episode into chapters. This is where a bit of logic comes in. You could hardcode chapters (every 15 minutes), or you can analyse the transcript for natural breaks: topic changes, long pauses, explicit chapter markers.

Use an n8n Script node to analyse the Mirra output and identify breakpoints:


const mirraData = $node.Mirra.data;
const segments = mirraData.segments;
const transcript = mirraData.transcript;

// Identify potential chapter breaks:
// 1. Segments with >10 second silence
// 2. Speaker changes
// 3. Keywords like "next", "moving on", "let's talk about"

const chapters = [];
let currentChapter = {
  start_time: 0,
  title: "Introduction",
  segments: []
};

const breakKeywords = ["next", "moving on", "let's talk about", "so", "anyway"];

for (let i = 0; i < segments.length; i++) {
  const segment = segments[i];
  
  // Check for long silence or speaker change
  if (i > 0 && (segment.start - segments[i-1].end > 10 || 
      segment.speaker !== segments[i-1].speaker)) {
    
    chapters.push(currentChapter);
    currentChapter = {
      start_time: segment.start,
      title: "Segment " + (chapters.length + 1),
      segments: [segment]
    };
  } else {
    currentChapter.segments.push(segment);
  }
}

chapters.push(currentChapter);

return chapters;

This script outputs an array of chapters with start times and segment data. For production use, you'd want more sophisticated NLP analysis, but this handles the basics.

Clip generation with Clipwing:

Clipwing creates social media clips from your chapters. You'll send it the original audio file, the chapter timestamps, and specifications for your social platforms.


POST https://api.clipwing.com/v1/generate

Headers:
Authorization: Bearer YOUR_CLIPWING_API_KEY
Content-Type: application/json

Body:
{
  "source_url": "https://dropbox-link-to-audio-file",
  "clips": [
    {
      "start_time": 0,
      "end_time": 120,
      "platform": "tiktok",
      "title": "Chapter 1 Title"
    },
    {
      "start_time": 120,
      "end_time": 480,
      "platform": "instagram",
      "title": "Chapter 2 Title"
    }
  ],
  "output_format": "mp4",
  "include_captions": true
}

In n8n:


Node type: HTTP Request
Method: POST
URL: https://api.clipwing.com/v1/generate
Authentication: Bearer token (YOUR_CLIPWING_API_KEY)

Body (JSON):
{
  "source_url": "{{ $node.Dropbox.data.link }}",
  "clips": "{{ $node.ChapterIdentification.data.chapters }}",
  "output_format": "mp4",
  "include_captions": true,
  "platforms": ["tiktok", "instagram", "youtube_shorts"]
}

Clipwing processes this asynchronously. It returns a job ID and webhook URL. Configure n8n to wait for the webhook callback when Clipwing finishes rendering your clips. This typically takes 5-15 minutes depending on total clip duration.

Storing and distributing results:

Once clips are ready, you need to store them and decide where they go. Add nodes to handle this:

For storage:


Node type: Dropbox
Action: Upload File
Folder path: /podcast-outputs/{{ $node.Webhook.data.filename }}/
File name: {{ Date.now() }}-{{ clip.platform }}.mp4
File data: [from Clipwing output]

For social posting, add conditional nodes based on which platforms you want to use:


IF platform = "tiktok"
THEN use TikTok node to schedule post
IF platform = "instagram"
THEN use Instagram node to schedule post
IF platform = "youtube_shorts"
THEN use YouTube node to upload

For your CMS or newsletter platform:


Node type: HTTP Request (or native integration)
Method: POST
URL: [Your CMS API endpoint]
Body:
{
  "episode_title": "{{ $node.Webhook.data.filename }}",
  "transcript": "{{ $node.Whisper.data.text }}",
  "chapters": "{{ $node.ChapterIdentification.data.chapters }}",
  "clip_ids": "{{ $node.Clipwing.data.clip_ids }}",
  "published_date": "{{ now }}",
  "speakers": "{{ $node.Mirra.data.speakers }}"
}

Error handling and retries:

Add retry logic to each HTTP node. Whisper and Clipwing can be slow, and network issues happen:


Node configuration (each HTTP Request):
Retry on fail: Yes
Max retries: 3
Retry interval: 10 seconds
Continue on fail: No (stops workflow if final retry fails)

Also add email notifications for failures:


Node type: Send Email
Trigger: Only execute on error
Body:
"Podcast workflow failed at {{ $node.lastNodeExecuted }}.
Error: {{ $node.lastNodeError.message }}"

The Manual Alternative

If you want more control over chapter titles, clip content, or speaker identification, keep the automation at the transcription and storage layers. Use Whisper API to transcribe, store the result in a spreadsheet or document, then manually review chapters and edit clip selections in Clipwing's dashboard before posting. This takes 30-45 minutes instead of 2-3 hours and still eliminates the worst friction points: typing out transcripts and copying files between platforms.......

Alternatively, run just Whisper and Mirra automatically, then use Clipwing's manual editor to select specific segments for clips. This gives you creative control over what becomes a social video whilst keeping the transcription automated.

Pro Tips

Manage Whisper API costs by transcribing only once:

Store the transcript JSON after the first run. If the workflow re-triggers (accidental upload), check if the file already exists in your outputs folder before calling Whisper again. In n8n, add a Dropbox "Search Files" node that looks for an existing transcript before the Whisper step, and use conditional logic to skip transcription if found.

Batch Clipwing requests to stay within rate limits:

Clipwing processes clips sequentially. If you're generating 10 clips from one episode, don't send all 10 requests at once. Add a delay node between each clip request: wait 30 seconds between submissions. This prevents queue saturation and reduces API errors.


Node type: Wait
Time: 30 seconds
(place between each Clipwing request)

Use conditional logic to handle variable episode lengths:

Long episodes (2+ hours) generate many chapters and clips. Mirra and Clipwing may struggle with very long outputs. Add a check after transcription:


IF episode_duration > 120 minutes
THEN split into two separate workflows
IF episode_duration < 30 minutes
THEN generate fewer clips (3 instead of 5)

Store metadata for analytics:

Before clips are posted, log their data to a Google Sheet or database. Record timestamps, speakers, chapter titles, and clip URLs. This lets you track which clips get the most engagement and optimise future chapter selection.

Set up platform-specific formatting:

Each social platform has different optimal lengths and aspect ratios. Tell Clipwing to generate platform-specific versions:


TikTok: 9:16 aspect ratio, max 60 seconds
Instagram Reels: 9:16 aspect ratio, max 90 seconds
YouTube Shorts: 9:16 aspect ratio, max 60 seconds
LinkedIn: 1:1 aspect ratio, max 60 seconds

Store these as variables in n8n so you can update them once without editing the workflow.

Cost Breakdown

ToolPlan NeededMonthly CostNotes
Whisper APIPay-as-you-go£5-15Typically £0.02 per minute of audio. One 90-minute episode costs roughly £1.80
MirraProfessional tier£50-100Required for speaker identification. Basic tier (£30) lacks speaker detection
ClipwingCreator plan£40-60Includes up to 100 clip renders monthly. Overage: £0.50 per clip
n8nCloud Pro£20Includes 5,000 workflow executions monthly. Standard is free but with lower limits
ZapierProfessional£49-99Equivalent to n8n Pro. More expensive but simpler setup for beginners
Make (Integromat)Team plan£10-80Cheapest option for simple workflows; pricier as complexity grows
Storage (Dropbox/S3)Pro/standard tier£10-20S3 costs vary by region; Dropbox Pro is flat £10/month

Total minimum monthly cost: £125-195 for a workflow processing 8-12 episodes per month

For casual podcasters releasing one episode weekly, expect £150-250/month. For daily uploads or multiple shows, costs scale linearly with clip generation (the most expensive step).

The break-even point is roughly 4-5 hours of manual work per episode. If you're spending more time on post-production, this workflow saves money and time immediately. If you're only releasing one episode per month, it might not justify the subscription costs; consider Whisper API alone (£5-15/month) as a simpler starting point.

More Recipes