# Audio & Podcast Transcription - Whisper (Bulk), $6/1K Minutes (`plotpointtech/audio-podcast-transcription-whisper`) Actor

Transcribe audio, video and podcast RSS episodes to text with open-source Whisper: full transcript, timestamps, language detection and SRT/VTT subtitles. $0.006 per audio minute ($6 per 1,000), no API key needed, or bring your OpenAI key.

- **URL**: https://apify.com/plotpointtech/audio-podcast-transcription-whisper.md
- **Developed by:** [Plot Point Technologies](https://apify.com/plotpointtech) (community)
- **Categories:** AI, Automation, Videos
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.50 / 1,000 audio minute (whisper tiny/base)s

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Audio & Podcast Transcription - Whisper (Bulk)

Turn audio files, video files and podcast episodes into searchable text with timestamps and subtitles. Paste direct file links or podcast RSS feeds, pick a Whisper model, and get one clean result per file: full transcript, timestamped segments, detected language and optional SRT/VTT subtitles. **$6 per 1,000 audio minutes** (base model), no API key needed.

### What it does

- **Transcribes files you supply**: direct links to MP3, M4A, WAV, FLAC, OGG, OPUS, AAC, MP4, MOV, WEBM, MKV and most other formats ffmpeg can read.
- **Transcribes podcast feeds**: give any podcast RSS feed and it picks the latest N episodes from their audio enclosures. Episode title, publish date, episode page and podcast name are added to each result.
- **Transcribes uploaded files**: point it at an Apify key-value store with your files.
- **Runs open-source Whisper** (faster-whisper, int8) on Apify. Choose `tiny` (fastest), `base` (default) or `small` (most accurate). Audio is processed inside the run; nothing is sent to a third party.
- **Optional OpenAI engine**: use your own OpenAI API key (`whisper-1` or the `gpt-4o` transcribe models). OpenAI bills you directly; this tool charges a small per-minute handling fee.
- **Handles long files**: audio is processed in 10-minute pieces, so multi-hour recordings work. A per-file length limit protects your budget, and one bad file never fails the whole run.
- Auto-detects the language (99 languages) or uses the one you set, and can translate speech to English.

**Not supported:** YouTube, TikTok, Instagram, Vimeo, Spotify, SoundCloud and other platform pages. Their terms do not allow downloading, so this tool only accepts direct media file links and podcast RSS enclosures that publishers offer for download.

### Use cases

- **Podcast producers and networks**: show notes, searchable archives, blog posts and accessibility transcripts for every episode.
- **Media monitoring and research**: transcribe the latest episodes of many shows and search or analyze the text.
- **Content and SEO teams**: turn webinars, interviews and recorded talks into articles and quotes.
- **Video editors**: SRT/VTT subtitles for MP4 files you host.
- **AI and RAG pipelines**: feed timestamped transcripts into search, summarization or chat-with-your-audio apps.

### How to use

1. Add **audio or video file URLs**, **podcast RSS feeds**, or a **key-value store** with uploaded files.
2. Pick the **engine** and **model**. `base` is a good default for clear English speech; use `small` for accents, noisy audio or other languages.
3. Optionally set the **language**, turn on **SRT/VTT subtitles**, and set **max minutes per file**.
4. Click **Start**. Results appear in the **Output** tab and can be downloaded as JSON, CSV or Excel.

Recommended memory: **4 GB** (default). 8 GB runs the tiny and base models about twice as fast. 2 GB is enough for the OpenAI engine.

### Input example

```json
{
  "rssFeeds": ["https://www.nasa.gov/feeds/podcasts/houston-we-have-a-podcast"],
  "episodesPerFeed": 3,
  "mediaUrls": [{"url": "https://www.nasa.gov/wp-content/uploads/2015/01/590331main_ringtone_smallStep.mp3"}],
  "engine": "local",
  "model": "base",
  "language": "",
  "outputSrt": true,
  "maxDurationMinutes": 120
}
```

| Field | Description |
|---|---|
| `mediaUrls` | Direct links to audio/video files |
| `rssFeeds` | Podcast RSS/Atom feed URLs |
| `episodesPerFeed` | Newest episodes to transcribe per feed (default 3) |
| `keyValueStoreId`, `keyPrefix` | Transcribe files stored in an Apify key-value store |
| `engine` | `local` (Whisper on Apify) or `openai` (your own key) |
| `model` | `tiny`, `base` (default) or `small` |
| `openaiModel`, `openaiApiKey` | For the OpenAI engine |
| `language` | Empty = auto-detect, or an ISO code such as `en`, `es`, `de` |
| `translateToEnglish` | Output English translation instead of the original language |
| `includeSegments`, `outputSrt`, `outputVtt`, `wordTimestamps` | Output options |
| `maxDurationMinutes`, `whenTooLong` | Per-file limit (default 120 min): transcribe the first part, or skip the file |
| `maxFiles` | Stop after this many files |
| `vocabularyPrompt` | Names and jargon to help spelling |
| `skipSilence`, `beamSize` | Speed/accuracy tuning for the local engine |

### Output example

Real result from the default run (a 13-second NASA Apollo 11 clip, Whisper base):

```json
{
  "sourceUrl": "https://www.nasa.gov/wp-content/uploads/2015/01/590331main_ringtone_smallStep.mp3",
  "sourceType": "url",
  "title": "590331main_ringtone_smallStep.mp3",
  "engine": "local",
  "model": "base",
  "durationSeconds": 12.95,
  "status": "ok",
  "language": "en",
  "languageProbability": 0.877,
  "task": "transcribe",
  "transcribedSeconds": 12.95,
  "billedMinutes": 1,
  "truncated": false,
  "text": "I'm gonna step off the land now. It's one small step for man, one by a lead for man, time.",
  "wordCount": 20,
  "segmentCount": 2,
  "processingSeconds": 2.9,
  "transcribeSeconds": 2.2,
  "speedVsRealtime": 6,
  "segments": [
    {
      "start": 0,
      "end": 2,
      "text": "I'm gonna step off the land now."
    },
    {
      "start": 2,
      "end": 12.94,
      "text": "It's one small step for man, one by a lead for man, time."
    }
  ]
}
```

Podcast results also include `feedTitle`, `feedUrl`, `episodeUrl`, `published` and `feedDuration`. With subtitles on you get `srt` and `vtt` text fields ready to save as files. Files that fail (404, not a media file, platform page) are returned with `"status": "error"` and an `error` message, and are **not charged**.

Main fields: `sourceUrl`, `title`, `durationSeconds`, `language`, `languageProbability`, `text`, `segments` (start/end in seconds + text), `wordCount`, `billedMinutes`, `truncated`, `speedVsRealtime`, `status`, `error`.

### Pricing

Pay per audio minute, rounded up per file (a 12-second clip is 1 minute, a 59 min 45 s episode is 60 minutes). Failed and skipped files are free.

| Engine / model | Price per audio minute | Per hour of audio |
|---|---|---|
| Whisper tiny or base on Apify | $0.006 | $0.36 |
| Whisper small on Apify | $0.016 | $0.96 |
| OpenAI engine with your own key | $0.003 handling fee + OpenAI's own charge | $0.18 + OpenAI |

Worked examples:

- 10 podcast episodes of 45 minutes with `base`: 450 minutes = **$2.70**.
- 200 short voice clips under one minute each: 200 minutes = **$1.20**.
- A 3-hour conference recording with `small`: 180 minutes = **$2.88**.

Volume discounts on higher Apify plans. Set a **maximum cost per run** in the run options; the tool trims the last file to fit and stops when the limit is reached.

### FAQ

**Is this legal?** Transcribe only audio you own or are allowed to use. Podcast publishers offer RSS enclosures for download, and many organizations publish public-domain audio. The tool does not download from YouTube, social networks or streaming platforms because their terms forbid it. Transcripts of copyrighted shows are for your own analysis; republishing them may need the rights holder's permission.

**How accurate is it?** `base` is good on clear English speech such as interviews and podcasts. `small` is noticeably better on accents, crosstalk, noisy recordings and non-English audio. Names and rare terms can be misspelled; add them to the vocabulary hint. Very old or low-quality recordings will have more errors with any model.

**How fast is it?** Measured on Apify with a 60-minute podcast: base at 8 GB about 17-28x real time (an hour of audio in 2-4 minutes); base at 4 GB about 11x; small at 4 GB about 3.6x; tiny at 8 GB over 60x.

**Does it identify speakers?** No, there are no speaker labels in this version.

**Can I use it through the API?** Yes. Call it with the Apify API or the Python/JavaScript clients and read the dataset. It also works in Make, Zapier and n8n through the Apify integrations, and AI agents can call it through the Apify MCP server.

**Where does my audio go?** With the local engine, audio is downloaded into the run's temporary storage, transcribed there and deleted. With the OpenAI engine, audio is sent to OpenAI under your own account.

### Related tools from Plot Point Technologies

- [Podcast Scraper - Apple Podcasts, Owner Emails & Episodes](https://apify.com/plotpointtech/podcast-search-episodes-scraper): find podcasts and their RSS feeds, then transcribe the episodes here.
- [RSS Feed Reader & Monitor - Any Feed to JSON](https://apify.com/plotpointtech/rss-feed-reader-monitor): watch feeds for new items.
- [PDF to Text & Tables Extractor](https://apify.com/plotpointtech/pdf-text-markdown-tables-extractor): text and tables from PDFs.
- [Image OCR - Image to Text in Bulk](https://apify.com/plotpointtech/image-to-text-ocr-bulk): text from images and screenshots.

Plot Point Technologies is not affiliated with OpenAI, NASA, or any podcast publisher. Whisper is an open-source model released by OpenAI; this tool uses the faster-whisper implementation.

***

If this tool saved you time, we would be grateful for a short review on this page; it helps other people find it. If something did not work as expected, please open an issue on the **Issues** tab and we will look into it quickly.

# Actor input Schema

## `mediaUrls` (type: `array`):

Direct links to media files (MP3, M4A, WAV, FLAC, OGG, OPUS, AAC, MP4, MOV, WEBM, MKV...). One result per file. YouTube, TikTok, Instagram, Vimeo, Spotify and other platform pages are NOT supported.

## `rssFeeds` (type: `array`):

Podcast RSS/Atom feed URLs. The latest episodes' audio enclosures are transcribed; episode title, date and feed title are added to each result.

## `episodesPerFeed` (type: `integer`):

How many of the newest episodes to transcribe from each feed.

## `keyValueStoreId` (type: `string`):

Transcribe media files stored in an Apify key-value store (for example files you uploaded). Pick the store or paste its ID.

## `keyPrefix` (type: `string`):

Only use key-value store records whose key starts with this text.

## `engine` (type: `string`):

Local runs open-source faster-whisper on the run's CPU. OpenAI sends audio to OpenAI with your key: OpenAI bills you directly and this Actor charges only a small per-minute fee.

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

Bigger models are more accurate, especially for accents and non-English audio, but slower. The price per minute is the same.

## `openaiModel` (type: `string`):

whisper-1 returns timestamped segments. The gpt-4o models return text only (one segment per 10-minute chunk).

## `openaiApiKey` (type: `string`):

Required only for the OpenAI engine. Stored encrypted, never logged.

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

Leave empty to auto-detect, or force a language with its ISO 639-1 code (en, es, de, fr, pt, ja...). Forcing the language improves accuracy on short or noisy files.

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

Output an English translation instead of the original-language transcript (Whisper translate task).

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

Each phrase with start and end time in seconds.

## `outputSrt` (type: `boolean`):

Add an SRT subtitle file as text to each result.

## `outputVtt` (type: `boolean`):

Add a WebVTT subtitle file as text to each result.

## `wordTimestamps` (type: `boolean`):

Add every word with its time to each segment. About 20-40% slower and much larger output.

## `maxDurationMinutes` (type: `integer`):

Protects your budget on very long files. What happens to longer files is set below.

## `whenTooLong` (type: `string`):

Choose whether to transcribe the beginning or skip over-long files.

## `maxFiles` (type: `integer`):

Stop after this many files. 0 means no limit.

## `vocabularyPrompt` (type: `string`):

Optional names, jargon or spellings to guide the model, e.g. 'Plot Point Technologies, Apify, Kubernetes'.

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

Skips long silent stretches and music-only parts (local engine). Faster and avoids made-up text in silence. You are billed by file length either way.

## `beamSize` (type: `integer`):

1 = fast greedy decoding. 5 = slightly more accurate, about 2x slower.

## Actor input object example

```json
{
  "mediaUrls": [
    {
      "url": "https://www.nasa.gov/wp-content/uploads/2015/01/590331main_ringtone_smallStep.mp3"
    }
  ],
  "episodesPerFeed": 3,
  "engine": "local",
  "model": "base",
  "openaiModel": "whisper-1",
  "language": "",
  "translateToEnglish": false,
  "includeSegments": true,
  "outputSrt": false,
  "outputVtt": false,
  "wordTimestamps": false,
  "maxDurationMinutes": 120,
  "whenTooLong": "truncate",
  "maxFiles": 0,
  "skipSilence": true,
  "beamSize": 1
}
```

# Actor output Schema

## `results` (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 = {
    "mediaUrls": [
        {
            "url": "https://www.nasa.gov/wp-content/uploads/2015/01/590331main_ringtone_smallStep.mp3"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("plotpointtech/audio-podcast-transcription-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 = { "mediaUrls": [{ "url": "https://www.nasa.gov/wp-content/uploads/2015/01/590331main_ringtone_smallStep.mp3" }] }

# Run the Actor and wait for it to finish
run = client.actor("plotpointtech/audio-podcast-transcription-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 '{
  "mediaUrls": [
    {
      "url": "https://www.nasa.gov/wp-content/uploads/2015/01/590331main_ringtone_smallStep.mp3"
    }
  ]
}' |
apify call plotpointtech/audio-podcast-transcription-whisper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,plotpointtech/audio-podcast-transcription-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/scfGqgrdFs5ztCSj2/builds/dMdtAMAGWonjVNZVs/openapi.json
