How to transcribe hundreds of audio and video files to text and subtitles with Whisper
Updated 2026-10-28 ยท Tool used: Audio & Video Transcriber (Whisper) - MP3/MP4 to Text, SRT, VTT on Apify ยท Price: $0.005 per audio minute with the base model, $0.01 with the small model; dead links, web pages, files without audio and silent files are free
Transcribing one file is easy with any app. Transcribing a whole podcast back catalogue, a folder of interview recordings or a batch of course videos is where per-seat transcription tools get expensive and slow, and uploading every file by hand does not scale.
This guide shows how to pass a list of direct audio or video links (or another run's dataset, for example podcast episode enclosures from an RSS feed) and get one row per file: full text, detected language, timestamped segments and ready-made .srt and .vtt subtitle files. It runs the open-source Whisper model (faster-whisper) inside the actor, so there is no OpenAI key and the audio is not sent to an outside speech service.
Steps
- Collect direct file links in
mediaUrls(podcast MP3 links, files in cloud storage, CDN links), or setdatasetIdto read links from another actor run. - Pick
model:baseis fast and cheap,smallis better on accents, noise and non-English. Setlanguageif you know it, ortask: "translate"for an English transcript of any language. - Run it, export the dataset as CSV or JSON, and download subtitles from
srtUrl/vttUrl. Set a max charge per run to cap the cost.
Example input
{
"url": "https://upload.wikimedia.org/wikipedia/commons/3/3c/Pope_Simplicius_Spoken_Version.ogg",
"status": "ok",
"language": "en",
"languageProbability": 0.999,
"durationSeconds": 76.7,
"billedMinutes": 2,
"words": 167,
"text": "Pope Simpliceus, from Wikipedia, the free encyclopedia. Pope Simpliceus died March 10, 483, was the head of the Catholic Church from 468 to his death in 483. ...",
"segments": [
{
"start": 0.24,
"end": 5.24,
"text": "Pope Simpliceus, from Wikipedia, the free encyclopedia."
},
{
"start": 5.24,
"end": 9.24,
"text": "Pope Simpliceus died March 10, 483,"
}
],
"srtUrl": "https://api.apify.com/v2/key-value-stores/.../records/srt-0143153b17b9df8e",
"vttUrl": "https://api.apify.com/v2/key-value-stores/.../records/vtt-0143153b17b9df8e",
"model": "base",
"task": "transcribe",
"format": "ogg",
"audioCodec": "vorbis",
"hasVideo": false,
"truncated": false,
"transcribeSeconds": 4.5
}
Example output (one item, shortened)
{
"status": "ok",
"language": "en",
"durationSeconds": 76.7,
"billedMinutes": 2,
"text": "Pope Simpliceus, from Wikipedia, the free encyclopedia. Pope Simpliceus died March 10, 483, was the head of the Catholic Church from 468 to his death in 483. He was born in Tivoli, Italy, the son of a city, citizen named...",
"url": "https://upload.wikimedia.org/wikipedia/commons/3/3c/Pope_Simplicius_Spoken_Version.ogg",
"error": null,
"model": "base",
"task": "transcribe",
"httpStatus": 200,
"fileSizeBytes": 820957,
"downloadSeconds": 0.1,
"hasVideo": false,
"format": "ogg",
"audioCodec": "vorbis",
"fileDurationSeconds": 76.7,
"transcribeSeconds": 4.4,
"languageProbability": 0.999,
"speechSeconds": 76.48,
"truncated": false,
"words": 167,
"chars": 972,
"textTruncated": false,
"segments": [
{
"start": 0.24,
"end": 5.24,
"text": "Pope Simpliceus, from Wikipedia, the free encyclopedia."
},
{
"start": 5.24,
"end": 9.24,
"text": "Pope Simpliceus died March 10, 483,"
},
{
"start": 9.24,
"end": 12.24,
"text": "was the head of the Catholic Church from 468"
},
"..."
],
"srtUrl": "https://api.apify.com/v2/key-value-stores/JrhAHz09K8AipOiVl/records/srt-0143153b17b9df8e?signature=HzZXojmeMlOIDoeA2RV9",
"vttUrl": "https://api.apify.com/v2/key-value-stores/JrhAHz09K8AipOiVl/records/vtt-0143153b17b9df8e?signature=ZSS6cYjRRDXnPqjYidRn",
"transcribedAt": "2026-10-27T08:18:21.892Z"
}
Every run's dataset can be downloaded as JSON, CSV, Excel, XML or HTML from the Apify Console, or via https://api.apify.com/v2/datasets/<datasetId>/items?format=csv.
Run it from code
Python
from apify_client import ApifyClient # pip install apify-client
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"url": "https://upload.wikimedia.org/wikipedia/commons/3/3c/Pope_Simplicius_Spoken_Version.ogg",
"status": "ok",
"language": "en",
"languageProbability": 0.999,
"durationSeconds": 76.7,
"billedMinutes": 2,
"words": 167,
"text": "Pope Simpliceus, from Wikipedia, the free encyclopedia. Pope Simpliceus died March 10, 483, was the head of the Catholic Church from 468 to his death in 483. ...",
"segments": [
{
"start": 0.24,
"end": 5.24,
"text": "Pope Simpliceus, from Wikipedia, the free encyclopedia."
},
{
"start": 5.24,
"end": 9.24,
"text": "Pope Simpliceus died March 10, 483,"
}
],
"srtUrl": "https://api.apify.com/v2/key-value-stores/.../records/srt-0143153b17b9df8e",
"vttUrl": "https://api.apify.com/v2/key-value-stores/.../records/vtt-0143153b17b9df8e",
"model": "base",
"task": "transcribe",
"format": "ogg",
"audioCodec": "vorbis",
"hasVideo": false,
"truncated": false,
"transcribeSeconds": 4.5
}
run = client.actor("tinyrex/audio-video-transcriber").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)JavaScript / Node.js
import { ApifyClient } from 'apify-client'; // npm i apify-client
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('tinyrex/audio-video-transcriber').call({
"url": "https://upload.wikimedia.org/wikipedia/commons/3/3c/Pope_Simplicius_Spoken_Version.ogg",
"status": "ok",
"language": "en",
"languageProbability": 0.999,
"durationSeconds": 76.7,
"billedMinutes": 2,
"words": 167,
"text": "Pope Simpliceus, from Wikipedia, the free encyclopedia. Pope Simpliceus died March 10, 483, was the head of the Catholic Church from 468 to his death in 483. ...",
"segments": [
{
"start": 0.24,
"end": 5.24,
"text": "Pope Simpliceus, from Wikipedia, the free encyclopedia."
},
{
"start": 5.24,
"end": 9.24,
"text": "Pope Simpliceus died March 10, 483,"
}
],
"srtUrl": "https://api.apify.com/v2/key-value-stores/.../records/srt-0143153b17b9df8e",
"vttUrl": "https://api.apify.com/v2/key-value-stores/.../records/vtt-0143153b17b9df8e",
"model": "base",
"task": "transcribe",
"format": "ogg",
"audioCodec": "vorbis",
"hasVideo": false,
"truncated": false,
"transcribeSeconds": 4.5
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);curl (no SDK)
# Runs the actor and returns the results directly (CSV here; use format=json for JSON)
curl -X POST "https://api.apify.com/v2/acts/tinyrex~audio-video-transcriber/run-sync-get-dataset-items?format=csv" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"url": "https://upload.wikimedia.org/wikipedia/commons/3/3c/Pope_Simplicius_Spoken_Version.ogg", "status": "ok", "language": "en", "languageProbability": 0.999, "durationSeconds": 76.7, "billedMinutes": 2, "words": 167, "text": "Pope Simpliceus, from Wikipedia, the free encyclopedia. Pope Simpliceus died March 10, 483, was the head of the Catholic Church from 468 to his death in 483. ...", "segments": [{"start": 0.24, "end": 5.24, "text": "Pope Simpliceus, from Wikipedia, the free encyclopedia."}, {"start": 5.24, "end": 9.24, "text": "Pope Simpliceus died March 10, 483,"}], "srtUrl": "https://api.apify.com/v2/key-value-stores/.../records/srt-0143153b17b9df8e", "vttUrl": "https://api.apify.com/v2/key-value-stores/.../records/vtt-0143153b17b9df8e", "model": "base", "task": "transcribe", "format": "ogg", "audioCodec": "vorbis", "hasVideo": false, "truncated": false, "transcribeSeconds": 4.5}' > results.csv
Get your API token in Apify Console โ Settings โ API & Integrations. The free Apify plan includes monthly credit that is enough to try this.
Use it from an AI agent (MCP)
The Apify MCP server exposes this actor as a tool for Claude, Cursor, VS Code, n8n and other MCP clients. Add this to your client's MCP config (or use the OAuth flow at mcp.apify.com instead of a token):
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=tinyrex/audio-video-transcriber",
"headers": {
"Authorization": "Bearer <YOUR_APIFY_TOKEN>"
}
}
}
}
Then ask in plain language, e.g. "Bulk audio transcription api for this list and give me a table".
Use cases
- Podcast back catalogues: transcribe every episode for show notes, search and SEO pages.
- Course and webinar videos: get SRT/VTT subtitles for a whole batch of files.
- Interview and research recordings: searchable text with timestamps for coding and quotes.
- RAG and AI pipelines: feed transcripts into a vector store or an LLM summary step.
No-code: n8n and Make
Ready-to-import n8n and Make example workflows call this actor through the Apify API. Import the JSON, add your Apify token, edit the input and run.
Pricing
Pay per result: $0.005 per audio minute with the base model, $0.01 with the small model; dead links, web pages, files without audio and silent files are free. You can cap the cost of every run in the run options.
FAQ
Can I transcribe podcast episodes straight from an RSS feed?
Yes. Run the RSS Feed Scraper on the podcast feed, then pass its run's datasetId and set urlField to the enclosure field. Each episode's audio link is transcribed.
Which languages are supported?
Whisper supports about 99 languages. Leave language on auto to detect it, or set it for better accuracy on short files.
Is this a cheaper alternative to the Whisper API?
It runs the same open-source Whisper model family inside the actor for $0.005 per audio minute (base) or $0.01 (small), billed per minute rounded up per file. Failed and silent files cost nothing, and there is no separate API account.
Can I transcribe YouTube, TikTok or Instagram videos?
No. Links to platform pages are refused for free, because downloading from those sites is against their terms. Use files you own or have rights to, such as your own recordings or podcast MP3s.
Does it add speaker labels?
Not yet. You get timestamped segments and subtitles, without speaker diarization.
How fast is it?
At the default memory the base model handles about 10 to 12 minutes of audio per minute, the small model about 4. More memory gives more CPU cores; the price per audio minute stays the same.
Try it on Apify โRelated guides
- How to turn any RSS or Atom feed into JSON or CSV (bulk, with monitoring)
- How to extract text from hundreds of PDFs, including scanned ones, in one run
More guides
- Bulk tech stack lookup: a Wappalyzer / BuiltWith alternative for thousands of domains
- How to scrape Greenhouse, Lever and Ashby jobs (plus Personio, Teamtailor, Recruitee)
- How to export all products from any Shopify store to CSV or JSON
- How to scrape jobs from Workday career sites (myworkdayjobs.com)
- How to export products from any WooCommerce store to CSV or JSON
- How to export EU public tenders from TED (Tenders Electronic Daily) to CSV or JSON
- How to scrape remote jobs from Himalayas, Remote OK, We Work Remotely and more in one run
- How to export open EU funding calls (Horizon Europe, Digital Europe, cascade funding) to CSV or JSON
- How to turn any RSS or Atom feed into JSON or CSV (bulk, with monitoring)
- How to extract emails, phone numbers and social links from a list of company domains
- How to take bulk website screenshots from a URL list and save them to CSV or Google Drive
- How to export US federal (SAM.gov) and UK (Contracts Finder) tenders to CSV or JSON
- How to look up French companies by SIREN or SIRET and build a B2B list from Sirene
- How to look up Norwegian companies by organisation number and build lead lists from Brreg
- How to download SEC filings (10-K, 10-Q, 8-K, Form 4) by ticker and search EDGAR full text
- How to validate NPI numbers in bulk and build US healthcare provider lists from NPPES
- How to look up hundreds of UK companies on Companies House at once (profile, officers, PSC)
- How to look up Finnish companies by Y-tunnus and build B2B lead lists from the YTJ register
- How to extract all URLs from a website's sitemap (and find broken links)
- How to extract text from hundreds of PDFs, including scanned ones, in one run
- How to clean an email list before a campaign: bulk MX, disposable and typo check
- How to get Dutch public tenders from TenderNed into a spreadsheet, with daily alerts
- How to audit titles, meta descriptions, H1s and canonicals for hundreds of pages at once
- How to find every broken link and redirect on a website, with the pages to fix
- How to validate LEI codes and find the LEI for a list of companies in bulk
- How to run Lighthouse on hundreds of URLs and get Core Web Vitals in one table