# Speech to Text: Audio, Video & Podcast Transcriber (Whisper) (`best_apis/speech-to-text-whisper`) Actor

Transcribe audio and video files, podcast RSS feeds and Apple Podcasts episodes to text with Whisper, no API key: full text, timestamped segments, word timings, SRT and VTT subtitles, 99 languages, translation to English. From $0.002 per audio minute.

- **URL**: https://apify.com/best_apis/speech-to-text-whisper.md
- **Developed by:** [A Q](https://apify.com/best_apis) (community)
- **Categories:** AI, Videos, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Speech to Text: Audio, Video & Podcast Transcriber (Whisper)

Transcribe **audio files, video files, podcast RSS feeds and Apple Podcasts episodes** to text in bulk with **OpenAI's open-source Whisper model**, running inside the Actor. No OpenAI key, no outside API, and your audio is never sent to a third-party service.

- **Any media link**: MP3, M4A, AAC, WAV, FLAC, OGG, OPUS, WMA, AMR, MP4, MOV, MKV, WEBM, AVI, 3GP and HLS streams (`.m3u8`). Video files are fine; only the audio track is used
- **Podcasts built in**: paste a **podcast RSS feed** or an **Apple Podcasts show or episode link** and the newest episodes are found and transcribed, with episode title, show name and publish date
- **99 languages** with automatic language detection per file, or set the language yourself
- **Translate to English** from any supported language in the same pass
- **Full transcript** plus **timestamped segments** (start, end, confidence), optional **word-level timestamps**, and ready-made **SRT and WebVTT subtitles**
- **Three Whisper models**: Tiny (fastest), Base (default, good for podcasts and talks) and Small (best for accents, noisy audio and non-English speech)
- **Vocabulary hint** to spell names, brands and jargon correctly
- **Silence and music skipping** (voice activity detection) for faster runs and fewer hallucinated lines
- **Long files** (multi-hour podcasts, lectures, meetings) are streamed and transcribed in windows split at natural pauses
- **Silent files and failed downloads are free**, and each failure is listed with its reason
- Works with the **[Apple Podcasts Scraper](https://apify.com/best_apis/apple-podcasts-scraper)** and **[RSS Feed Reader](https://apify.com/best_apis/rss-feed-reader)**: pass their dataset ID to transcribe every episode they found

### Pricing: from $0.002 per audio minute

| | This Actor | Other Whisper Actors on Apify |
|---|---|---|
| Tiny model | **$0.002 / min** ($0.12 per hour) | – |
| Base model (default) | **$0.004 / min** ($0.24 per hour) | $0.007 to $0.05 / min |
| Small model | **$0.012 / min** ($0.72 per hour) | $0.016 / min and up |
| Per-file or start fees | **none** (only $0.0005 per GB at run start) | up to $0.005 per file |
| Silent files, failed URLs | **free** | often charged |

You pay per started minute of audio actually transcribed (with a 1-second grace). A 45-minute podcast episode costs **$0.18** with Base; 100 hours of audio costs **$24**. Use **Max minutes per file** for cheap previews and set a maximum cost per run in Apify: the run stops cleanly at your limit, trimming the last file if needed.

### Use cases

- **Podcast transcripts** for show notes, SEO pages, blog posts, newsletters and quotes
- **Subtitles and captions** (SRT / VTT) for videos, courses and social clips
- **AI and RAG pipelines**: turn audio libraries into searchable text for ChatGPT, Claude, LangChain or a vector database
- **Media monitoring and research**: track what podcasts and broadcasters say about a brand, topic or competitor
- **Meetings, interviews, lectures and webinars** stored as files or on a public link
- **Translation**: English text from Spanish, German, French, Arabic, Hindi, Japanese and 90+ other languages

### Input

| Field | What it does |
|---|---|
| `urls` | Media links, podcast RSS feeds or Apple Podcasts links. Empty input transcribes an 11-second sample |
| `maxEpisodesPerFeed` | Newest episodes per feed or show (default 3) |
| `model` | `base` (default), `tiny` or `small` |
| `language` | ISO code (`en`, `de`, `es`, `ar`...); empty = auto-detect |
| `translateToEnglish` | English translation instead of the original language |
| `maxMinutesPerFile` | Only the first N minutes of each file (0 = all) |
| `vocabulary` | Names and terms to spell correctly |
| `includeSegments`, `includeSrt`, `includeVtt`, `includeWords` | Choose the output detail |
| `skipSilence` | Voice activity detection (on by default) |
| `accurate` | Beam search for slightly better accuracy (about 2x slower, same price) |
| `datasetId`, `urlField` | Read media URLs from a dataset (`audioUrl`, `enclosureUrl`, `mediaUrl`, `episodeUrl`, `url` are detected) |

```json
{
  "urls": [
    "https://feeds.npr.org/510289/podcast.xml",
    "https://podcasts.apple.com/us/podcast/the-daily/id1200361736"
  ],
  "maxEpisodesPerFeed": 2,
  "model": "base",
  "includeSrt": true
}
```

### Output

One row per media file:

```json
{
  "status": "ok",
  "title": "The history of light (classic)",
  "podcast": "Planet Money",
  "published": "Wed, 04 Nov 2026 08:00:00 +0000",
  "mediaUrl": "https://.../episode.mp3",
  "feedUrl": "https://feeds.npr.org/510289/podcast.xml",
  "model": "base",
  "language": "en",
  "languageProbability": 0.999,
  "durationSec": 1503.2,
  "speechSec": 1471.9,
  "wordCount": 4120,
  "chargedMinutes": 26,
  "processingSec": 131.4,
  "text": "This message comes from ... ",
  "segments": [{ "start": 0.0, "end": 6.64, "text": "This message comes from ...", "avgLogprob": -0.21, "noSpeechProb": 0.01 }],
  "srt": "1\n00:00:00,000 --> 00:00:06,640\nThis message comes from ...\n"
}
```

Rows with `status` `error` (unreachable link, no audio track) or `no-speech` are free. A `SUMMARY` record in the key-value store has file, minute and error counts.

### Speed and memory

Whisper runs on CPU. On the default 4 GB (one CPU core), Base transcribes about **11 minutes of audio per minute**, Tiny about twice as fast, Small about 3.5x real time. More memory adds CPU cores and speeds up each file; the price per audio minute stays the same.

### Supported sources and limits

- Public, directly downloadable media files and HLS streams, public podcast RSS feeds, and Apple Podcasts shows and episodes (via their public RSS feed)
- Not supported: DRM-protected audio (Spotify, Audible), pages that need a login, and video platforms such as YouTube or TikTok. For YouTube use the [YouTube Transcript Scraper](https://apify.com/best_apis/youtube-transcript-scraper)
- Speaker labels (diarization) are not included
- Only transcribe media you have the right to process

### FAQ

**Is this the same Whisper as the OpenAI API?** It is the same open-source Whisper model family (tiny, base, small), run locally with the CTranslate2 engine in 8-bit mode. Results match the original models closely, and no data leaves the Apify platform.

**How accurate is it?** Base is reliable for clear speech such as podcasts, audiobooks and talks. For heavy accents, background noise, phone audio or non-English speech choose Small, and add a vocabulary hint for names.

**Can I transcribe a whole podcast archive?** Yes: set `maxEpisodesPerFeed` up to 1,000, or scrape episode URLs with the Apple Podcasts Scraper and pass its dataset ID. Files are downloaded and decoded in parallel with transcription.

**What if a link fails?** The row is pushed with `status: "error"` and the reason, and you are not charged.

# Actor input Schema

## `urls` (type: `array`):

Direct media links (MP3, M4A, WAV, FLAC, OGG, OPUS, MP4, MOV, WEBM, MKV, HLS .m3u8 and more), podcast RSS feed URLs, or Apple Podcasts show / episode links (https://podcasts.apple.com/.../id123?i=456). Feeds and shows expand to their newest episodes. Empty input transcribes an 11-second sample.

## `maxEpisodesPerFeed` (type: `integer`):

How many of the newest episodes to transcribe for each podcast feed or Apple Podcasts show.

## `model` (type: `string`):

Multilingual Whisper models run locally (CTranslate2 int8). Base suits clear speech such as podcasts and talks; Small is better for accents, noise and non-English audio.

## `language` (type: `string`):

ISO 639-1 code such as en, de, es, fr, ar, hi, ja. Leave empty to auto-detect per file (99 languages).

## `translateToEnglish` (type: `boolean`):

Output an English translation instead of the original-language transcript.

## `maxMinutesPerFile` (type: `integer`):

Transcribe only the first N minutes of each file (0 = whole file). Useful for previews and cost control; you pay only for what is transcribed.

## `vocabulary` (type: `string`):

Optional names, brands or jargon to spell correctly, e.g. "Apify, Kubernetes, Dr. Nguyen". Passed to Whisper as the initial prompt.

## `includeSegments` (type: `boolean`):

Add segments with start/end seconds, text and confidence.

## `includeSrt` (type: `boolean`):

Add an SRT subtitle file as a string.

## `includeVtt` (type: `boolean`):

Add a WebVTT subtitle file as a string.

## `includeWords` (type: `boolean`):

Add every word with start/end time and probability (slightly slower).

## `skipSilence` (type: `boolean`):

Voice-activity detection skips long non-speech parts: faster, and fewer hallucinated lines.

## `accurate` (type: `boolean`):

Use beam search (5) instead of greedy decoding. Same price.

## `datasetId` (type: `string`):

Read media URLs from a dataset, e.g. the episodes output of an Apple Podcasts or RSS scraper. Fields checked: audioUrl, enclosureUrl, mediaUrl, episodeUrl, url, enclosure.url.

## `urlField` (type: `string`):

Custom field name holding the media URL (optional).

## Actor input object example

```json
{
  "urls": [
    "https://raw.githubusercontent.com/ggml-org/whisper.cpp/master/samples/jfk.wav"
  ],
  "maxEpisodesPerFeed": 3,
  "model": "base",
  "language": "",
  "translateToEnglish": false,
  "maxMinutesPerFile": 0,
  "includeSegments": true,
  "includeSrt": true,
  "includeVtt": false,
  "includeWords": false,
  "skipSilence": true,
  "accurate": false
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `full` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "https://raw.githubusercontent.com/ggml-org/whisper.cpp/master/samples/jfk.wav"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("best_apis/speech-to-text-whisper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "urls": ["https://raw.githubusercontent.com/ggml-org/whisper.cpp/master/samples/jfk.wav"] }

# Run the Actor and wait for it to finish
run = client.actor("best_apis/speech-to-text-whisper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://raw.githubusercontent.com/ggml-org/whisper.cpp/master/samples/jfk.wav"
  ]
}' |
apify call best_apis/speech-to-text-whisper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,best_apis/speech-to-text-whisper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/T9izidfkFnZgoCS7j/builds/8iVBpcEVhzDdR2V0j/openapi.json
