Media Transcriber · Any URL, RSS & Podcast to Text
Pricing
from $0.80 / 1,000 second of media transcribeds
Media Transcriber · Any URL, RSS & Podcast to Text
Media transcriber for any video or audio URL — YouTube, TikTok, Instagram, Facebook, X, podcast RSS, direct files. On-device Whisper: full text, timestamped segments, SRT/VTT, hook3s. No API key. Silent, unreachable, and failed files are not charged. Billed by the second, not a rounded minute.
Pricing
from $0.80 / 1,000 second of media transcribeds
Rating
5.0
(2)
Developer
Muhamed Didovic
Maintained by CommunityActor stats
1
Bookmarked
388
Total users
167
Monthly active users
8 hours ago
Last modified
Categories
Share
Media Transcriber — Any URL, RSS & Podcast to Text
Billed by the second — $0.0008/second ($0.048 per minute) for video AND audio · no API key · text + timestamped segments + optional word-level timings + SRT + VTT · 99+ languages, auto-detected
Transcribe any video or audio URL to text with OpenAI Whisper running inside the Actor (faster-whisper). No external API, no key, no rate limits. Paste links from YouTube, TikTok, Instagram, Facebook, X (Twitter), Rumble, SoundCloud, a podcast RSS feed, or a direct media file (mp3, mp4, wav, m4a, …) and get the full transcript, timestamped segments, ready-to-use SRT and VTT subtitles, readable paragraphs, TXT and Markdown files, and the detected language. Add speaker labels (who speaks when) and a vocabulary of names to get them spelled right. Podcasts work from their RSS feed, Apple Podcasts or Spotify link, and episodes whose publisher already has a transcript are delivered from it in seconds. Works on media that has no captions at all.

Why use this transcriber
- One Actor for both media types. Video and audio at the same rate — no separate video and audio products with different prices.
- Per-second billing. A 20-second Reel is billed 20 seconds, not a rounded-up minute. Short-form media costs what it actually is.
- Real Whisper transcription, not caption scraping. The audio track is extracted and transcribed, so it works on videos without subtitles.
- Podcast feeds expand automatically. Point it at an RSS/Atom feed or an Apple Podcasts show link and the newest episodes become transcripts (
maxEpisodesPerFeed). - Music and silence are never charged. A file that turns out to hold no speech (a music bed, a silent clip, a tone) comes back as an uncharged
no_speechrow instead of a paid transcript of words the model invented. - Chain any scraper, pay once per item. Point
datasetIdat a scraper run and each row gives one item: the audio or video file, never the thumbnails, covers or profile pictures next to it, and never the post's page and its file as two charges. If the file has no sound or has expired, the post's own page is transcribed instead. - Speaker labels.
speakerLabels: truemarks every segment and paragraph with Speaker 1, Speaker 2, … and carries the names into SRT, VTT, TXT and Markdown. It runs on the Actor's own CPU, with no API key. - Spotify links work. Spotify streams with DRM, so other transcribers refuse its links. This one finds the same episode in the show's public feed and transcribes that. Spotify-only shows have no public feed and come back as an uncharged row.
- The publisher's transcript, when there is one. Omny, Buzzsprout, Spreaker, Flightcast and other hosts publish a timed transcript per episode in the RSS feed (11 of the top 100 US shows did in September 2026). Those episodes are delivered from it in seconds, usually edited and with speaker names, and no audio is downloaded.
- Names spelled right. Put the names and terms the audio contains in
vocabularyand the model is primed with them ("Michael Babar" became "Michael Barbaro" in our test). - Readable output. Besides segments and subtitles, each row has
paragraphs(a new one at every speaker change or pause) and links to a.txt, a.mdand a Word.docxfile, ready for docs, notes or an LLM prompt. - Summary, chapters and keywords.
summarize: truehas Claude Haiku 4.5 write a short summary, chapters with start times and the key names and terms, in the recording's language. No extra charge. - Follow a channel. Paste a YouTube channel or playlist (or a SoundCloud artist or set) and the newest items are transcribed. Put it on a schedule with a
watchlistIdandnewItemsOnly, and every run transcribes only the new uploads. - Translate while you transcribe.
translateToEnglish: trueoutputs an English transcript and English subtitles from any source language. - Subtitles as files, not just strings. Every item stores a downloadable
.srtand.vttin the run's key-value store (srtFileUrl/vttFileUrl). - Self-contained. All three Whisper models are baked into the image — nothing downloads at run time, and you never provide an API key.
- The hook on every row.
hook3sis the first 3 seconds of speech andhookStartSecondssays when the talking starts — openers compare side by side without reading transcripts. - Scheduled runs bill only what is new. Name a
watchlistIdand switch onnewItemsOnly: a podcast feed is re-read in full, but an episode or video transcribed on an earlier run is left out and never charged twice. - Every miss on the record. asked = delivered + reported. Whatever was not delivered is in the run's
ERRORSrecord with a reason and what to change, and the status line reconciles the count.
Supported inputs
| Input type | Example | Notes |
|---|---|---|
| TikTok video | https://www.tiktok.com/@user/video/… | audio extracted automatically |
| YouTube video / Short | https://www.youtube.com/watch?v=… | cookies input available for the bot-check gate |
| Instagram Reel / post | https://www.instagram.com/reel/… | public content |
| Facebook video | https://www.facebook.com/watch?v=… | public content |
| X (Twitter) video | https://x.com/user/status/… | public content |
| SoundCloud track | https://soundcloud.com/user/track | audio transcribed directly |
| Dailymotion video | https://www.dailymotion.com/video/… | |
| Rumble video | https://rumble.com/v… | |
| Podcast RSS/Atom feed | https://feed.syntax.fm/rss | newest maxEpisodesPerFeed episodes |
| Apple Podcasts show | https://podcasts.apple.com/us/podcast/the-daily/id1200361736 | resolved to the show's RSS feed, newest maxEpisodesPerFeed episodes |
| Apple Podcasts episode | https://podcasts.apple.com/us/podcast/…/id1200361736?i=1000… | the one episode (the link carrying ?i=) |
| Spotify episode or show | https://open.spotify.com/episode/… | transcribed from the show's public feed; Spotify-only shows are refused, uncharged |
| YouTube channel or playlist | https://www.youtube.com/@TED · …/playlist?list=… | the newest maxEpisodesPerFeed videos (a watch link with &list= stays one video) |
| SoundCloud artist or set | https://soundcloud.com/user/sets/… | the newest maxEpisodesPerFeed tracks |
| Google Drive / Dropbox / OneDrive share link | https://drive.google.com/file/d/…/view | the file must be shared with anyone who has the link |
| Another scraper's run | datasetId or datasetItems | one audio/video link per row, see Chain a scraper run |
| Direct media file | https://…/episode.mp3 | mp3, mp4, wav, m4a, flac, ogg, webm, mov, … |
| 1800+ other sites | Bilibili, Reddit, Snapchat, Xiaohongshu, Kwai, Likee, Loom, … | anything yt-dlp supports. Vimeo is currently broken upstream in yt-dlp (OAuth 401). |
Use cases
- Turn TikToks, Reels and Shorts into searchable, quotable text at scale.
- Generate SRT/VTT subtitles for repurposing clips across platforms.
- Transcribe podcast back-catalogs straight from the RSS feed for search, show notes, or SEO pages.
- Feed spoken content into summarization, RAG pipelines, or trend analysis.
- Accessibility and compliance transcripts.
- Monitor what creators or competitors say on video without watching hours of footage.
How it works
- Resolve — each URL is classified: social/video platform, podcast feed or Apple Podcasts show (expanded to episodes), or direct file. A chained scraper row is reduced to its one audio or video link first. Every download tries a direct connection first and falls back to the Actor's own residential pool only where networks block datacenter IPs; feeds and direct files never use it. No proxy setup or proxy quota of your own is required.
- Extract — yt-dlp downloads the audio track (video is never kept), ffmpeg trims it to your
maxMinutesPerItemcap. - Transcribe — faster-whisper (int8, VAD-filtered) runs on the file locally and returns language, segments and timings; the Actor builds the text, SRT and VTT and writes one dataset row per item.
Input configuration
| Field | Type | Default | Description |
|---|---|---|---|
mediaUrls | array | — | Video/audio/podcast/direct-file URLs, up to 50 per run |
audioFiles | array (upload) | — | Media uploaded straight from your computer; runs alongside mediaUrls. Give at least one of the two |
datasetId | string | — | Dataset of a finished scraper run; one audio/video link is taken from each row |
datasetItems | array | — | The same, with rows pasted in instead of chained by ID |
language | string | auto-detect | ISO code (en, es, pt, de, …) to force a language |
model | string | base | tiny (fastest) · base (fast) · small (most accurate). Clamped down if the run's memory cannot hold it — see below |
translateToEnglish | boolean | false | Output English translation instead of original language |
wordTimestamps | boolean | false | Add per-word start/end/confidence inside every segment (~15-25% slower) |
speakerLabels | boolean | false | Label who speaks when (Speaker 1, Speaker 2, …). Slower than the transcription itself (4 min of audio took ~2.5 min to label at 4 GB); give long recordings 8 GB+ |
vocabulary | string | — | Names and terms the audio contains, comma-separated, so they come out spelled right |
summarize | boolean | false | Summary, chapters with start times and keywords, written by Claude Haiku 4.5 after the transcript |
maxMinutesPerItem | integer | 120 | Per-URL cap; longer media is transcribed up to the cap |
maxEpisodesPerFeed | integer | 1 | Newest items taken per podcast feed, Apple Podcasts or Spotify show, YouTube channel or playlist, SoundCloud artist or set (up to 500) |
publishedAfter | string | — | Only episodes published after a date (2026-09-01) or within a window (30 days) |
episodeTitleContains | string | — | Only episodes whose title contains one of these words, ` |
usePublisherTranscripts | boolean | true | Deliver an episode from the transcript its publisher lists in the feed, when there is one |
cookies | string (secret) | — | Netscape cookies.txt for YouTube bot-gate or restricted content |
watchlistId | string | — | Named memory for scheduled runs; media transcribed under this id is remembered |
newItemsOnly | boolean | false | Leave out media already on the watchlist. Needs watchlistId |
proxyConfiguration | object | none needed | The Actor brings its own residential pool. Set Apify Proxy here only as an extra fallback, or paste your own proxy URLs to use those exclusively |
Minimal input:
{"mediaUrls": ["https://www.youtube.com/watch?v=jNQXAC9IVRw"]}
Output — key fields
| Field | Description |
|---|---|
text | Full transcript as one string |
segments | [{ start, end, text }] with seconds-precision timestamps; each also carries words when wordTimestamps is on, and speaker when speakers are labelled |
paragraphs | [{ start, end, text, speaker? }]: readable blocks, a new one at every speaker change or pause |
srt / vtt | Ready-to-save subtitle strings |
srtFileUrl / vttFileUrl | Direct download links to the stored .srt / .vtt files |
txtFileUrl / markdownFileUrl / docxFileUrl | The transcript as plain text, as Markdown and as a Word document (title, facts, summary and chapters when made, timestamped paragraphs) |
summary / chapters / keywords | With summarize: a 2-4 sentence summary, [{ start, end, startTime, title }] chapters and up to 15 key terms (null otherwise) |
speakers | How many speakers were labelled (null when speaker labels are off) |
transcriptSource / transcriptFileUrl | speech-recognition, or publisher with the link to the publisher's own transcript file |
language / languageProbability | Detected language and confidence |
hook3s / hookStartSeconds | The first 3 seconds of speech, and when speech starts; empty when the media opens silent |
title, uploader, publishedAt, thumbnailUrl | Media metadata from the source |
durationSeconds / transcribedSeconds | Full source length vs. what was transcribed (after the cap) |
billedSeconds | Seconds charged for this item — what the bill is actually computed from |
billedMinutes | The same figure in minutes, for pipelines built against the old per-minute billing |
wordCount, model, task, engine, sourceType, platform | Run metadata per item |
status | ok for a delivered transcript; otherwise why not: no_speech, bad_input, source_unavailable, transcription_failed, deadline |
charged | true only on delivered transcripts; every other row is free |
resolvedUrl | The link actually transcribed — the row's page link when a chained file had no sound |
error | null on success; every uncharged row carries the reason in plain language |
Output sample
{"url": "https://traffic.megaphone.fm/FSI3025045146.mp3","inputUrl": "https://feed.syntax.fm/rss","sourceType": "podcast-episode","platform": "podcast","title": "1023: Mosh, Caddy & Tailscale: A Remote Dev Deep Dive","uploader": "Syntax - Tasty Web Development Treats","publishedAt": "2026-07-22T11:00:00.000Z","durationSeconds": 2926.8,"transcribedSeconds": 120,"billedMinutes": 2,"language": "en","languageProbability": 0.9956,"model": "base","text": "Everybody has built tools for agents nobody is building actual products …","wordCount": 342,"segments": [{ "start": 0, "end": 6.04, "text": "Everybody has built tools for agents nobody is building actual products once I got team hooks" }],"srt": "1\n00:00:00,000 --> 00:00:06,040\nEverybody has built tools for agents …","vtt": "WEBVTT\n\n00:00:00.000 --> 00:00:06.040\nEverybody has built tools …","srtFileUrl": "https://api.apify.com/v2/key-value-stores/…/records/001-1023-mosh-caddy.srt","status": "ok","charged": true,"error": null}
Chain a scraper run
Put a finished run's dataset ID in datasetId (Apify's Connect actor integration fills it for you), or paste its rows into datasetItems. Each row becomes at most ONE item, whatever the scraper calls its fields:
- an audio file (
audioUrl, a podcastenclosure, any.mp3/.m4a/… link), - otherwise a video file (
videoUrl,videoUrls,downloadAddr,playAddr,mediaUrls, any.mp4/.m3u8/… link), - otherwise the page of that one video or post (
url,webVideoUrl, a reel, watch or status link).
Thumbnails, covers, profile pictures, commenters' avatars, profile and channel links are never picked. The HD and SD copies of one video are one item, and a post's page and its video file are one item: one transcript, one charge. When the picked file has no audio track (Instagram and Facebook often hand scrapers a video-only rendition) or its signed link has expired, the row's own page is transcribed instead and resolvedUrl says so. Rows with nothing to transcribe (image posts, text rows) are counted on the status line and cost nothing.
Scheduled runs: an episode is never billed twice
Give the run a watchlistId (letters, numbers, hyphens, underscores; for example syntax-fm) and switch on newItemsOnly. The actor keeps the media URLs it has transcribed in a named key-value store under that id; every later run with the same id reads the feed or list in full but leaves those items out of the work and the dataset, so a daily schedule on a podcast feed pays only for the new episode. A run whose input is entirely on the watchlist finishes with the count on its status line and charges nothing but the run start.
What was not delivered, and why
Every item the input asked for ends as a charged transcript row or as an entry in the run's ERRORS record (key-value store), never neither. Failed items also keep an error row in the dataset, as before. The record is written on every run, with an empty items list when everything was delivered, so an integration can read it unconditionally. Each entry carries a reason, a plain-language detail, and a retryable flag:
reason | What happened | Re-run as-is? |
|---|---|---|
bad_input | The URL could not be read as media, or a feed had no enclosures | No — fix the link |
source_unavailable | The host answered but would not serve the media: login wall, removed, still-live stream | No, or later for a live stream |
transcription_failed | The download or Whisper failed on our side | Yes |
no_speech | The audio decoded fine but holds no speech: music, silence or a tone | No — there is nothing to transcribe |
budget_cap | The run's maximum cost was reached before this item's turn | Raise the cost limit |
deadline | The run would have hit its timeout before this item finished | Raise the timeout or lower the batch |
The status line carries the same arithmetic, for example "Delivered 4 of 5 items. 1 not delivered and not charged: 1 source unavailable (login wall, removed, live) — see the ERRORS record." Items the watchlist left out are counted separately and never charged.
Pricing
Run memory
Memory decides two things: which Whisper model fits, and how much CPU Apify gives the run (roughly one vCPU per 4 GB). Measured peak usage is ~570 MB for tiny, ~906 MB for base and ~1503 MB for small. The 2 GB floor holds all three, and if a run is ever given less the Actor drops to the largest model that fits rather than being OOM-killed mid-decode:
| Run memory | Best for |
|---|---|
| 2 GB (default) | Reels, TikToks, short video, mixed use. Every model fits, and the per-GB start fee stays low — which is most of the bill on a clip under a minute |
| 4-8 GB | Podcasts, interviews, long video. Decode time dominates there, and Apify gives roughly one vCPU per 4 GB, so the extra memory pays for itself |
The start fee is charged per GB, so low memory is genuinely cheaper on short clips and genuinely slower on long media. Pick per job.
Pay-per-event: $0.0008 per second of media transcribed ($0.048 per minute) — the same rate whether the source is video or audio — plus a one-time actor-start fee of $0.005 per GB of run memory. Billing is per second, so a 40-second clip is billed 40 seconds rather than a full minute; failed and skipped items are never charged. No separate platform-usage bill.
| Media | Cost (default 4 GB run) |
|---|---|
| 1-minute TikTok | $0.09 |
| 10-minute YouTube video | $0.54 |
| 45-minute podcast episode | $2.29 |
| 10 × 1-minute Reels in one run | $0.54 |
FAQ
Do I need an OpenAI or any other API key? No. Whisper runs inside the Actor container. You only provide URLs.
Which sites work? Anything yt-dlp supports (1800+ extractors) plus podcast RSS/Atom feeds and direct media links. TikTok, YouTube, Instagram, Facebook, X and Rumble are tested paths.
What about videos without captions? They work — this transcribes the actual audio, so captions are never required.
How accurate is it? The default base model handles clear speech well across 99+ languages and runs ~2× faster than small. For hard audio (music beds, crosstalk, heavy accents), set model: "small" — the most accurate option.
How fast is it, and does memory matter? Roughly 3–5× faster than realtime at the default 4 GB. Apify allocates one CPU core per 4 GB of run memory, so 8 GB runs transcribe long media about twice as fast. Progress is visible live in the run log and the run's status message (e.g. "transcribed 24/65 min, ~9 min left").
Can it translate? Yes — set translateToEnglish: true and the transcript and subtitles come out in English regardless of source language.
YouTube says "Sign in to confirm you're not a bot"? Paste a Netscape cookies.txt from a logged-in session into the cookies field. The field is stored as a secret.
How do long files bill? A 3-hour source with maxMinutesPerItem: 120 transcribes and bills 120 minutes. Lower the cap to bound spend per item; the Actor also stops before exceeding your run's maximum cost.
An Instagram/Facebook scontent… CDN link fails with "no audio track"? Those raw CDN URLs are usually DASH video-only renditions — the audio lives in a separate stream. Paste the post/reel page URL (e.g. https://www.instagram.com/reel/…) and the Actor downloads the version that includes audio. When the link arrives through datasetId/datasetItems and the row also carries the post's page, that switch happens on its own.
Music-only audio, or a video with no voice-over? Speech models invent filler over music ("Thank you.", "♪", "Subtitles by the Amara.org community"). The Actor recognises a transcript made only of that, in any language, and returns an uncharged no_speech row instead of billing you for words the audio does not contain.
Apple Podcasts links? A show link (podcasts.apple.com/…/id1200361736) is resolved to the show's own RSS feed and its newest maxEpisodesPerFeed episodes are transcribed. An episode link (the one carrying ?i=) transcribes that episode.
Live streams? Ongoing streams can't be transcribed — the recording has to finish first. A stream that ended within the last few hours may still be processing on YouTube's side (downloads are slow and unreliable until then); the Actor tells you when that's the case — retry once the regular video is published.
Spotify links? Yes, for any show that also publishes a public podcast feed, which is most of them. Spotify streams with DRM, so the Actor reads the episode's title, show and date from Spotify's public embed page, finds the same episode in the show's feed and transcribes that file. A Spotify-only show has no public feed and comes back as an uncharged row saying so.
How are the summary and chapters made? With summarize: true, the finished transcript is sent to Anthropic's API and Claude Haiku 4.5 writes the summary, chapters and keywords in the recording's language, as structured JSON. Chapter start times come from the transcript's own timestamps and are checked to fall inside the recording. It is machine-written, so check it before publishing. If the service is unavailable the row says so in summaryNote and the transcript is delivered as usual.
Can it follow a YouTube channel or a podcast? Yes. Paste the channel (https://www.youtube.com/@name), a playlist, a podcast feed or a Spotify or Apple Podcasts show, set maxEpisodesPerFeed to how many recent items to take, give the run a watchlistId and turn on newItemsOnly, then put it on an Apify schedule. Each run transcribes only what is new since the last one.
How good are the speaker labels? They run on the Actor's CPU (pyannote segmentation with WeSpeaker voice embeddings). In our tests on a two-voice clip and a six-minute news podcast, 89-93% of the speech got the right label and the guest kept one label throughout. The weak spot is one person recorded two different ways: a host's pre-recorded intro and their studio talk can come back as two speakers. Labelling runs after the transcription and is the slower step: a 4 GB run labelled 4 minutes of audio in about 2.5 minutes, so give long recordings 8 GB or more and a longer timeout.
Why is an episode done in seconds, with transcriptSource: publisher? Its publisher lists a timed transcript in the podcast feed (Podcasting 2.0 <podcast:transcript>), and that file is delivered instead of transcribing the audio. Set usePublisherTranscripts: false to always transcribe the audio yourself.
Support
Found a bug or want another output field? Open an issue on the Actor's Issues tab — it is monitored.
🤖 For AI Agents & LLM Apps
Compact reference for AI agents calling this actor via the Apify MCP server or the Apify API (actor: memo23/video-audio-transcriber).
Purpose: Turn any video/audio/podcast URL into transcript data (full text + timestamped segments + SRT/VTT + language) with one call. No API key management — Whisper runs inside the Actor.
Minimal input (tested):
{ "mediaUrls": ["https://github.com/openai/whisper/raw/main/tests/jfk.flac"] }
Output fields (flat): url, inputUrl, sourceType, platform, title, uploader, publishedAt, thumbnailUrl, durationSeconds, transcribedSeconds, billedMinutes, language, languageProbability, task, model, text, wordCount, segments[] ({start,end,text}), srt, vtt, srtFileUrl, vttFileUrl, txtFileUrl, markdownFileUrl, docxFileUrl, paragraphs[], summary, chapters[], keywords[], speakers, transcriptSource, transcriptFileUrl, status, charged, resolvedUrl, error.
Behaviors agents should know:
- Podcast feed URLs and Apple Podcasts show links expand to the newest
maxEpisodesPerFeedepisodes — one row each. datasetId/datasetItemstake one audio or video link per row; images and profile links are ignored.statusisokon delivered transcripts (charged: true);no_speech,bad_input,source_unavailable,transcription_failedanddeadlinerows are never charged.erroris non-null on all of those; check it before consumingtext.- Billing:
media-second-transcribed×billedSecondsper item, $0.0008 each, plus a one-timeapify-actor-startfee of $0.005 per GB of run memory.billedMinutesis still emitted as a convenience field. Bound spend withmaxMinutesPerItemand the run's maximum cost setting. - Long media takes real time (roughly 0.2–0.5× the media length depending on
model); set your wait/polling timeout accordingly, or usetinyfor drafts.
Explore more actors
- Rumble Scraper — videos, channels & search with direct media URLs.
- YouTube Video Downloader — grab the source files this transcriber reads.
- YouTube Video Details Scraper — metadata at scale before you pick what to transcribe.
- YouTube Comments Scraper — pair transcripts with audience reaction.
- X (Twitter) Scraper — find the video posts worth transcribing.
- Xiaohongshu / RedNote Scraper — the same workflow for China's RedNote.
⚠️ Disclaimer
This Actor processes only publicly accessible media that you point it at. Use it in compliance with each platform's Terms of Service and applicable laws, including copyright: transcribe content you have the right to process. You are responsible for how you use the output. The Actor does not bypass logins, paywalls, DRM, or any access controls; the optional cookies input only authenticates your own session to content you can already access.
SEO Keywords
video transcriber, audio transcriber, media transcriber, AI summary, podcast chapters, YouTube channel transcripts, transcript to Word DOCX, speaker diarization, speaker labels, Spotify podcast transcript, Google Drive audio transcription, whisper transcription, video to text, audio to text, speech to text API, audio transcription, podcast transcript, Apple Podcasts transcript, TikTok transcript, YouTube transcript generator, Instagram Reel transcript, SoundCloud transcript, Dailymotion transcript, Rumble transcript, podcast transcription, RSS feed transcriber, SRT generator, VTT subtitles, subtitle generator, transcribe mp3, transcribe mp4, no API key whisper, faster-whisper actor, translate video to English, Apify transcription actor.