Audio & Video Transcription (Whisper) for AI Agents
Pricing
Pay per event
Audio & Video Transcription (Whisper) for AI Agents
Transcribe your audio and video files with Whisper: text, timestamped segments, optional word timings, language detection, translation to English, and SRT/VTT subtitle files. MP3, M4A, WAV, MP4, WebM and more from URLs or key-value stores. Priced per audio minute.
Pricing
Pay per event
Rating
0.0
(0)
Developer
tinplatelabs
Maintained by CommunityActor stats
0
Bookmarked
11
Total users
10
Monthly active users
2 days ago
Last modified
Categories
Share
Turn your audio and video files into text the way an AI agent or pipeline can use it: the full transcript, timestamped segments (and word timings if you want them), the detected language with a confidence score, the duration, and ready-made SRT and WebVTT subtitle files. Send a batch of file URLs or key-value store records; get one result row per file.
Works on interviews, meetings, podcasts, lectures, voice notes, webinars, customer calls and videos you own. Built for people and AI agents (Claude, ChatGPT, Cursor and others through the Apify MCP server).
Your files only. This Actor transcribes media files you supply. It does not download from YouTube, TikTok, Instagram, Facebook, X, Vimeo, SoundCloud, Spotify or other platforms: links to their pages get a
PLATFORM_URL_NOT_SUPPORTEDerror (free). Upload the file you have the rights to into a key-value store, or give a direct link to it on your own storage.
Why this one
- Whisper, three sizes. OpenAI's Whisper (MIT) via faster-whisper on CPU:
base(fast, clear speech),small(accents, noise, non-English),medium(most accurate). Each has its own per-minute price. - 99 languages. Automatic language detection with a confidence score, or set the language yourself. Optional translation to English.
- Subtitles included. SRT, WebVTT and plain-text files are saved to the run's key-value store, with download links in the result.
- Clean output. Silero voice activity detection skips silence and music, which avoids invented text in quiet parts. The plain text starts a new paragraph after long pauses.
- Any format. MP3, M4A/AAC, WAV, FLAC, OGG/Opus, WebM, MP4, MOV, MKV, AVI and most other audio and video formats (decoded by ffmpeg). Video files are transcribed from their audio track.
- Long files. Up to 5 hours per file (default limit 3 hours). Long recordings are cut at quiet moments into 10-minute pieces and stitched back on one timeline.
- Predictable. Pay per started audio minute, only for files that were transcribed. Every failure is an error item that says what to change, and it costs nothing.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
media | array of strings | required | Direct http(s) URLs of audio/video files, key-value store records as kvs://KEY (the store in keyValueStoreId, else this run's store) or kvs://STORE_ID_OR_NAME/KEY, or signed Apify record URLs (?signature=). Up to 200 per run. |
keyValueStoreId | string | Your key-value store holding the files (pick it in Console, or pass its ID). The Actor runs with limited permissions and can read only this store and its own. | |
model | base | small | medium | base | Whisper model size. medium needs 4 GB of memory; with less, small is used instead (and charged at the small price). |
language | string | auto | ISO 639-1 code such as en, es, de, ja. Empty: detect. |
task | transcribe | translate | transcribe | translate outputs English. |
wordTimestamps | boolean | false | Add words with start, end and probability to each segment. |
vadFilter | boolean | true | Skip silence and music (Silero VAD). |
initialPrompt | string | Names and terms in the recording, to guide spelling. | |
includeSegments | boolean | true | Add segments to each result. |
saveSubtitleFiles | boolean | true | Save SRT, VTT and TXT files and link them in files. |
maxDurationMinutes | integer 1-300 | 180 | Longer files get a TOO_LONG item (not charged). |
fileTimeoutSecs | integer 60-14400 | 3600 | Slower files get a TIMEOUT item (not charged). |
{"media": ["https://upload.wikimedia.org/wikipedia/commons/3/35/First_Inauguration_of_FDR_-_Fear_Itself_Excerpt.ogg","kvs://team-call-2026-10-01.m4a"],"keyValueStoreId": "my-recordings","model": "small","wordTimestamps": true}
To transcribe a file that isn't online, upload it to a key-value store, pick that store as keyValueStoreId and
pass kvs://KEY.
Output
One dataset item per file:
{"source": "https://upload.wikimedia.org/wikipedia/commons/3/35/First_Inauguration_of_FDR_-_Fear_Itself_Excerpt.ogg","status": "ok","text": "So first of all, let me assert my firm belief that the only thing we have to fear is fear itself ...","language": "en","languageProbability": 0.99,"languageDetected": true,"task": "transcribe","model": "base","durationSeconds": 46.959,"speechSeconds": 44.1,"billedMinutes": 1,"chargedEvent": "minute-transcribed-base","segmentCount": 9,"wordCount": 96,"files": {"srt": {"key": "001-First_Inauguration_of_FDR_-_Fear_Itself_Excerpt.srt", "url": "https://api.apify.com/v2/key-value-stores/.../records/001-...srt?signature=..."},"vtt": {"key": "001-First_Inauguration_of_FDR_-_Fear_Itself_Excerpt.vtt", "url": "https://..."},"txt": {"key": "001-First_Inauguration_of_FDR_-_Fear_Itself_Excerpt.txt", "url": "https://..."}},"media": {"format": "ogg", "audioCodec": "vorbis", "hasVideo": false, "sizeBytes": 995439},"timingMs": {"download": 310, "decode": 120, "transcribe": 4200, "total": 4700},"realtimeFactor": 0.089,"warnings": [],"segments": [{"id": 0, "start": 0.0, "end": 6.2, "text": "So first of all, let me assert my firm belief", "avgLogprob": -0.21, "noSpeechProb": 0.01}]}
languageProbabilityis Whisper's confidence in the detected language (null when you setlanguage).speechSecondsis the speech found by voice activity detection; billing usesdurationSeconds.- With
wordTimestamps, each segment haswords: [{"start", "end", "word", "probability"}]. - The
fileslinks are signed and work without an Apify token.
A file that can't be transcribed gives an error item, and the run carries on:
{"source": "https://www.youtube.com/watch?v=...", "status": "error","error": {"code": "PLATFORM_URL_NOT_SUPPORTED", "message": "Links to youtube.com pages are not supported: this Actor transcribes media files you supply ..."}}
Error codes: INVALID_SOURCE, PLATFORM_URL_NOT_SUPPORTED, ACCESS_DENIED, DOWNLOAD_FAILED, FILE_TOO_LARGE,
NOT_MEDIA, NO_AUDIO_STREAM, UNSUPPORTED_MEDIA, EMPTY_AUDIO, TOO_LONG, TIMEOUT, SPENDING_LIMIT_REACHED,
INTERNAL_ERROR.
Pricing (pay per event)
| Event | Price | When |
|---|---|---|
minute-transcribed-base | $0.007 | Each started minute of audio transcribed with base |
minute-transcribed-small | $0.016 | Each started minute with small |
minute-transcribed-medium | $0.055 | Each started minute with medium |
apify-actor-start | $0.0025 per GB | Once per run, per GB of memory: $0.01 at the default 4 GB (loading the speech model) |
A 1-hour podcast costs $0.43 with base or $0.97 with small (including the run start). A 61-second clip counts
as 2 minutes. Send many files in one run to pay the start fee once. Platform
usage is included in the price. Failed files are never charged; a file with no speech in it is charged like any
other. Before each file the run checks your maximum total charge; a file that does not fit is marked
SPENDING_LIMIT_REACHED and not transcribed.
Speed and memory
It runs on CPU. The default 4 GB run has one CPU core: base transcribes about 10 minutes of audio per minute,
small about 4, medium a little over 1 (measured on Apify). 8 GB (two cores) is faster at the same price.
medium needs 4 GB; a run with less memory uses small instead and says so in its status and warnings.
At 2 GB, small decodes in smaller batches to stay within memory (a little slower). Audio is decoded to disk,
so long files do not need extra memory. A failed file gets an error item and is not charged; the run itself only
fails for invalid input.
Limits
- 1 GB per file, 200 files per run, up to 300 minutes per file (
maxDurationMinutes, default 180). - One audio track per file (the first). No speaker labels (diarization).
- Platform page links (YouTube, TikTok, Instagram, Facebook, X, Vimeo, SoundCloud, Spotify, Twitch and similar) are refused.
- Downloads follow up to 5 redirects; only public addresses are fetched.
Privacy
Files are downloaded into your run and processed inside it; results go only to the run's dataset and key-value store. Nothing is sent to any third party (no speech-to-text API), there is no telemetry, and only the exact URLs you give are fetched.
Use from an AI agent (MCP)
Add the Apify MCP server to your agent and enable this Actor. Call it with {"media": ["<file url>"]} and read
text (or segments for timestamps) from the dataset item; use files.srt.url for subtitles.
Models and licenses
- Models: OpenAI Whisper base, small and medium (MIT), as CTranslate2 conversions by SYSTRAN (faster-whisper-base, -small, -medium, MIT), pinned to a revision and checked against SHA256 sums at build time, run with int8 weights. Silero VAD (MIT) ships with faster-whisper. No endorsement by OpenAI or SYSTRAN is implied.
- ffmpeg (LGPL/GPL) is the unmodified Debian package, run as a separate program to decode media. PyAV is not used.
| Component | License | Role |
|---|---|---|
| Whisper base/small/medium weights (SYSTRAN CTranslate2 conversions) | MIT | Speech recognition |
| faster-whisper 1.2.1 (incl. Silero VAD model) | MIT | Transcription |
| CTranslate2 4.8.2 | MIT | Inference |
| onnxruntime 1.31.0 | MIT | Voice activity detection |
| tokenizers, huggingface-hub | Apache-2.0 | Tokenizer, model loading |
| numpy 2.4.6 | BSD-3-Clause | Audio arrays |
| httpx 0.28.1, httpcore, h11, anyio, idna | BSD-3-Clause / MIT | Downloads |
| apify 4.1.0, apify-client, crawlee and their dependencies | Apache-2.0 / MIT / BSD | Apify SDK |
| tqdm, certifi | MPL-2.0 + MIT / MPL-2.0 (used unmodified) | Progress helper, CA certificates |
| ffmpeg (Debian package, separate process) | LGPL-2.1+ / GPL | Decoding |
Test-only: pytest (MIT). CI fails on any copyleft Python dependency.
Made by Tinplate Labs. This Actor is maintained by an AI; there is no support desk, so every error message is written to tell you exactly what to change.