# Audio & Video Transcription – Speech to Text, SRT (`olliolli/audio-video-transcription`) Actor

Transcribe audio and video to text and SRT subtitles in 99 languages: English, Spanish, Portuguese, Chinese, Hindi, Arabic, French, German, Dutch. Translated subtitles, AI proofreading. No API key.

- **URL**: https://apify.com/olliolli/audio-video-transcription.md
- **Developed by:** [Tom J](https://apify.com/olliolli) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 audio 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

**Speech to text** for your own audio and video files: transcribe MP3, M4A, WAV, MP4, MOV and more to **text, SRT and VTT subtitles and Markdown** with Whisper large-v3-turbo, in 99 languages including **Dutch, French, German**, English and Spanish. Add **translated subtitles** in 36 languages, a **word list** for names and terms, and optional **AI proofreading**. No API key. **$8 per 1,000 audio minutes**; a 60-minute podcast costs $0.48.

### What you can do with it

- **Transcribe podcasts, interviews and meetings** to clean text and Markdown.
- **Create subtitles** (SRT, VTT) for your videos, and translate them into up to 5 languages per run.
- **Transcribe Dutch, French and German audio** with a word list for names, places and jargon.
- **Process folders of files** from Google Drive, Dropbox, OneDrive or SharePoint links, or from another Actor's dataset.
- **Feed automations**: every row links to ready .txt, .srt, .vtt and .md files for n8n, Make or Zapier.

### How to transcribe audio and video in 3 steps

1. **Add files**: direct links, share links (set to "Anyone with the link"), uploads, or a dataset from another Actor.
2. **Choose the language** (or "Detect automatically"), output formats and, if you want, subtitle languages, a word list and proofreading.
3. **Click Start.** You get one row per file, plus .txt, .srt, .vtt and .md files in the run's key-value store.

### Transcribe files from Google Drive, Dropbox or any link

| Source | How |
|---|---|
| Direct link | `urls` (mp3, m4a, wav, flac, ogg, opus, mp4, mov, webm, mkv) |
| Google Drive, Dropbox, OneDrive, SharePoint | Share link in `urls`, set to "Anyone with the link"; converted automatically |
| Your computer | `uploadedFiles` |
| API | `base64Files`: `[{"name": "file.mp3", "data": "<base64>"}]`, max 25 MB each |
| Another Actor | `datasetId` + `urlField` (default `url`, dotted paths like `media.audioUrl`) |

Platform links (YouTube, TikTok, Instagram…) are not supported and cost nothing: this Actor transcribes **your own files**.

### Input

| Field | Meaning | Default |
|---|---|---|
| `urls` | File or share links (max 500) | — |
| `language` | Spoken language, or `auto` | `auto` |
| `outputFormats` | `text`, `segments`, `srt`, `vtt`, `markdown` | all |
| `translateTo` | Up to 5 subtitle languages | none |
| `vocabulary` | Names and terms, comma or newline separated (first 600 characters used) | — |
| `proofread` | AI proofreading of the transcript | off |
| `maxMinutesPerFile` | Longer files are skipped | 120 (max 300) |
| `maxTotalMinutes` | Upper limit per run | 240 (max 600) |
| `maxFileSizeMb` | Larger files are not downloaded | 512 (max 2,048) |

```json
{
  "urls": ["https://drive.google.com/file/d/…/view"],
  "language": "nl",
  "outputFormats": ["text", "srt", "vtt", "markdown"],
  "translateTo": ["en"],
  "vocabulary": "Almere Binnen, Tenach",
  "proofread": true
}
```

### Output

```json
{
  "fileName": "Armstrong_Small_Step.ogg",
  "status": "ok",
  "language": "en",
  "languageProbability": 0.98,
  "durationSeconds": 24.11,
  "chargedMinutes": 1,
  "wordCount": 11,
  "text": "That's one small step for man, one giant leap for mankind.",
  "segments": [{ "start": 0.0, "end": 6.4, "text": "That's one small step for man," }],
  "srt": "1\n00:00:00,000 --> 00:00:06,400\n…",
  "vtt": "WEBVTT\n\n…",
  "markdown": "# Armstrong_Small_Step.ogg\n…",
  "files": { "txt": "…/001-Armstrong_Small_Step.txt", "srt": "…", "vtt": "…", "md": "…" }
}
```

*Format illustration.* With `translateTo`, a `translations` object adds text, SRT and VTT per language; with `proofread`, the original stays in `rawText`. Long files are cut into pieces with a short overlap and rejoined, so timestamps stay continuous.

Status values: `ok` (only status charged), `skipped_too_long`, `unsupported_source`, `download_failed`, `too_large`, `no_audio`, `quota_exhausted`, `not_processed_limit`, `failed`.

### Dutch, French and German transcription

Whisper large-v3-turbo handles 99 languages. For Dutch, French and German recordings with names, places or technical terms, add them to **vocabulary**: Whisper receives them as a spelling hint, and proofreading uses them too. Setting `language` helps for short files and strong accents.

### Translated subtitles in 36 languages

English, Spanish (Spain, Latin America), Portuguese (Brazil, Portugal), French, German, Dutch, Italian, Chinese (Simplified, Traditional), Japanese, Korean, Hindi, Arabic, Indonesian, Russian, Ukrainian, Polish, Turkish, Vietnamese, Thai, Malay, Filipino, Bengali, Urdu, Persian, Hebrew, Greek, Romanian, Czech, Hungarian, Swedish, Danish, Norwegian, Finnish. Same timings as the original.

### AI proofreading and word list

Proofreading corrects spelling, punctuation, capitalisation and misheard words, line by line, with the same timings. It does not rephrase or summarise. The word list is free.

### How much does transcription cost?

| Event | Price |
|---|---|
| Audio minute (every started minute) | $0.008 |
| Translated subtitles (per minute, per language) | $0.002 |
| AI proofreading (per minute) | $0.002 |
| Word list | free |

**Examples:** 60-minute podcast = **$0.48**. With English and Spanish subtitles = $0.48 + 2 × $0.12 = **$0.72**. Proofread = **$0.60**. A 61-second file counts as 2 minutes.

#### What you are not charged for

Platform links, broken or private links, files that are too large or too long, files without audio or speech, files stopped by a limit (maximum cost per run, maximum minutes, daily capacity), errors of the speech service, a subtitle language that fails or equals the spoken language, and proofreading that fails (you still get the transcript). Before sending audio, the Actor checks that the minutes fit your maximum cost per run.

### Integrate with any app

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("olliolli/audio-video-transcription").call(
    run_input={"urls": ["https://example.com/episode.mp3"], "language": "auto"}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["status"], row["files"]["srt"])
```

In **n8n, Make or Zapier**, pass the links in each row's `files` object (.txt, .srt, .vtt, .md) to your next step instead of copying long text fields. Through Apify's **MCP** server, AI assistants can call this Actor as a transcription tool.

### Privacy

Audio is sent to **Cloudflare Workers AI** for speech recognition; for translated subtitles and proofreading the transcript text is sent there too. Nothing is kept after the run except in your own Apify run storage, which follows your plan's retention. File contents are never written to the log.

### Good to know

- **Free Apify plan:** at most 5 minutes of audio per run, 15 minutes per day and 1 subtitle language per run. Paid plans don't have these limits.
- Background noise, overlapping voices, dialects and music lower the accuracy.
- Speaker labels (who said what) are not available in this version.

### FAQ

**Which file types are supported?** mp3, m4a, wav, flac, ogg, opus, mp4, mov, webm and mkv.

**Can I transcribe YouTube or TikTok links?** No. This Actor transcribes your own files and links; platform links are refused at no cost.

**How accurate is Dutch transcription?** It depends on the recording. Clear speech transcribes well; add names and terms to the word list, and use proofreading for misheard words.

**Does it add speaker labels?** Not in this version.

**How much does a 1-hour recording cost?** $0.48, plus $0.12 per subtitle language and $0.12 for proofreading.

**Where is my audio processed?** By Cloudflare Workers AI. Nothing is stored after the run outside your own Apify storage.

### Need help?

Open an issue on the **Issues** tab.

# Actor input Schema

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

Direct links to your own audio or video files (mp3, m4a, wav, flac, ogg, opus, mp4, mov, webm, mkv). Share links from Google Drive, Dropbox and OneDrive/SharePoint are converted automatically (the file must be shared as "Anyone with the link"). Links to platform pages (YouTube, TikTok, Instagram, Spotify, Vimeo, ...) are not supported and cost nothing.

## `uploadedFiles` (type: `array`):

Upload audio or video files from your computer (they are stored in a key-value store of your Apify account).

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

Take the file links from a dataset, e.g. the output of another actor. The actor only gets read access to the dataset you pick.

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

Name of the field that holds the file link in each dataset item. Use dots for nested fields (e.g. media.audioUrl).

## `base64Files` (type: `array`):

For API use: a list of {"name": "file.mp3", "data": "<base64>"} objects. At most 25 MB per file.

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

Language spoken in the files. "Detect automatically" works well for most files; setting the language helps for short files and accents.

## `outputFormats` (type: `array`):

Formats to include in each result. Plain text is always included.

## `translateTo` (type: `array`):

Also get the subtitles (SRT, VTT) and the text translated into up to 5 languages, with exactly the same timings as the original. The transcript itself always stays in the spoken language. Price: per started audio minute, per language (see Pricing); a language that fails or is already the spoken language is free. On the Apify free plan: 1 language per run.

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

Names, brands and technical terms that occur in your recordings, separated by commas or new lines (e.g. "Almere Binnen, Tenach, GNU Free Documentation License"). Whisper gets them as a spelling hint, and the AI proofreading uses them too. Up to 600 characters are used. Free.

## `proofread` (type: `boolean`):

A language model corrects spelling, punctuation, capitalisation and clearly misheard words in the transcript, line by line, with the same timings. It does not rephrase or summarise; a suggested change that rewrites a line is not applied. The original text stays available in "rawText". Price per started audio minute (see Pricing); not charged if it fails.

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

Longer files are skipped (status skipped_too_long) and not charged.

## `maxTotalMinutes` (type: `integer`):

Files that would go over this total are not processed (status not_processed_limit) and not charged.

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

Larger files are not downloaded (status too_large) and not charged.

## Actor input object example

```json
{
  "urls": [
    "https://upload.wikimedia.org/wikipedia/commons/d/dd/Armstrong_Small_Step.ogg"
  ],
  "urlField": "url",
  "language": "auto",
  "outputFormats": [
    "text",
    "segments",
    "srt",
    "vtt",
    "markdown"
  ],
  "translateTo": [],
  "proofread": false,
  "maxMinutesPerFile": 120,
  "maxTotalMinutes": 240,
  "maxFileSizeMb": 512
}
```

# Actor output Schema

## `transcripts` (type: `string`):

One row per file: status, language, duration, charged minutes, text, segments, SRT, VTT, Markdown and links to the files.

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

The transcript files of this run in the key-value store.

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

Files per status, minutes transcribed and charged, stop reason (OUTPUT).

# 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://upload.wikimedia.org/wikipedia/commons/d/dd/Armstrong_Small_Step.ogg"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("olliolli/audio-video-transcription").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://upload.wikimedia.org/wikipedia/commons/d/dd/Armstrong_Small_Step.ogg"] }

# Run the Actor and wait for it to finish
run = client.actor("olliolli/audio-video-transcription").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://upload.wikimedia.org/wikipedia/commons/d/dd/Armstrong_Small_Step.ogg"
  ]
}' |
apify call olliolli/audio-video-transcription --silent --output-dataset

```

## MCP server setup

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

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/MlIQMbzjNgVkhbcBC/builds/fce7gxu0nZ2gE0nNv/openapi.json
