Speech to Text — YouTube, TikTok, Instagram, 99+ Languages
Pricing
from $30.00 / 1,000 minute of audio transcribeds
Speech to Text — YouTube, TikTok, Instagram, 99+ Languages
Multi-engine speech-to-text for YouTube, TikTok, Instagram, podcasts, X, and direct media URLs. Auto-detects 99+ languages, routes across Groq/OpenAI/ElevenLabs/Google with automatic failover, and returns text, SRT/VTT subtitles, and optional speaker diarization. Pay-per-event — no subscription.
Pricing
from $30.00 / 1,000 minute of audio transcribeds
Rating
0.0
(0)
Developer
Sergey Andronik
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Speech to Text — Audio & Video Transcriber
Real audio transcription — not caption scraping — for any audio or video URL: YouTube, TikTok, Instagram, X, podcast links, or direct media files. Auto-detects the spoken language across 99 languages, with optional speaker diarization to label who said what, and returns clean text plus ready-to-use SRT/VTT subtitle files alongside an LLM-ready transcript. Works even when a video has no caption track, or the auto-captions are low quality.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
urls | array of strings | (required) | YouTube/TikTok/Instagram/podcast/X links, or direct https media URLs (mp3, wav, m4a, mp4, …). One dataset item per URL. |
language | string | auto-detect | BCP-47 hint (en, ru, ro, …). Leave empty to auto-detect. |
timestamps | none | segment | word | segment | Granularity of the returned timing information. |
diarize | boolean | false | Label speakers S1, S2, … using premium engines, at the diarized per-minute rate. |
provider | string | auto | Advanced: pin one exact engine (e.g. "groq/whisper-large-v3", "elevenlabs/scribe_v2") instead of automatic tier routing + failover. Fails cleanly if the pinned engine can't serve the request (e.g. no diarization support) or isn't configured on this actor. Leave empty for automatic routing. |
Worked example
Input:
{"urls": ["https://www.youtube.com/watch?v=example12345"],"language": "en","timestamps": "segment","diarize": false}
Resulting dataset item (one per URL):
{"url": "https://www.youtube.com/watch?v=example12345","text": "Welcome back to the show. Today we're talking about organic growth loops.","language": "en","duration_s": 600.0,"engine": "groq/whisper-large-v3","segments": [{ "t0": 0, "t1": 4.2, "text": "Welcome back to the show." },{ "t0": 4.2, "t1": 9.8, "text": "Today we're talking about organic growth loops." }],"srt": "1\n00:00:00,000 --> 00:00:04,200\nWelcome back to the show.\n\n2\n00:00:04,200 --> 00:00:09,800\nToday we're talking about organic growth loops.\n","vtt": "WEBVTT\n\n00:00:00.000 --> 00:00:04.200\nWelcome back to the show.\n\n00:00:04.200 --> 00:00:09.800\nToday we're talking about organic growth loops.\n","transcript_llm": "Welcome back to the show.\nToday we're talking about organic growth loops.","usage": { "minutes": 10, "diarized": false, "platform_fetch": true }}
The srt and vtt files are also saved to the run's key-value store as
transcript-000.srt / transcript-000.vtt (indexed by the URL's position in the input
list) for direct download. A failed URL still produces one dataset row —
{ "url": ..., "error": "..." }Add-ons
Three optional post-processing steps run on the already-produced transcript text (not the audio) and are billed only when they succeed:
summarize: true— a 2-4 sentence AI summary (summaryfield, orsummary_errorif it fails).translateTo: "<bcp-47>"— a full translation of the transcript (translation: { language, text }, ortranslation_error).extractKeywords: true— 5-10 extracted keywords/topics (keywordsarray, orkeywords_error).
All three require GEMINI_API_KEY to be configured on the actor; the run fails fast at startup if one is requested without it. A failed add-on never affects the transcript itself — it already succeeded and was already billed.
Pricing
Pay-per-event — you only pay for what actually completes.
| Event | Price | When it's charged |
|---|---|---|
| Actor start | $0.005 | Once per run, flat. |
| Platform video fetched | $0.02 | Once per URL, only after a platform video/audio (YouTube, TikTok, Instagram, X, …) is successfully downloaded via yt-dlp. Not charged for direct media URLs. |
| Audio transcribed | $0.03 / minute | Per started minute, only after transcription succeeds. |
| Audio transcribed (diarized) | $0.05 / minute | Per started minute with speaker labels, only after transcription succeeds. |
| Transcript summary | $0.015 / item | Once per URL, only if summarize is set and the summary succeeds. |
| Transcript translation | $0.015 / item | Once per URL, only if translateTo is set and the translation succeeds. |
| Transcript keywords | $0.008 / item | Once per URL, only if extractKeywords is set and extraction succeeds. |
Example: a 10-minute YouTube video, no diarization:
$0.005 + $0.02 + 10 × $0.03 = $0.325.
The same 10-minute video with diarization enabled:
$0.005 + $0.02 + 10 × $0.05 = $0.525.
Direct audio/video URLs skip the $0.02 fetch charge entirely. Nothing is charged for a URL that fails to download or transcribe.
How it's different
This actually transcribes the audio — it doesn't scrape a platform's existing caption track, so it works on videos with no captions, auto-captions in the wrong language, or audio-only sources like podcasts. It's also not a wrapper around a single model. Every request is routed across multiple speech-to-text engines — Groq Whisper, OpenAI, ElevenLabs Scribe, and Google Chirp — with automatic failover: if the first engine in the chain is rate-limited, times out, or rejects the file, the actor retries the next one before giving up. Diarized runs route to the premium engines (ElevenLabs Scribe, OpenAI's diarization model, Google Chirp) that can reliably label speakers across a whole recording. You get a transcript back, not a provider-specific error.
Use via MCP (AI agents)
For lower latency on short clips, this actor also runs as an always-warm Standby MCP server exposing a single transcribe_audio(url, language?, diarize?) tool — connect directly to the actor's Standby URL (Apify Console → this actor → Settings → Standby) instead of the shared mcp.apify.com gateway. Billing is identical to the batch actor (per-minute transcription, platform-fetch fee when applicable) — no separate Standby charge.
Language coverage
Powered by Whisper-family and other models with native support for ~99 languages.
Leave language empty for auto-detection, or pass a BCP-47 hint to skip detection and
speed up routing.
Privacy
Audio and video are downloaded to a temporary directory only for as long as it takes to process that one URL, and deleted immediately once that item finishes — whether it succeeds or fails. Nothing is retained beyond the transcript data written to your run's own dataset and key-value store; no audio or video is stored, logged, or reused across runs.