# Audio & Video to Text - Whisper Transcription, SRT, VTT (`sipki/media-to-text`) Actor

Transcribe audio and video files to text with Whisper: full transcript, timed segments, SRT and VTT subtitles, auto language detection, optional English translation and RAG chunks. Direct file links or uploads. $0.008 per minute (fast), $0.014 (accurate); failed files free.

- **URL**: https://apify.com/sipki/media-to-text.md
- **Developed by:** [SIPKI LLC](https://apify.com/sipki) (community)
- **Categories:** AI, Videos
- **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 minute (fast)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

## Audio & Video to Text - Whisper transcription with SRT and VTT subtitles

**Send direct links to audio or video files; get the transcript, timed segments and ready SRT/VTT subtitles - from $0.008 per minute ($0.48 per hour), failed files free.**

Two modes: **fast** for clear speech and **accurate** for accents, noise and names. Language is detected automatically; optional translation to English and paragraph chunks with timestamps for search and RAG. Works with files served as `audio/*` or `video/*` (for example MP3, WAV, M4A, OGG, MP4) that you own or have the right to process.

**Try it now:** press **Start** with the prefilled input (a short clip from Wikimedia Commons). It costs $0.008.

**Important - what this Actor does not accept.** It does not download from video or audio platforms. Links to YouTube, TikTok, Instagram, Facebook, X (Twitter), Vimeo, Spotify, Loom, SoundCloud, Twitch and similar services are refused at once with a clear error, and the refusal is free: the terms of those platforms forbid downloading their media. Use files you own or have the right to process (your own recordings, meetings, podcasts you publish, interviews you made, public-domain and openly licensed audio).

### What you get per file

- `text` - the full transcript; `segments[]` - `{id, start, end, text}` with times in seconds
- `srt` and `vtt` - subtitle files as strings (switch off with *Include SRT and VTT*)
- `language` and `language_probability` (auto-detected, or the language you set); optional translation to English
- `chunks[]` for RAG - about N characters, cut on segment boundaries, each with `start` / `end` in seconds and `chars` (same idea as the chunks of our document Actor: `index`, `text`, `chars`, with a time range instead of pages)
- `keyframes[]` - for video, optional: up to N scene-change JPEG frames saved to the run's key-value store (`time`, `key`, `url`)
- `duration_seconds`, `minutes_billed`, `words`, `model`, `mode`, `elapsed_seconds`
- failed files come back as `status: "error"` with the reason and are **free**

### Modes

- **fast** - Whisper *base* model, int8 on CPU. Quickest and cheapest. Good for clear speech.
- **accurate** - Whisper *small* model with beam search. Fewer errors with accents, noise and proper names; several times slower, so the price per minute is higher.

Neither mode does speaker separation (diarization) and neither is a substitute for a human check on legal, medical or other critical material.

### Input

- **Media file URLs** - direct links; the server must answer with an `audio/*` or `video/*` Content-Type (an `application/ogg` answer is also accepted). Web pages and `application/octet-stream` downloads are refused - use a key-value store for those.
- **Key-value store keys** (+ optional store name) - files you uploaded.
- Mode, language (`auto` or a Whisper code such as `en`, `de`, `fr`, `es`, `ru`), translate to English, SRT/VTT, silence filter, chunk size and overlap, key frames and their maximum.
- Limits: **500 MB and 3 hours per file**, up to 200 files per run. Longer or larger files are reported as failed and are free.

### Pricing (pay per event, per minute of audio, rounded up)

- **Fast: $0.008 per minute** (event `minute-fast`)
- **Accurate: $0.014 per minute** (event `minute-accurate`)
- Every successful file is billed at least one minute. No start fee, nothing for key frames. Failed files are not charged.
- Your maximum-charge setting is respected: before each file the Actor checks that your remaining budget covers the whole file, and stops instead of exceeding it. A file is never half-processed and half-billed.

### Notes and limits

- CPU only; measured on the default 4 GB: fast mode transcribes about 15 minutes of audio per minute of run time, accurate mode about 5 to 7. Files longer than 10 minutes are processed in 10-minute windows (cut at the quietest point) so memory stays flat; the language is detected on the first window. Set a run timeout that fits your longest file. With less than 4096 MB of Actor memory the limit is 60 minutes per file.
- Quality depends on audio quality. Whisper can invent words in silence or music; the silence filter (on by default) reduces this. Check `language_probability` for files with mixed languages.
- Only the files you provide are processed. A URL is fetched once, as a plain download, with the user agent `SipkiMediaToText/1.0 (+https://apify.com/sipki/media-to-text)`. If the host answers 401, 403 or 429, the file is reported as failed (free): no retry, no workaround, no proxy.
- Links to private or internal addresses (private ranges, loopback, link-local, cloud metadata such as `169.254.169.254`) are refused, also after redirects.
- Record and transcribe people only with their consent: recording and wiretapping laws differ by country and are your responsibility.
- Open-source components: OpenAI Whisper models and code (MIT), faster-whisper (MIT), CTranslate2 (MIT), PyAV with bundled FFmpeg libraries (PyAV BSD-3; FFmpeg LGPL/GPL, used only to decode and to take key frames), Pillow (HPND). Whisper model files: Systran/faster-whisper-base and -small (MIT).

### How to use

1. Paste direct file links into **Media file URLs**, or upload files to a key-value store and list their keys.
2. Pick **fast** or **accurate**, the language (or `auto`) and whether you need subtitles or chunks.
3. Press **Start**. For long files set the run timeout to fit (fast mode handles about 15 minutes of audio per minute of run time). Call it from the Apify API, a schedule, an integration or the Apify MCP server.

### Who uses it

- **Podcasters and video teams** - subtitles and transcripts of their own recordings.
- **Researchers and journalists** - transcribe interviews they recorded.
- **Teams building search over meetings and calls** - text with timestamps and chunks.

### More questions

**Can I paste a YouTube or TikTok link?** No. Platform links are refused (free) because their terms forbid downloading media. Use files you own.
**Does it separate speakers?** No, there is no speaker diarization.
**How much does one hour cost?** $0.48 in fast mode, $0.84 in accurate mode.

### Not affiliated

Not affiliated with, endorsed or sponsored by OpenAI, SYSTRAN, the FFmpeg project or any other third party named in this description.

### Content rights

You provide the media and are responsible for having the right to process it and to use the transcript. The Actor does not check copyright or licences of your files.

### Acceptable use

This Actor is a tool. You decide which files it processes and what you do with the results, and you are responsible for that use. Use it only where you have the right to access and process the media, and in line with applicable law (including recording-consent, data-protection and copyright law) and the terms of the sources. Do not use it to bypass blocks or access controls, to download from platforms that forbid it, or to place excessive load on any server. If a site owner asks us to stop, we may exclude that site. Sipki, LLC does not receive or store your results; they stay in your Apify storage.

### No warranty

The Actor and its output are provided "as is", without warranty of accuracy, completeness or fitness for a purpose. Speech recognition makes errors. Verify results before relying on them. Liability of Sipki, LLC is limited as set out in the Apify Standard Actor Contract that governs your use of this Actor.

### Personal data

Recordings and transcripts usually contain personal data (voices, names, health, financial or other details). For such data you are the controller and Sipki, LLC acts only as your processor under section 5 of the Apify Standard Actor Contract. Files and transcripts are processed only to produce your dataset; the Actor stores nothing outside your run's storages, and the creator does not access run data except on your support request. You need a lawful basis for your processing, the consent of the people recorded where the law requires it, and you must handle data-subject requests. To request deletion of anything related to you, open an Issue on this Actor's page.

### For site owners (opt-out)

When you give the Actor a link, it downloads that single file with the user agent `SipkiMediaToText/1.0 (+https://apify.com/sipki/media-to-text)`. It does not crawl and does not read robots.txt, because it only fetches links that a user supplies. To have your domain excluded, or to report a problem, open an Issue on this Actor's page: your domain will be added to the block list within 3 business days, and every run checks that list.

# Actor input Schema

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

DIRECT links to audio or video files (mp3, m4a, wav, ogg, flac, mp4, mov, webm ...), http/https, one per line. The server must answer with an audio/\* or video/\* Content-Type. Links to YouTube, TikTok, Instagram, Facebook, X, Vimeo, Spotify, Loom and similar platforms are refused (free), because their terms forbid downloading.

## `keyValueStoreKeys` (type: `array`):

Keys of audio/video files you uploaded to a key-value store. Combine with 'Media file URLs' freely.

## `keyValueStoreName` (type: `string`):

Name of the store that holds the keys above. Leave empty to use this run's default store.

## `mode` (type: `string`):

fast: Whisper base model, quickest and cheapest per minute. accurate: Whisper small model with beam search, fewer errors on accents, noise and names.

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

'auto' detects the language from the first 30 seconds. Or give a Whisper language code such as en, de, fr, es, it, pt, ru, uk, pl, nl, tr, ar, hi, ja, ko, zh. A fixed language is more reliable for short or noisy files.

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

Whisper's built-in translation: the transcript is returned in English whatever the spoken language.

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

Add 'srt' and 'vtt' fields with ready-to-use subtitle files.

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

Removes long silences before transcription: fewer made-up words in quiet parts, usually faster. Switch off for music-heavy files with quiet speech.

## `chunkSize` (type: `integer`):

0 = no chunks. Otherwise adds a 'chunks' array of about this many characters, cut on segment boundaries, each with its start and end time in seconds.

## `chunkOverlap` (type: `integer`):

How much of the previous chunk is repeated at the start of the next one (segment granularity).

## `extractKeyframes` (type: `boolean`):

For video files: save up to 'Max key frames' scene-change frames as JPEG to the run's key-value store and list them in 'keyframes' with their time. Included in the price.

## `maxKeyframes` (type: `integer`):

Upper limit of key frames per video.

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

Larger files are reported as failed (free). Hard limit 500 MB.

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

Longer files are reported as failed (free). Hard limit 180 minutes.

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

Files after this number are not processed.

## Actor input object example

```json
{
  "mediaUrls": [
    "https://upload.wikimedia.org/wikipedia/commons/3/3a/Simple_en_Stop-motion.oga"
  ],
  "mode": "fast",
  "language": "auto",
  "translateToEnglish": false,
  "includeSubtitles": true,
  "vadFilter": true,
  "chunkSize": 0,
  "chunkOverlap": 100,
  "extractKeyframes": false,
  "maxKeyframes": 12,
  "maxFileSizeMb": 500,
  "maxDurationMinutes": 180,
  "maxFiles": 200
}
```

# 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": [
        "https://upload.wikimedia.org/wikipedia/commons/3/3a/Simple_en_Stop-motion.oga"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sipki/media-to-text").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/3/3a/Simple_en_Stop-motion.oga"] }

# Run the Actor and wait for it to finish
run = client.actor("sipki/media-to-text").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/3/3a/Simple_en_Stop-motion.oga"
  ]
}' |
apify call sipki/media-to-text --silent --output-dataset

```

## MCP server setup

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

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/YGMemWhx1wbf8CgtQ/builds/OCTL16BtuhS0apvzb/openapi.json
