Audio & Video to Text — Whisper Transcriber + SRT
Pricing
from $4.50 / 1,000 audio minute (fast)s
Audio & Video to Text — Whisper Transcriber + SRT
Transcribe audio and video files and podcast RSS feeds to text with Whisper: timestamps, SRT/VTT subtitles, 99 languages auto-detected. One flat row per file, never null. Billed per audio minute, only for files that had speech.
Pricing
from $4.50 / 1,000 audio minute (fast)s
Rating
0.0
(0)
Developer
Sumitr Mardy
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 hours ago
Last modified
Categories
Share
Give it audio or video links, or a podcast RSS feed, and get back the transcript: punctuated text, timestamped segments, and SRT/VTT subtitles if you want them. Whisper detects the language (99 supported) or you set it. One flat row per file, every field always present, never null. Built to be called from pipelines, n8n/Make/Zapier flows and AI agents.
$6 per 1,000 audio minutes (fast) or $12 (accurate), less on higher Apify plans. Files with no speech, failed downloads and broken files are free.
Why this one
- Podcast feeds, not just files. Paste an RSS feed URL and the newest episodes are transcribed, each row carrying the episode title, publish date and podcast name.
- One row for every file. A 404, a web page instead of a file or a file with no audio track still comes back as a row with
status: "failed"and a machine-readablesubStatus. - Pay for speech, per minute, nothing else. Billed on audio minutes of files that produced a transcript. No platform usage on top.
- Preview long recordings cheaply.
maxMinutesPerFiletranscribes only the start of each file, and you pay only for that part. - Measured, not promised. On Apify at the default 4 GB, a 5-minute NPR newscast transcribed in 22 s (fast), and the JFK inaugural clip came back word-perfect on both tiers.
Input
| Field | Default | What it does |
|---|---|---|
urls | — | Audio/video file links (mp3, m4a, wav, ogg, opus, flac, aac, mp4, mov, webm, mkv…), Google Drive/Dropbox share links, or podcast RSS/Atom feeds. Required. |
quality | fast | fast = Whisper base. accurate = Whisper small: better with names, accents and noisy audio, about 2.5x slower. |
language | auto | ISO code (en, vi, es, ja…). Set it for short clips to avoid misdetection. |
maxEpisodesPerFeed | 3 | Newest episodes to transcribe per feed (max 50). |
maxMinutesPerFile | 120 | Transcribe at most this many minutes from the start of each file (max 240). |
includeSegments | true | segments[] with start/end seconds per phrase. |
includeSubtitles | false | srt and vtt subtitle text. |
maxFileSizeMb | 500 | Larger files fail as too_large, uncharged (max 1,000). |
downloadTimeoutSecs | 180 | Total time for one download (max 600). |
proxyConfiguration | off | Optional. 401/403/429 hosts are retried once through Apify's datacenter proxy anyway. |
{"urls": ["https://feeds.npr.org/500005/podcast.xml"],"maxEpisodesPerFeed": 1,"includeSubtitles": true}
Output
One row per media file, in completion order. A real row (shortened):
{"inputIndex": 0,"url": "https://feeds.npr.org/500005/podcast.xml","mediaUrl": "https://…/npr.simplecastaudio.com/…/audio/1","title": "2am ET, October 27 | The latest headlines from NPR","feedTitle": "NPR News Now","publishedAt": "Tue, 27 Oct 2026 06:10:16 +0000","status": "ok","subStatus": "complete","error": "","text": "This message comes from Google Workspace with Gemini. … This is NPR News Now. The latest headlines every hour…","charCount": 4822, "wordCount": 766,"language": "en", "languageProbability": 0.999,"durationSeconds": 319.9, "transcribedSeconds": 319.9, "billedMinutes": 6, "truncated": false,"quality": "fast", "model": "base", "hasVideo": false,"segments": [{ "start": 0, "end": 3.18, "text": "This message comes from Google Workspace with Gemini." }],"srt": "1\n00:00:00,000 --> 00:00:03,180\nThis message comes from Google Workspace with Gemini.\n…","vtt": "WEBVTT\n\n00:00:00.000 --> 00:00:03.180\nThis message comes from Google Workspace with Gemini.\n…","fileSizeBytes": 5118361,"notes": [],"processingMs": 22368}
Strings are "" when absent, numbers 0, arrays []. No field is ever null or missing. All episodes of one feed share the feed's inputIndex.
Status
status | subStatus | Charged |
|---|---|---|
ok | complete | billedMinutes |
ok | truncated: only the start was transcribed (maxMinutesPerFile, or your maximum cost per run); notes says how much | billedMinutes of the part transcribed |
no_speech | no_speech_detected: music, silence, noise | free |
failed | http_404 (any http_<code>), not_media (a web page), too_large, download_timeout, download_error, bad_feed, no_episodes, no_audio_track, corrupt_media, empty_audio, invalid_url, cost_limit_reached, free_work_limit, transcription_error | free |
Pricing
| Event | Price per audio minute | When |
|---|---|---|
audio-minute | $0.006 (free plan), $0.0055 Bronze, $0.005 Silver, $0.0045 Gold | quality: "fast", per minute of a transcribed file |
audio-minute-accurate | $0.012 (free plan), $0.011 Bronze, $0.010 Silver, $0.009 Gold | quality: "accurate" |
Minutes are counted per file and rounded up: a 5 min 20 s file is 6 minutes, an 11-second clip is 1. The only other charge is a start fee of $0.0005 per GB of memory per run ($0.002 at the default 4 GB). No platform usage is added on top. A run never transcribes more minutes than your maximum cost per run allows; files it cannot start come back cost_limit_reached, uncharged.
Fair use
Failed and no-speech files are free, so a run that spends its compute on files that fail stops starting new ones; the rest come back free_work_limit, uncharged, and can be resubmitted. Also: 240 minutes and 1 GB per file at most, datacenter proxy only.
What it does not do (yet)
- No YouTube, TikTok or Instagram page links. Give the direct media file. Social video transcripts are planned as separate actors.
- No speaker labels (diarization) and no word-level timestamps, only phrase-level segments.
- Accuracy follows Whisper. English and Spanish were checked by hand (JFK clip word-perfect; a Spanish LibriVox recording detected as
esat 0.96 and read cleanly). Other languages work but were not measured; useaccurateand setlanguagefor anything that matters. - CPU, not GPU. Fast tier runs at ~0.07–0.13x real time at 4 GB, accurate ~0.3x. A 2-hour podcast on
accuratetakes ~40 minutes; raise memory to 8 GB to halve it.
Use it from AI agents (MCP)
This Actor is a tool on the Apify MCP server, so Claude, Cursor, VS Code or any MCP client can call it to read what is said in a recording. Load only this tool: a short tool list keeps the agent from picking the wrong one.
Recommended: hosted server, OAuth sign-in (nothing secret on disk). Add to your MCP client config (claude_desktop_config.json, .cursor/mcp.json, …):
{"mcpServers": {"transcriber": {"url": "https://mcp.apify.com?tools=sumitr_mardy/audio-video-transcriber"}}}
With an API token instead (clients without OAuth, or unattended setups):
{"mcpServers": {"transcriber": {"url": "https://mcp.apify.com?tools=sumitr_mardy/audio-video-transcriber","headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }}}}
Local server (stdio):
{"mcpServers": {"transcriber": {"command": "npx","args": ["-y", "@apify/actors-mcp-server@latest", "--tools", "sumitr_mardy/audio-video-transcriber"],"env": { "APIFY_TOKEN": "YOUR_APIFY_TOKEN" }}}}
The hosted server also gives the agent this Actor's output schema, so it knows every field before the first call. apify mcp install <client> writes the config for you if you use the Apify CLI. Get a token at Apify Console → API & Integrations, and never commit it.
Tips for agents:
- "Summarise this podcast": pass the RSS feed with
maxEpisodesPerFeed: 1, readtext, citetitleandpublishedAt. - "What was said at minute 3?": read
segmentsand matchstart/end. - For a long file, set
maxMinutesPerFileto keep the run inside the MCPcall-actor45-second wait, or fetch results later withget-dataset-items. - Check
statusfirst:no_speech(music, silence) is an answer, not an error.
Use it from code
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("sumitr_mardy/audio-video-transcriber").call(run_input={"urls": ["https://feeds.npr.org/500005/podcast.xml"],"maxEpisodesPerFeed": 1,})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["title"], row["status"], row["billedMinutes"], row["text"][:100])
curl -X POST "https://api.apify.com/v2/acts/sumitr_mardy~audio-video-transcriber/run-sync-get-dataset-items?token=<APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"urls": ["https://raw.githubusercontent.com/ggml-org/whisper.cpp/master/samples/jfk.wav"]}'