Audio & Video Transcription (Whisper) + Speaker Diarization avatar

Audio & Video Transcription (Whisper) + Speaker Diarization

Pricing

Pay per event

Go to Apify Store
Audio & Video Transcription (Whisper) + Speaker Diarization

Audio & Video Transcription (Whisper) + Speaker Diarization

Transcribe audio and video files with Whisper: text, timestamped segments, speaker labels (diarization), language detection, translation to English, word timings and SRT/VTT subtitles. MP3, M4A, WAV, MP4 and more from URLs or key-value stores. Priced per audio minute.

Pricing

Pay per event

Rating

0.0

(0)

Developer

tinplatelabs

tinplatelabs

Maintained by Community

Actor stats

0

Bookmarked

55

Total users

47

Monthly active users

14 days ago

Last modified

Security

Limited permissions

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, speaker labels (who said what: SPEAKER_1, SPEAKER_2, ...) if you turn them on, 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_SUPPORTED error (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.
  • Speaker diarization. Set diarization: true and every segment says who spoke (SPEAKER_1, SPEAKER_2, ...), with speaker turns in the SRT, VTT and text files. The number of speakers is found automatically, or set numSpeakers. Runs on open models inside your run (no third-party API).
  • 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

FieldTypeDefaultWhat it does
mediaarray of stringsrequiredDirect 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 (more get TOO_MANY_FILES items).
keyValueStoreIdstringYour 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.
modelbase | small | mediumbaseWhisper model size. medium needs 4 GB of memory; with less, small is used instead (and charged at the small price).
languagestringautoISO 639-1 code such as en, es, de, ja, or a name (Swedish, Brazilian Portuguese). Empty: detect. A value that is not a language is detected instead, with a warning.
tasktranscribe | translatetranscribetranslate outputs English.
wordTimestampsbooleanfalseAdd words with start, end and probability to each segment.
diarizationbooleanfalseSpeaker labels: who spoke each segment (SPEAKER_1, ...). A segment where the speaker changes is split at the word.
numSpeakersinteger 1-20autoHow many people speak, if you know it (turns diarization on). Empty: detected.
vadFilterbooleantrueSkip silence and music (Silero VAD).
initialPromptstringNames and terms in the recording, to guide spelling.
includeSegmentsbooleantrueAdd segments to each result.
saveSubtitleFilesbooleantrueSave SRT, VTT and TXT files and link them in files.
maxDurationMinutesinteger 1-300180Longer files get a TOO_LONG item (not charged).
fileTimeoutSecsinteger 60-144003600Slower 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",
"diarization": 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}
]
}
  • languageProbability is Whisper's confidence in the detected language (null when you set language).
  • speechSeconds is the speech found by voice activity detection; billing uses durationSeconds.
  • With wordTimestamps, each segment has words: [{"start", "end", "word", "probability"}].
  • With diarization, each segment has "speaker": "SPEAKER_1", and the item adds diarized: true, speakerCount and speakers: [{"id": "SPEAKER_1", "speakingSeconds": 312.4, "segmentCount": 41}, ...]. The SRT and TXT files prefix each turn with SPEAKER_1: (a new paragraph per turn in TXT); VTT uses <v SPEAKER_1> voice tags. Speakers are numbered in order of first appearance; names are not guessed.
  • The files links 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, RUN_TIMEOUT, TOO_MANY_FILES, SPENDING_LIMIT_REACHED, INTERNAL_ERROR.

Pricing (pay per event)

EventPriceWhen
minute-transcribed-base$0.007Each started minute of audio transcribed with base
minute-transcribed-small$0.016Each started minute with small
minute-transcribed-medium$0.055Each started minute with medium
minute-diarized$0.003Each started minute with speaker labels (diarization), free until 2026-11-10
apify-actor-start$0.0025 per GBOnce 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. Speaker labels add $0.18 per hour (from 2026-11-10; free before), and are not charged when they could not be added. 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).
  • Run timeout: shortly before the run's own timeout (Run options > Timeout) the Actor stops by itself: the file in progress is saved with status: "partial", its text so far and transcribedSeconds, and is charged only for the minutes transcribed; later files get RUN_TIMEOUT items (not charged). Raise the timeout for long files.
  • One audio track per file (the first).
  • Speaker labels are anonymous (SPEAKER_1, ...) and per file: the same person is not matched across files. Accuracy is best with clear turns; crosstalk is labelled with the main speaker, and similar voices can be merged (set numSpeakers if you know it). Diarization adds roughly 40% to the base model's processing time.
  • 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.
  • Speaker diarization models: pyannote segmentation-3.0 (MIT) and the 3D-Speaker ERes2Net base speaker-embedding model (Apache-2.0), as ONNX exports by the k2-fsa project, pinned and SHA256-checked like the Whisper files. No endorsement by their authors is implied.
ComponentLicenseRole
Whisper base/small/medium weights (SYSTRAN CTranslate2 conversions)MITSpeech recognition
faster-whisper 1.2.1 (incl. Silero VAD model)MITTranscription
CTranslate2 4.8.2MITInference
onnxruntime 1.31.0MITVoice activity detection, speaker segmentation
pyannote segmentation-3.0 (int8 ONNX)MITSpeaker turns
3D-Speaker ERes2Net base (ONNX)Apache-2.0Speaker embeddings
sherpa-onnx 2.0.1Apache-2.0Speaker-embedding features
tokenizers, huggingface-hubApache-2.0Tokenizer, model loading
numpy 2.4.6BSD-3-ClauseAudio arrays
httpx 0.28.1, httpcore, h11, anyio, idnaBSD-3-Clause / MITDownloads
apify 4.1.0, apify-client, crawlee and their dependenciesApache-2.0 / MIT / BSDApify SDK
tqdm, certifiMPL-2.0 + MIT / MPL-2.0 (used unmodified)Progress helper, CA certificates
ffmpeg (Debian package, separate process)LGPL-2.1+ / GPLDecoding

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.