Audio Transcriber — Speech to Text (Whisper) avatar

Audio Transcriber — Speech to Text (Whisper)

Pricing

from $15.00 / 1,000 minute of audio transcribeds

Go to Apify Store
Audio Transcriber — Speech to Text (Whisper)

Audio Transcriber — Speech to Text (Whisper)

Transcribe audio to text with Whisper running locally — no API key. Give any media URL (podcast, TikTok, Instagram, YouTube, or a direct audio file) and get text, timestamped segments, SRT subtitles and auto-detected language. Pay per minute transcribed.

Pricing

from $15.00 / 1,000 minute of audio transcribeds

Rating

0.0

(0)

Developer

viralanalyzer

viralanalyzer

Maintained by Community

Actor stats

0

Bookmarked

62

Total users

23

Monthly active users

16 hours ago

Last modified

Categories

Share

🎧 Audio Transcriber — Speech to Text (Whisper) for Podcasts, Social & Uploads

$0.015 per minute transcribed (+ Apify platform usage) · 🔒 no API key needed · 🌍 any language (auto-detect) · 📝 text + SRT + timestamps 🔗 View on Apify Store · 🇺🇸 English · 🇧🇷 Português

Transcribe audio to text using OpenAI Whisper running locally inside the Actor (faster-whisper) — no external API, no key, no rate limits. Just give any media URL — a podcast, TikTok, Instagram, YouTube, SoundCloud, or a direct link to an audio file — and get accurate text, timestamped segments, SRT subtitles and auto-detected language. Audio is extracted automatically from video links too.

Who it's for: podcasters & content teams, journalists, researchers, accessibility/SEO teams, and developers building search or summarization on top of spoken audio.

▶️ Click Try for free — your first run returns a real transcript in seconds.

✨ Features

  • 🎯 Real Whisper transcription (not just captions) — works on audio that has no subtitles.
  • 🌍 99+ languages, auto-detected (or force one with the language field).
  • 🔗 Any source — social networks, podcast hosts, or a direct audio-file link (mp3/wav/m4a/…).
  • 📝 Rich output — full text, timestamped segments, ready-to-use SRT, word count, language.
  • 🔒 Self-contained — Whisper runs in the container; you never need an API key.
  • 💸 Fair pricing — pay per minute of audio actually transcribed.

📥 Input

FieldTypeRequiredDescription
mediaUrlsarrayAudio/media URLs (social/podcast link or direct audio file)
languagestringISO code (en, pt, es…). Empty = auto-detect
modelstringtiny | base (default) | small — speed vs. accuracy
maxMinutesPerItemintegerSafety cap on minutes per URL (default 120)
proxyConfigurationobjectDatacenter by default; use RESIDENTIAL if a network blocks the download

📤 Output (per item)

{
"url": "https://…",
"title": "Episode 12 — …",
"language": "en",
"durationSeconds": 612.4,
"billedMinutes": 11,
"text": "Full transcript text …",
"segments": [{ "start": 0.0, "end": 4.2, "text": "…" }],
"srt": "1\n00:00:00,000 --> 00:00:04,200\n…",
"wordCount": 1840
}

🎯 Use cases

  • Turn podcasts/interviews into searchable, quotable text.
  • Generate SRT subtitles for social clips.
  • Feed spoken audio into summarization / RAG / analytics.
  • Accessibility transcripts for compliance.

✅ Capabilities & Limits

Stated up front, so you do not pay a run to find out.

Built here: a podcast or upload URL ending in a media extension skips yt-dlp entirely - plain HTTP GET plus ffmpeg. yt-dlp's generic extractor fetches a "webpage" first and most CDNs answer 403, which is exactly where direct audio links used to fail.

Input / featureSupportedNotes
mediaUrlsrequiredAudio/media URLs to transcribe — a podcast/social/video link (audio is extracted automatically) or a direct link to an audio file (mp3, wav, m4a, ...).
languageISO code (e.g. 'en', 'pt', 'es'). Leave empty to auto-detect.
modelAccuracy vs. speed. 'small' (default, more accurate), 'base' (faster) or 'tiny' (fastest). Larger models cost a bit more compute time.
Result volume (maxMinutesPerItem)⚠️Safety cap on how many minutes of audio to transcribe per URL.
youtubeCookiesPaste the contents of a Netscape cookies.txt exported from a logged-in YouTube session to reliably download YouTube (avoids the 'Sign in to confirm…
Proxy⚠️Residential proxy by default — social networks (YouTube/TikTok/Instagram) block datacenter IPs when downloading media. Keep RESIDENTIAL unless your…

❓ FAQ

Q: Do I need an API key (OpenAI, etc.)? A: No. Whisper runs inside the Actor — you only provide URLs.

Built here — what YouTube's bot-gate actually does, with both measurements: YouTube answers a share of requests with "Sign in to confirm you're not a bot", and it does so per exit IP, not per video. The rate is not stable, and we have measured it twice on the same video over Apify RESIDENTIAL:

DateConditionResult
2026-08-048 items, full download6/8 — the two gated ones were long videos
2026-08-308 items, partial fetch8/8, no gate at all

Treat neither number as the rate you will get. What holds across both is the mechanism: a URL gated on one IP goes through on the next. Since 1.2.1 a gated item is retried on a fresh residential session, up to 3 attempts. The retry costs almost no proxy traffic — the gate fires on the metadata probe (yt-dlp --skip-download), before any media is pulled. Only a confirmed gate is retried; an unavailable or removed video fails on the first attempt. When every attempt is gated you get a BLOCKED record naming how many IPs were tried, and nothing is charged.

Do not reach for youtubeCookies first — measured 2026-08-30. A controlled pair, same video, same proxy, 8 items each, minutes apart: with no cookies, 8/8 transcribed; with a cookies.txt exported from a logged-in session, 0/8 — every item failed with "The page needs to be reloaded." and the run ended FAILED. The file was accepted by YouTube as a session ("LOGGED_IN":true) but was missing the HttpOnly cookies __Secure-1PSID, __Secure-3PSID, HSID and SSID, because the browser extension used could only read document.cookie. A half-authenticated session breaks the player request outright — worse than sending nothing.

So leave youtubeCookies empty unless anonymous access is actually failing for you. If you do use it, the export must include the HttpOnly cookies; a bad file now returns COOKIES_REJECTED naming the cause instead of a generic download error.

Q: Which sources work? A: Anything yt-dlp supports (1800+ sites) plus direct audio-file links. If a network blocks the download, enable RESIDENTIAL proxy.

Q: How is it billed? A: $0.015 per minute of audio transcribed (rounded up per item), plus the Apify platform usage of the run (compute and proxy, at Apify's standard rates, shown on your run). A 10-minute podcast = $0.15 + usage. Each item is charged right after it is delivered, so a run that stops early bills only what you received.

Q: What if an audio is longer than the run can handle? A: The Actor fits the transcription into the remaining run time (and maxMinutesPerItem): the transcript is cut, truncated: true and truncatedReason are set on the record, and only the transcribed minutes are billed. Raise the run timeout (Settings → Timeout, 3600 s recommended for long audio) for full-length transcripts.

Q: What happens to a URL that cannot be downloaded? A: You get an error record for that URL (_dataQuality: "error", errorCode: MEDIA_UNAVAILABLE, BLOCKED, DOWNLOAD_TIMEOUT, TRANSCRIPTION_FAILED, COOKIES_REJECTED, RUN_TIME_BUDGET) — never charged — and the other URLs in the batch still run.

Q: What about accuracy? A: base is a good default; switch to small for higher accuracy on tough audio.

💰 Pricing

Pay-per-event: $0.015 per minute transcribed + Apify platform usage. Examples (event price only): 5 min = $0.075 · 30 min = $0.45 · 60 min = $0.90. Platform usage (compute/proxy) is billed separately by Apify at standard rates.

📝 Changelog

  • v1.3.1 (2026-09-02) — a run only fails when something is genuinely broken. A source answering "this is a livestream", "members-only", "still processing" or "log in first" now returns a labelled error item and succeeds with nothing charged, instead of failing the run. Real extractor drift still fails, and the fatal yt-dlp line is no longer truncated mid-message.
  • v1.2.0 (2026-08-29) — Only the audio you pay for is downloaded. The actor now probes the media first, picks a ≤70 kbps audio stream and, for long sources, fetches only the bytes that cover maxMinutesPerItem (or your max charge / remaining run time) — a 19-minute YouTube video capped at 1 minute moves 1.2 MB instead of 17.8 MB. Items cut this way carry truncated: true, truncatedReason and sourceDurationSeconds.
  • v1.1 (2026-08) — per-stage time budgets, maxMinutesPerItem enforced, billing right after each item, honest terminal status.
  • v1.0 — local Whisper (faster-whisper) transcription; text + segments + SRT; per-minute pricing.

🇧🇷 Português

$0.015 por minuto transcrito (+ uso de plataforma Apify) · 🔒 sem chave de API · 🌍 qualquer idioma (detecção automática) · 📝 texto + SRT + timestamps 🇺🇸 English · 🇧🇷 Português

Transcreva áudio em texto com o Whisper rodando localmente no Actor (faster-whisper) — sem API externa, sem chave, sem rate limit. Passe qualquer URL de mídia — podcast, TikTok, Instagram, YouTube, SoundCloud ou um link direto de arquivo de áudio — e receba texto, segmentos com timestamps, legendas SRT e idioma detectado. O áudio é extraído automaticamente também de links de vídeo.

Para quem é: podcasters e times de conteúdo, jornalistas, pesquisadores, times de acessibilidade/SEO e desenvolvedores que constroem busca ou resumo sobre áudio falado.

▶️ Clique em Testar grátis — sua primeira execução retorna uma transcrição real em segundos.

✨ Recursos

  • 🎯 Transcrição Whisper real (não só legendas) — funciona em áudio sem legendas.
  • 🌍 99+ idiomas, detectados automaticamente (ou force com language).
  • 🔗 Qualquer origem — redes sociais, hosts de podcast ou link direto de arquivo.
  • 📝 Saída rica — texto completo, segmentos com tempo, SRT pronto, contagem de palavras, idioma.
  • 🔒 Autossuficiente — o Whisper roda no container; você nunca precisa de chave de API.
  • 💸 Preço justo — pague por minuto de áudio realmente transcrito.

💰 Preço

Pay-per-event: $0.015 por minuto transcrito + uso de plataforma Apify. Exemplos (só o evento): 5 min = $0.075 · 30 min = $0.45 · 60 min = $0.90. O uso de plataforma (compute/proxy) é cobrado à parte pela Apify nas tarifas padrão.

❓ FAQ

P: Preciso de chave de API? R: Não. O Whisper roda dentro do Actor — você só fornece URLs.

P: Como é cobrado? R: $0.015 por minuto de áudio transcrito (arredondado por item), mais o uso de plataforma Apify do run (compute e proxy, nas tarifas padrão, visível no seu run). Um podcast de 10 min = $0.15 + uso. Cada item é cobrado logo após ser entregue — um run que para antes do fim cobra só o que você recebeu.

P: E se o áudio for maior do que o run consegue processar? R: O Actor ajusta a transcrição ao tempo restante do run (e ao maxMinutesPerItem): o texto é cortado, o registro recebe truncated: true e truncatedReason, e só os minutos transcritos são cobrados. Aumente o timeout do run (Settings → Timeout; 3600 s para áudios longos) para transcrições completas.

Built here — o que o bot-gate do YouTube faz, com as duas medições: o YouTube responde parte das requisições com "Sign in to confirm you're not a bot", e faz isso por IP de saída, não por vídeo. A taxa não é estável, e medimos duas vezes no mesmo vídeo sobre RESIDENTIAL da Apify:

DataCondiçãoResultado
2026-08-048 itens, download completo6/8 — os dois barrados eram vídeos longos
2026-08-308 itens, busca parcial8/8, nenhum gate

Não tome nenhum dos dois como a taxa que você vai ter. O que vale nos dois é o mecanismo: URL barrada num IP passa no seguinte. Desde a 1.2.1 o item barrado é retentado em sessão residencial nova, até 3 tentativas. Quase não gasta proxy — o gate dispara na sondagem (yt-dlp --skip-download), antes de baixar mídia. Só o gate confirmado é retentado; vídeo removido falha na primeira. Quando todas as tentativas são barradas você recebe um registro BLOCKED dizendo em quantos IPs tentou, e nada é cobrado.

Não recorra a youtubeCookies primeiro — medido em 2026-08-30. Par controlado, mesmo vídeo, mesmo proxy, 8 itens cada, minutos de diferença: sem cookie, 8/8 transcritos; com um cookies.txt de sessão logada, 0/8 — todos falharam com "The page needs to be reloaded." e a execução terminou FAILED. O arquivo era aceito pelo YouTube como sessão ("LOGGED_IN":true), mas faltavam os cookies HttpOnly __Secure-1PSID, __Secure-3PSID, HSID e SSID, porque a extensão usada só lia document.cookie. Sessão pela metade quebra a requisição do player — pior que não mandar nada.

Deixe youtubeCookies vazio a menos que o acesso anônimo esteja falhando para você. Se usar, o export precisa incluir os HttpOnly; arquivo ruim agora devolve COOKIES_REJECTED nomeando a causa.

P: O que acontece com uma URL que não baixa? R: Você recebe um registro de erro para aquela URL (_dataQuality: "error", errorCode: MEDIA_UNAVAILABLE, BLOCKED, DOWNLOAD_TIMEOUT, TRANSCRIPTION_FAILED, COOKIES_REJECTED, RUN_TIME_BUDGET) — nunca cobrado — e as demais URLs do lote continuam.

📝 Changelog

  • v1.0 — transcrição local com Whisper (faster-whisper); texto + segmentos + SRT; preço por minuto.