Guide
How to Transcribe a Podcast Backlog with an API (SRT, VTT and Text)
MyAi Network · · 7 min read
Transcripts make an archive searchable, give you captions for video clips and accessibility, and turn old episodes into show notes and articles. Doing it one upload at a time is the slow part. This guide turns your RSS feed into one batch request, so a few hundred episodes are a single job. The examples use the MyAi transcription API; the feed-parsing part works with any batch API that accepts audio URLs.
1. Work out what it will cost
Pricing is per audio hour, so add up episode lengths. A weekly one-hour show with six years of episodes is about 300 audio hours. At $0.10 per audio hour that is $30, and the first 100 hours on a new key are free. Compare rates across vendors in our Whisper API pricing table.
2. Check that your audio is a fit
- Public recordings only. Audio is transcribed on GPUs run by independent operators. Published podcast episodes are fine; unreleased interviews under embargo, or anything confidential, medical or legal, are not.
- No speaker labels yet. You get text with sentence timestamps (and word timestamps on request), not "Host:" and "Guest:" labels.
- Files up to 4 hours. Longer episodes are split into 10-minute windows and stitched back together for you.
3. Turn the RSS feed into a batch
Every episode in a podcast feed has an enclosure URL (the audio file) and usually an itunes:duration. The API needs both: the URL to fetch and duration_s, which sets how the file is split and how much credit is held. This script, using only the Python standard library, prints a batch for the first 10 episodes:
import json, urllib.request, xml.etree.ElementTree as ET
FEED = "https://example.com/feed.xml" # your podcast RSS feed
NS = {"itunes": "http://www.itunes.com/dtds/podcast-1.0.dtd"}
def seconds(value):
total = 0
for part in value.strip().split(":"): # "3540", "59:00" or "0:59:00"
total = total * 60 + int(float(part))
return total
root = ET.parse(urllib.request.urlopen(FEED)).getroot()
items = []
for item in root.iter("item"):
enclosure = item.find("enclosure")
duration = item.find("itunes:duration", NS)
if enclosure is None or duration is None:
continue
items.append({"input_url": enclosure.get("url"),
"duration_s": seconds(duration.text),
"meta": {"language": "en"}})
print(json.dumps({"job_type": "transcription",
"model": "whisper-large-v3-turbo",
"items": items[:10]})) # start with 10 episodesIf an episode has no itunes:duration, measure the file with ffprobe:
ffprobe -v error -show_entries format=duration -of csv=p=0 episode.mp3
4. Submit, then download
Get a key with 100 free hours on the transcription page, then send the batch:
python3 feed_to_batch.py > batch.json curl https://api.myaitoken.io/v1/batches \ -H "Authorization: Bearer $MYAI_KEY" \ -H "Content-Type: application/json" \ -d @batch.json
Check status, or pass a webhook_url when you submit and skip polling. When an item is done, download it as JSON, SRT, VTT or TXT:
# poll every 30 s, or add "webhook_url" to batch.json curl https://api.myaitoken.io/v1/batches/$BATCH_ID -H "Authorization: Bearer $MYAI_KEY" # captions for the first episode curl "https://api.myaitoken.io/v1/batches/$BATCH_ID/results?format=srt&idx=0" \ -H "Authorization: Bearer $MYAI_KEY" -o episode-0.srt
You are charged for audio that was transcribed and accepted; the rest of the credit hold is released when the batch finishes.
5. Check a sample before you send the rest
Read two or three transcripts against the audio before you queue the whole archive. Look at names and jargon (Whisper models spell unfamiliar names phonetically), music beds and cross-talk, and episodes with a long cold open. Fix the feed problems the first batch shows you, such as missing durations or redirecting URLs, then send the rest in batches you can check.
What to do with the transcripts
- Captions: upload the SRT or VTT file next to the video version of an episode.
- Search: index the TXT or JSON on your site so listeners can find the episode where a topic came up.
- Show notes and articles: start from the transcript instead of a blank page.
- Clips: word timestamps tell you exactly where a quote starts and ends.
FAQ
How much does it cost to transcribe a whole podcast archive?
Count the audio hours, not the episodes. A show with 300 one-hour episodes is 300 audio hours. On MyAi that is $30 at $0.10 per audio hour, and the first 100 hours are free, so $20. Other APIs list between $0.04 and $0.36 per audio hour; see our Whisper API pricing comparison.
Do I need to download the episodes first?
Not with a batch API that accepts URLs. The enclosure URL in your RSS feed points at the audio file, and you pass that URL in the batch. Some hosts put tracking redirects in front of the file, so test a few episodes before you send the whole feed.
Will the transcript say who is speaking?
Not on MyAi yet: speaker labels (diarization) are not available. If you need host and guest labels, use a service that offers diarization, or add the labels by hand in an editor afterwards.
Which output format should I keep?
Keep the JSON: it holds the text and the timestamps, and you can turn it into anything later. Generate SRT or VTT for video players and YouTube, and plain text for show notes and search.