# Audio & Video Transcriber – Whisper Speech to Text, SRT, VTT (`pinkish_armada/audio-transcriber`) Actor

Transcribe audio and video files and podcast RSS feeds with Whisper: 99 languages, translation to English, timestamps, SRT/VTT subtitles, word timings and paragraphs. $0.006 per minute.

- **URL**: https://apify.com/pinkish_armada/audio-transcriber.md
- **Developed by:** [Phuc Tiet](https://apify.com/pinkish_armada) (community)
- **Categories:** AI, Videos
- **Stats:** 2 total users, 1 monthly users, 90.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 transcribed minutes

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

## Audio & Video Transcriber – Whisper Speech to Text, SRT & VTT

Turn **audio and video files** and **podcast RSS feeds** into accurate text, with timestamps and ready-made **SRT / VTT subtitles**. The open-source **OpenAI Whisper** model runs *inside* the Actor (via faster-whisper), so your audio is never sent to a third-party API.

- 🎙️ **Any audio or video file:** MP3, M4A, AAC, WAV, OGG, OPUS, FLAC, MP4, MOV, WEBM, MKV, AVI and more (the audio track is extracted automatically).
- 📻 **Podcast feeds:** paste an RSS feed URL and the newest episodes are transcribed, with episode title, date and GUID.
- 🌍 **99 languages** with automatic language detection, or **translate** any language to English.
- ⏱️ **Timestamped segments**, optional **word-level timestamps**, and **SRT/VTT files** for YouTube uploads, video editors and accessibility.
- 🤖 **Made for AI pipelines.** Clean paragraph text for LLMs, RAG, summarisation, show notes, meeting minutes and search indexing. Easy to call from AI agents via the Apify API/MCP.
- 💸 **From $0.006 per audio minute** ($0.36/hour), billed only for files that were transcribed.

### How to use

1. Add one or more **direct media URLs** (e.g. `https://example.com/episode-12.mp3`) or **podcast RSS feed URLs**.
2. Pick a model: **base** (fast, great for clear speech) or **small** (more accurate for accents, noise and non-English).
3. Run. Each file becomes one dataset row; subtitles are saved to the key-value store.

```json
{
  "mediaUrls": [
    "https://upload.wikimedia.org/wikipedia/commons/c/c4/GWBush_Oval_Office_Address_20010911-1-.ogg",
    "https://feeds.npr.org/510289/podcast.xml"
  ],
  "model": "base",
  "maxEpisodesPerFeed": 2
}
```

#### Input options

| Field | Default | What it does |
|---|---|---|
| `mediaUrls` | – | Audio/video file URLs or podcast RSS feeds (required) |
| `model` | `base` | `base` = fast, `small` = more accurate |
| `language` | auto | ISO code (`en`, `de`, `es`, `ja`...) or empty to detect |
| `task` | `transcribe` | `translate` outputs English for non-English speech |
| `maxEpisodesPerFeed` | 3 | Newest episodes taken from each RSS feed |
| `includeSegments` | true | Timestamped segments in the output |
| `saveSubtitles` | true | Save `.srt` and `.vtt` files |
| `wordTimestamps` | false | Per-word timing and confidence |
| `skipSilence` | true | Voice-activity detection skips silence/music (fewer hallucinations) |
| `maxDurationMinutes` | 180 | Longer files are skipped, not charged |
| `maxFileSizeMb` | 500 | Larger downloads are stopped, not charged |

### Output

```json
{
  "url": "https://upload.wikimedia.org/.../GWBush_Oval_Office_Address_20010911-1-.ogg",
  "status": "ok",
  "model": "base",
  "language": "en",
  "languageProbability": 0.992,
  "durationSeconds": 262.1,
  "billedMinutes": 5,
  "wordCount": 592,
  "text": "Good evening. Today, our fellow citizens, our way of life, our very freedom, came under attack...",
  "srtUrl": "https://api.apify.com/v2/key-value-stores/.../records/transcript-1.srt",
  "vttUrl": "https://api.apify.com/v2/key-value-stores/.../records/transcript-1.vtt",
  "segments": [ { "start": 0.0, "end": 6.4, "text": "Good evening." } ]
}
```

Podcast episodes also include `podcastTitle`, `episodeTitle`, `episodePublished`, `episodeGuid` and `episodeLink`. Failed files have `status: "error"` with an `errorCode` (`HTTP_404`, `NOT_MEDIA`, `UNSUPPORTED_MEDIA`, `TOO_LONG`, `TOO_LARGE`, `PLATFORM_NOT_SUPPORTED`...) and are **not charged**. A run summary is saved as `OUTPUT`.

### Pricing

Pay per event, plus a tiny Actor start fee ($0.00005 per GB of memory):

| Model | Price per audio minute | Per hour of audio |
|---|---|---|
| **base** (fast) | **$0.006** | $0.36 |
| **small** (more accurate) | **$0.014** | $0.84 |

- Billed per started minute of each successfully transcribed file (a 4 min 22 s file = 5 minutes).
- Compute is included, with no separate platform usage charge for the transcription.
- Failed downloads, unsupported files, files over your limits and refused links are **free**.
- If you set a maximum cost per run, files that would exceed it are skipped before transcription.

For comparison, transcription Actors on the Store typically charge $0.01–$0.05 per audio minute.

### Accuracy and speed (honest)

- On clear speech, **base** is close to human-quality for English. **small** is clearly better for accents, crosstalk, background noise and most non-English languages.
- Typical processing on the default 4 GB memory: **base ≈ 6 s per audio minute**, **small ≈ 17 s per audio minute**. Increase memory to 8–16 GB for faster runs on long files (more CPU cores; same price).
- **Not included:** speaker diarisation (who said what), and live/streaming audio.

### Supported sources, and what is not supported

- ✅ Direct file links on your own server, cloud storage (S3/GCS/Dropbox direct links), CDNs, and podcast hosting enclosures.
- ❌ Pages on YouTube, TikTok, Instagram, Facebook, X, Vimeo, Spotify, SoundCloud and similar platforms. Their terms do not allow automated media downloads, so these links are refused with `PLATFORM_NOT_SUPPORTED`.
- Only transcribe media you own or have the right to process.

### FAQ

**Is my audio sent to OpenAI or another API?** No. The Whisper model runs inside the Apify container, and files are deleted after processing.

**Can I get subtitles for a video?** Yes. Pass the video file URL; `srtUrl`/`vttUrl` link to subtitle files you can download or attach.

**Can it run on a schedule for a podcast?** Yes. Use an Apify Schedule with your feed URL and `maxEpisodesPerFeed: 1` to transcribe each new episode.

**Which Whisper models?** `base` and `small` (MIT licence), int8 quantised CTranslate2 builds via faster-whisper.

# Actor input Schema

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

Direct links to audio or video files (MP3, M4A, WAV, OGG, OPUS, FLAC, MP4, MOV, WEBM, MKV...) or podcast RSS feed URLs (the newest episodes are transcribed). Links to YouTube, TikTok, Instagram, Facebook, X, Vimeo, Spotify or SoundCloud pages are refused because those platforms do not allow automated downloads.

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

<b>base</b>: fast and cheap, very good for clear English speech. <b>small</b>: noticeably more accurate, especially for accents, noisy audio and non-English languages (priced higher, about 3-4x the compute).

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

ISO 639-1 code of the spoken language (e.g. en, de, es, fr, ja). Leave empty to auto-detect.

## `task` (type: `string`):

<b>transcribe</b>: text in the spoken language. <b>translate</b>: English translation of non-English speech.

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

For RSS feed URLs: how many of the newest episodes to transcribe.

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

Add a segments array (start, end, text) to each result.

## `saveSubtitles` (type: `boolean`):

Save .srt and .vtt files to the key-value store and link them from each result (srtUrl, vttUrl).

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

Add per-word start/end times and confidence inside each segment (slower).

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

Skip long silent or music-only parts before transcribing. Reduces hallucinated text on silence.

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

Longer files are skipped with error TOO_LONG and not charged.

## `maxFileSizeMb` (type: `integer`):

Larger downloads are stopped with error TOO_LARGE (not charged).

## `requestTimeoutSecs` (type: `integer`):

Network timeout for each download request.

## Actor input object example

```json
{
  "mediaUrls": [
    "https://upload.wikimedia.org/wikipedia/commons/c/c4/GWBush_Oval_Office_Address_20010911-1-.ogg"
  ],
  "model": "base",
  "language": "",
  "task": "transcribe",
  "maxEpisodesPerFeed": 3,
  "includeSegments": true,
  "saveSubtitles": true,
  "wordTimestamps": false,
  "skipSilence": true,
  "maxDurationMinutes": 180,
  "maxFileSizeMb": 500,
  "requestTimeoutSecs": 120
}
```

# Actor output Schema

## `results` (type: `string`):

Transcript text, segments, language and subtitle links per file.

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

Files transcribed, failed, audio minutes and minutes charged.

## `files` (type: `string`):

SRT and VTT files in the default key-value store.

# 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": [
        "https://upload.wikimedia.org/wikipedia/commons/c/c4/GWBush_Oval_Office_Address_20010911-1-.ogg"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("pinkish_armada/audio-transcriber").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": ["https://upload.wikimedia.org/wikipedia/commons/c/c4/GWBush_Oval_Office_Address_20010911-1-.ogg"] }

# Run the Actor and wait for it to finish
run = client.actor("pinkish_armada/audio-transcriber").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": [
    "https://upload.wikimedia.org/wikipedia/commons/c/c4/GWBush_Oval_Office_Address_20010911-1-.ogg"
  ]
}' |
apify call pinkish_armada/audio-transcriber --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,pinkish_armada/audio-transcriber"
        }
    }
}
```

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/cvgQg9KoM2KavZqMs/builds/zRfMcmvrecXvg2h97/openapi.json
