# Cheap Video Transcription (`datahive/cheap-video-transcription`) Actor

Transcribe audio or video from a public URL, an uploaded file, or an Apify storage record with Whisper. Get plain text and timestamped SRT subtitles with automatic language detection and optional English translation.

- **URL**: https://apify.com/datahive/cheap-video-transcription.md
- **Developed by:** [DataHive](https://apify.com/datahive) (community)
- **Categories:** Automation, Videos, AI
- **Stats:** 5 total users, 4 monthly users, 23.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 completed 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Audio & Video to Text — Whisper Transcriber

Turn audio and video into clean text and ready-to-use subtitles—without an API key.

Upload a file, paste a direct media link, or connect a file produced by another Apify Actor. This Actor runs the multilingual Whisper `large-v3-turbo` model through fast native `whisper` inference and returns both a readable transcript and timestamped SRT subtitles.

### What you get

- Plain-text transcript, ready for notes, search, summaries, or RAG workflows
- Timestamped `SRT` subtitles for video editors and publishing platforms
- Automatic language detection or an optional language hint
- Optional translation to English
- Support for audio and video formats handled by FFmpeg, including MP3, WAV, M4A, MP4, MOV, WebM, and more
- A single 30-second processing window in memory at a time—well suited to long recordings
- One model load per Actor run for efficient long-form transcription

### Three ways to add media

#### 1. Paste a direct media URL

Use a public or signed link to an actual audio or video file:

```json
{
  "audioUrl": "https://example.com/interview.mp3",
  "language": "cs",
  "translateToEnglish": false
}
```

#### 2. Upload a file

In the Apify input form, use **Upload media or media URL** to select an audio or video file from your computer. Apify stores it for the run and passes its file URL to the Actor—no separate hosting needed.

#### 3. Use media from another Actor

If another Actor saved media in an Apify Key-value Store, select that store in **Source key-value store** and enter the file's record key:

```json
{
  "sourceKeyValueStore": "YOUR_STORE_ID",
  "sourceFileKey": "meeting-recording.mp4",
  "language": "en"
}
```

The Actor requests read-only access only to the storage you select.

> Provide exactly one source: `audioUrl`, uploaded `media`, or the `sourceKeyValueStore` + `sourceFileKey` pair.

### Results

Every successful run writes one item to the default Dataset:

```json
{
  "audioUrl": "https://example.com/interview.mp3",
  "durationSeconds": 125.4,
  "billedMinutes": 3,
  "language": "cs",
  "translatedToEnglish": false,
  "model": "base",
  "transcript": "Dobrý den. Vítejte v dnešním rozhovoru.",
  "subtitlesSrt": "1\n00:00:00,000 --> 00:00:02,400\nDobrý den.\n"
}
```

### Built for long recordings

Long media is processed in 30-second chunks by default. Adjacent chunks overlap by one second to protect speech at boundaries, and duplicate subtitle lines are removed. Set `chunkSeconds` to a whole number from `5` to `30` when needed.

If Apify migrates a long-running Actor to another server, the Actor saves its completed chunks in the run's default Key-value Store and resumes from the next chunk after restart. The temporary media download is repeated, but already transcribed audio is not processed again.

### Pricing

The Actor charges one `audio-minute` event for every started minute only after a transcript has been produced successfully. Check the Apify pricing panel for the current event price and applicable platform-usage charges before starting a run.

### Important notes

- Use a direct media-file URL, not a web page that merely contains an embedded player. YouTube, TikTok, and Instagram page URLs are not currently supported.
- You are responsible for having the rights and consent needed to process the submitted media.
- Uploaded files and Dataset results follow the storage and retention settings of the Apify account that starts the run.

# Actor input Schema

## `audioUrl` (type: `string`):

A direct, public HTTP(S) URL. Signed URLs are supported. Use this or Upload media / media URL, not both.

## `media` (type: `string`):

Upload an audio/video file from your computer, select a file in an Apify key-value store, or provide a URL. Use this or Audio or video URL, not both.

## `sourceKeyValueStore` (type: `string`):

Optional: select a key-value store containing a media file produced by another Actor. Also provide its record key below.

## `sourceFileKey` (type: `string`):

The key of the audio/video file in the selected key-value store, for example recording.mp4.

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

Optional ISO 639-1 code such as cs, en, de. Leave empty for automatic detection.

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

Translate speech to English instead of transcribing it in the original language.

## `chunkSeconds` (type: `integer`):

Length of each Whisper request. The Actor uses a one-second overlap to protect words on chunk boundaries.

## Actor input object example

```json
{
  "audioUrl": "https://raw.githubusercontent.com/ggml-org/whisper.cpp/master/samples/jfk.wav",
  "media": "https://raw.githubusercontent.com/ggml-org/whisper.cpp/master/samples/jfk.wav",
  "translateToEnglish": false,
  "chunkSeconds": 600
}
```

# Actor output Schema

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

Dataset items containing the plain transcript, SRT subtitles, duration, source URL, and billing metadata.

# 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 = {
    "audioUrl": "https://raw.githubusercontent.com/ggml-org/whisper.cpp/master/samples/jfk.wav",
    "media": "https://raw.githubusercontent.com/ggml-org/whisper.cpp/master/samples/jfk.wav",
    "language": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("datahive/cheap-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 = {
    "audioUrl": "https://raw.githubusercontent.com/ggml-org/whisper.cpp/master/samples/jfk.wav",
    "media": "https://raw.githubusercontent.com/ggml-org/whisper.cpp/master/samples/jfk.wav",
    "language": "",
}

# Run the Actor and wait for it to finish
run = client.actor("datahive/cheap-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 '{
  "audioUrl": "https://raw.githubusercontent.com/ggml-org/whisper.cpp/master/samples/jfk.wav",
  "media": "https://raw.githubusercontent.com/ggml-org/whisper.cpp/master/samples/jfk.wav",
  "language": ""
}' |
apify call datahive/cheap-video-transcription --silent --output-dataset

```

## MCP server setup

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