Speech to Text — YouTube, TikTok, Instagram, 99+ Languages avatar

Speech to Text — YouTube, TikTok, Instagram, 99+ Languages

Pricing

from $30.00 / 1,000 minute of audio transcribeds

Go to Apify Store
Speech to Text — YouTube, TikTok, Instagram, 99+ Languages

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

Sergey Andronik

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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

FieldTypeDefaultNotes
urlsarray of strings(required)YouTube/TikTok/Instagram/podcast/X links, or direct https media URLs (mp3, wav, m4a, mp4, …). One dataset item per URL.
languagestringauto-detectBCP-47 hint (en, ru, ro, …). Leave empty to auto-detect.
timestampsnone | segment | wordsegmentGranularity of the returned timing information.
diarizebooleanfalseLabel speakers S1, S2, … using premium engines, at the diarized per-minute rate.
providerstringautoAdvanced: 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": "..." }
— so a batch of 50 URLs with one bad link still returns 49 transcripts.

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 (summary field, or summary_error if it fails).
  • translateTo: "<bcp-47>" — a full translation of the transcript (translation: { language, text }, or translation_error).
  • extractKeywords: true — 5-10 extracted keywords/topics (keywords array, or keywords_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.

EventPriceWhen it's charged
Actor start$0.005Once per run, flat.
Platform video fetched$0.02Once 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 / minutePer started minute, only after transcription succeeds.
Audio transcribed (diarized)$0.05 / minutePer started minute with speaker labels, only after transcription succeeds.
Transcript summary$0.015 / itemOnce per URL, only if summarize is set and the summary succeeds.
Transcript translation$0.015 / itemOnce per URL, only if translateTo is set and the translation succeeds.
Transcript keywords$0.008 / itemOnce 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.