# Audio & Video to Text: Speech to Text Transcription (Whisper) (`tidelane/audio-video-transcriber`) Actor

Transcribe audio and video files and podcast episodes to text with OpenAI Whisper (faster-whisper) in 99 languages. Timestamps, SRT and VTT subtitles, word timings, translation to English, automatic language detection and silence skipping. Pay per audio minute.

- **URL**: https://apify.com/tidelane/audio-video-transcriber.md
- **Developed by:** [Tidelane Data](https://apify.com/tidelane) (community)
- **Categories:** AI, Automation, Videos
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $17.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.
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 & Video to Text: Speech to Text Transcription (Whisper)

Transcribe **audio and video files** and **podcast episodes** to text with OpenAI's Whisper speech recognition (the fast faster-whisper engine). Paste links to MP3, M4A, WAV, MP4 … or a podcast RSS feed, and get the full transcript with **timestamps**, ready-made **SRT and VTT subtitles** and the detected language.

- ✅ **99 languages** with automatic language detection, or set the language yourself
- ✅ **Translate to English** from any language in the same step
- ✅ **Podcasts**: give the RSS feed and choose how many of the newest episodes to transcribe
- ✅ **All common formats**: MP3, M4A/AAC, WAV, FLAC, OGG, OPUS, WEBM, MP4, MOV, MKV and more (audio track of videos), up to 2 GB
- ✅ **Timestamps**: segments with start and end, optional **word timestamps** with confidence
- ✅ **Subtitles**: SRT and VTT files with download links
- ✅ **Skips silence** and music without speech, which also prevents made-up text in quiet parts
- ✅ **Vocabulary hint** for names, brands and technical terms
- ✅ **Cost control**: transcribe only the first N minutes of each file; the run stops cleanly at your spending limit
- ✅ **Fair billing**: per started audio minute; broken links and non-media files are free
- ✅ **Private**: the audio is transcribed on Apify with the open-source Whisper model; it is not sent to OpenAI or any other outside service

### Input example

```json
{
    "mediaUrls": ["https://raw.githubusercontent.com/openai/whisper/main/tests/jfk.flac"],
    "podcastFeedUrls": ["https://feeds.npr.org/510289/podcast.xml"],
    "maxEpisodesPerFeed": 1,
    "model": "small",
    "language": "auto",
    "task": "transcribe",
    "saveSubtitles": true,
    "maxMinutesPerFile": 180
}
```

### Output example

Real output from a test run:

```json
{
    "url": "https://raw.githubusercontent.com/openai/whisper/main/tests/jfk.flac",
    "fileName": "jfk.flac",
    "title": null,
    "podcast": null,
    "published": null,
    "model": "small",
    "task": "transcribe",
    "durationSec": 11,
    "transcribedSec": 11,
    "language": "en",
    "languageProbability": 0.944,
    "billedMinutes": 1,
    "wordCount": 22,
    "text": "And so my fellow Americans, ask not what your country can do for you, ask what you can do for your country.",
    "processingSec": 26.4,
    "segments": [
        { "start": 0, "end": 11, "text": "And so my fellow Americans, ask not what your country can do for you, ask what you can do for your country." }
    ],
    "srtUrl": "https://api.apify.com/v2/key-value-stores/…/records/000-jfk.srt?signature=…",
    "vttUrl": "https://api.apify.com/v2/key-value-stores/…/records/000-jfk.vtt?signature=…"
}
```

The SRT file from that run:

```
1
00:00:00,000 --> 00:00:11,000
And so my fellow Americans, ask not what your country can do for you, ask what you can do for your country.
```

Podcast episodes also get `title`, `podcast` and `published`. Long transcripts are split into paragraphs at pauses. A summary per file (`ok` or `error` with the reason) is saved as `OUTPUT` in the key-value store.

### Speed

Speed depends on the memory you give the run, because Apify assigns CPU in proportion to memory. With the default 4 GB, a 5-minute podcast segment took about 3 minutes in our tests; 8 GB or 16 GB is roughly 2x or 4x faster. **The price per audio minute stays the same.**

### Pricing

A fixed price per started minute of audio that is transcribed, the same for both models.

Paid Apify plans pay less: 5% off on Starter, 10% on Scale and 15% on Business and higher plans. Example: a 30-minute podcast costs $0.60 on the Free plan.

### FAQ

**Which model should I use?** `small` (default) gives good results for interviews, podcasts, meetings and most languages. `base` is faster for clean, single-speaker recordings.

**Does it separate speakers?** No, the transcript has no speaker labels.

**Can I transcribe YouTube, TikTok or Instagram links?** No. Use direct links to media files you have the right to use, such as your own recordings, files in cloud storage or podcast feeds.

**Is my audio stored?** Files are processed inside your run and deleted when it ends. Only the transcript and subtitles are saved in your own storage.

***

#### Impressum

Levi Griesinger, Tidelane Data\
Besigheimer Straße 18\
74369, Löchgau, Deutschland\
E-Mail: LeviGriesinger@gmail.com

# Actor input Schema

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

Direct links to audio or video files: MP3, M4A, WAV, FLAC, OGG, OPUS, WEBM, MP4, MOV, MKV … (up to 2 GB each).

## `podcastFeedUrls` (type: `array`):

Podcast feed URLs. The newest episodes are transcribed (see Episodes per feed).

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

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

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

Whisper model size. Small handles accents, noise and most languages well; Base is faster for clean recordings. Same price.

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

Spoken language as a code (en, de, es, fr, it, pt, nl, pl, tr, ru, ja, zh …), or auto to detect it.

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

Translate turns speech in any language into English text.

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

Add the text split into timed segments (start and end in seconds).

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

Add start and end time and confidence for every word (slower).

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

Save subtitle files to the key-value store and add their links to the result.

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

Detect speech first and skip silence and music without speech (faster, fewer hallucinations). Billing always uses the file length.

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

Optional text with names, brands or terms that appear in the audio, for example 'Apify, Kubernetes, Dr. Müller'. Helps with spelling.

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

Only the first N minutes of each file are transcribed and billed.

## Actor input object example

```json
{
  "mediaUrls": [
    "https://raw.githubusercontent.com/openai/whisper/main/tests/jfk.flac"
  ],
  "maxEpisodesPerFeed": 1,
  "model": "small",
  "language": "auto",
  "task": "transcribe",
  "includeSegments": true,
  "wordTimestamps": false,
  "saveSubtitles": true,
  "skipSilence": true,
  "maxMinutesPerFile": 180
}
```

# Actor output Schema

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

All results of the run as dataset items.

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

Summary per input with status (ok, error and the reason).

# 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://raw.githubusercontent.com/openai/whisper/main/tests/jfk.flac"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidelane/audio-video-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://raw.githubusercontent.com/openai/whisper/main/tests/jfk.flac"] }

# Run the Actor and wait for it to finish
run = client.actor("tidelane/audio-video-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://raw.githubusercontent.com/openai/whisper/main/tests/jfk.flac"
  ]
}' |
apify call tidelane/audio-video-transcriber --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tidelane/audio-video-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/eGOpUz8BFNOwDuA5c/builds/2IHO1NTxYtpmJjI7c/openapi.json
