Audio & Video to Text — Whisper Transcriber + SRT avatar

Audio & Video to Text — Whisper Transcriber + SRT

Pricing

from $4.50 / 1,000 audio minute (fast)s

Go to Apify Store
Audio & Video to Text — Whisper Transcriber + SRT

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

Sumitr Mardy

Maintained by Community

Actor 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-readable subStatus.
  • 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. maxMinutesPerFile transcribes 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

FieldDefaultWhat 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.
qualityfastfast = Whisper base. accurate = Whisper small: better with names, accents and noisy audio, about 2.5x slower.
languageautoISO code (en, vi, es, ja…). Set it for short clips to avoid misdetection.
maxEpisodesPerFeed3Newest episodes to transcribe per feed (max 50).
maxMinutesPerFile120Transcribe at most this many minutes from the start of each file (max 240).
includeSegmentstruesegments[] with start/end seconds per phrase.
includeSubtitlesfalsesrt and vtt subtitle text.
maxFileSizeMb500Larger files fail as too_large, uncharged (max 1,000).
downloadTimeoutSecs180Total time for one download (max 600).
proxyConfigurationoffOptional. 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

statussubStatusCharged
okcompletebilledMinutes
oktruncated: only the start was transcribed (maxMinutesPerFile, or your maximum cost per run); notes says how muchbilledMinutes of the part transcribed
no_speechno_speech_detected: music, silence, noisefree
failedhttp_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_errorfree

Pricing

EventPrice per audio minuteWhen
audio-minute$0.006 (free plan), $0.0055 Bronze, $0.005 Silver, $0.0045 Goldquality: "fast", per minute of a transcribed file
audio-minute-accurate$0.012 (free plan), $0.011 Bronze, $0.010 Silver, $0.009 Goldquality: "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 es at 0.96 and read cleanly). Other languages work but were not measured; use accurate and set language for 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 accurate takes ~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, read text, cite title and publishedAt.
  • "What was said at minute 3?": read segments and match start/end.
  • For a long file, set maxMinutesPerFile to keep the run inside the MCP call-actor 45-second wait, or fetch results later with get-dataset-items.
  • Check status first: no_speech (music, silence) is an answer, not an error.

Use it from code

from apify_client import ApifyClient
client = 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"]}'