# Whisper Audio & Video Transcriber (Speech to Text, SRT/VTT) (`cyuli/whisper-transcriber`) Actor

Transcribe audio and video files to text with OpenAI Whisper. 99 languages, auto language detection, timestamps, SRT and VTT subtitles, translation to English. Paste any direct link, Google Drive or Dropbox. From $0.006 per minute.

- **URL**: https://apify.com/cyuli/whisper-transcriber.md
- **Developed by:** [Christian Yuli](https://apify.com/cyuli) (community)
- **Categories:** AI, Videos, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 audio minute (base model)s

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

### What does Whisper Audio & Video Transcriber do?

**Whisper Audio & Video Transcriber** converts speech in audio and video files into text using [OpenAI Whisper](https://github.com/openai/whisper) (the open-source model, run with the optimized faster-whisper engine). Give it one or many file URLs and get back:

- 📝 the **full transcript** as plain text
- ⏱️ **timestamped segments** (and optional **word-level timestamps**)
- 🎬 ready-to-use **SRT and VTT subtitles**, plus downloadable `.srt`, `.vtt` and `.txt` files
- 🌍 the **detected language** (99 languages supported) or an **English translation**

No API keys, no OpenAI account and no setup: paste a link and run. Works with **mp3, wav, m4a, aac, ogg, opus, flac, mp4, mov, webm, mkv** and most other audio/video formats. Public **Google Drive, Dropbox and OneDrive** share links are converted to direct downloads automatically.

### Why use this transcriber?

- 💸 **Cheap and predictable**: from **$0.006 per audio minute**, the same as the OpenAI Whisper API, with no monthly fee. A 1-hour podcast costs $0.36.
- 🔒 **Private**: files are processed inside your Apify run and are not sent to any third-party AI API.
- 🧾 **You only pay for successful files**: broken links, web pages and unreadable files are not charged.
- 🔁 **Built for automation**: call it from the API, schedule it, or plug it into **n8n, Make, Zapier, LangChain** or your AI agent through the Apify MCP server.
- 🎞️ **Subtitles out of the box**: SRT/VTT files you can upload straight to YouTube, Vimeo, Premiere or CapCut.

### Use cases

- Transcribe **podcasts, interviews, webinars, meetings, lectures and voice notes**
- Generate **subtitles / closed captions** for videos and social media clips
- Turn **video content into text** for blog posts, SEO, summaries and LLM / RAG pipelines
- **Translate** foreign-language audio into English text
- Search and analyze **call recordings** and customer interviews at scale

### How much does it cost to transcribe audio?

You pay per **started minute of audio** (each file's duration is rounded up to the next minute). There is no charge for files that fail.

| Model | Best for | Price per audio minute | 1 hour of audio |
|---|---|---|---|
| `base` (default) | Clear speech: podcasts, meetings, voice notes | **$0.006** | $0.36 |
| `small` | Accents, background noise, names, non-English audio | **$0.015** | $0.90 |

Platform usage is included in the price. Apify's free plan gives you monthly credits, enough to transcribe several hours of audio for free.

### How to transcribe audio or video files

1. Click **Try for free** / **Start**.
2. Paste one or more file links into **Audio or video URLs**.
3. Optionally choose the **model**, set the **language** (or keep `auto`) and enable **Translate to English**.
4. Click **Start** and wait. A 1-hour file usually takes 3 to 6 minutes with the `base` model.
5. Download the results as **JSON, CSV, Excel or HTML** from the **Output** tab, or grab the `.srt`/`.vtt`/`.txt` files from the run's key-value store.

💡 **Tip:** give the run more memory (8 GB or 16 GB) to transcribe long files faster. The price per minute stays the same.

### Input

```json
{
    "audioUrls": [
        "https://example.com/podcast-episode-42.mp3",
        "https://drive.google.com/file/d/1AbCdEfGhIjKlMnOp/view?usp=sharing"
    ],
    "model": "base",
    "language": "auto",
    "translateToEnglish": false,
    "includeSegments": true,
    "includeSubtitles": true,
    "wordTimestamps": false,
    "initialPrompt": "Apify, Kubernetes, Dr. Nakamura"
}
```

See the **Input** tab for every option, including safety limits on file duration and size.

### Output

Each file produces one item in the dataset:

```json
{
    "url": "https://example.com/podcast-episode-42.mp3",
    "status": "succeeded",
    "model": "base",
    "language": "en",
    "languageProbability": 0.98,
    "durationSeconds": 1834.2,
    "billableMinutes": 31,
    "text": "Welcome back to the show. Today we're talking about...",
    "wordCount": 5120,
    "segments": [
        { "start": 0.0, "end": 3.4, "text": "Welcome back to the show." },
        { "start": 3.4, "end": 7.9, "text": "Today we're talking about..." }
    ],
    "srt": "1\n00:00:00,000 --> 00:00:03,400\nWelcome back to the show.\n...",
    "vtt": "WEBVTT\n\n00:00:00.000 --> 00:00:03.400\nWelcome back to the show.\n...",
    "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",
    "txtUrl": "https://api.apify.com/v2/key-value-stores/.../records/transcript-1.txt"
}
```

Failed files are returned with `"status": "failed"` and a human-readable `error`, so a batch never stops because of one bad link.

### Use it from code, n8n or AI agents

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("cyuli/whisper-transcriber").call(run_input={"audioUrls": ["https://example.com/talk.mp3"]})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["text"])
```

**JavaScript**

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('cyuli/whisper-transcriber').call({ audioUrls: ['https://example.com/talk.mp3'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].text);
```

**No-code**: use the Apify integration in **n8n, Make or Zapier**: "Run Actor" with the input above, then "Get dataset items". **AI agents** (Claude, ChatGPT, Cursor...) can call this Actor directly through the [Apify MCP server](https://mcp.apify.com).

### FAQ

**Which languages are supported?**
All 99 Whisper languages, including English, Spanish, Portuguese, French, German, Italian, Dutch, Russian, Arabic, Hindi, Japanese, Korean and Chinese. Language is detected automatically, or you can set it with an ISO code like `es` or `pt`.

**Can I transcribe YouTube, TikTok or Instagram links?**
This Actor needs a direct link to a media file. For YouTube videos that already have captions, a YouTube transcript Actor is cheaper. For other platforms, download the media first (many Apify Actors do this) and pass the file URL.

**How accurate is it?**
Whisper is one of the most accurate open speech recognition models. `base` works well for clear speech; switch to `small` for noisy audio, strong accents or uncommon names. Use the **Vocabulary hint** to help it spell brand names and jargon.

**Is there a file size or length limit?**
By default files up to 2 GB and 4 hours are accepted. You can change both limits in the input. Files above the limits are skipped and not charged.

**Does it identify speakers (diarization)?**
Not yet. Each segment has timestamps but no speaker label.

**Is my data safe?**
Files are downloaded into your own Apify run, transcribed locally with the open-source model and deleted when the run ends. Results stay in your Apify storage.

### Feedback

Found a file that doesn't work or need a feature (speaker labels, more models, other output formats)? Open an issue in the **Issues** tab.

# Actor input Schema

## `audioUrls` (type: `array`):

Direct links to audio or video files (mp3, wav, m4a, aac, ogg, opus, flac, mp4, mov, webm, mkv...). Public Google Drive, Dropbox and OneDrive share links are converted to direct downloads automatically. Each file becomes one dataset item.

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

"base" is fast and cheap, good for clear speech, podcasts and meetings. "small" is noticeably more accurate on accents, noise, names and non-English audio.

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

ISO 639-1 code of the spoken language (en, es, pt, fr, de, it, ja, hi...). Leave "auto" to detect it automatically. Setting it improves accuracy on short or mixed audio.

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

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

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

Add the list of segments with start and end times (seconds) to each result.

## `includeSubtitles` (type: `boolean`):

Add SRT and VTT subtitles to each result and save .srt, .vtt and .txt files in the run's key-value store with download links.

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

Add start/end times and confidence for every word inside each segment (useful for karaoke-style captions and editing). Slightly slower.

## `vadFilter` (type: `boolean`):

Detect and skip silent parts before transcribing. Faster and reduces hallucinated text on music or silence. You are billed for the full file duration either way.

## `initialPrompt` (type: `string`):

Optional text with names, brands or jargon that appear in the audio (e.g. "Apify, Kubernetes, Dr. Nakamura"). Helps Whisper spell them correctly.

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

Files longer than this are skipped without charge. Protects you from accidentally transcribing very long files.

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

Files larger than this are skipped without charge.

## Actor input object example

```json
{
  "audioUrls": [
    "https://archive.org/download/luces_de_bohemia_2308_librivox/lucesdebohemia_01_valleinclan_64kb.mp3"
  ],
  "model": "base",
  "language": "auto",
  "translateToEnglish": false,
  "includeSegments": true,
  "includeSubtitles": true,
  "wordTimestamps": false,
  "vadFilter": true,
  "maxDurationMinutes": 240,
  "maxFileSizeMb": 2048
}
```

# Actor output Schema

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

No description

## `files` (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 = {
    "audioUrls": [
        "https://archive.org/download/luces_de_bohemia_2308_librivox/lucesdebohemia_01_valleinclan_64kb.mp3"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cyuli/whisper-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 = { "audioUrls": ["https://archive.org/download/luces_de_bohemia_2308_librivox/lucesdebohemia_01_valleinclan_64kb.mp3"] }

# Run the Actor and wait for it to finish
run = client.actor("cyuli/whisper-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 '{
  "audioUrls": [
    "https://archive.org/download/luces_de_bohemia_2308_librivox/lucesdebohemia_01_valleinclan_64kb.mp3"
  ]
}' |
apify call cyuli/whisper-transcriber --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cyuli/whisper-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/Z6l1AtENLcFahqRPd/builds/sdRE7ABL27eEDK2pz/openapi.json
