# Speech to Text: Audio, Video & Podcast Transcriber (`rod_analytics/media-transcriber`) Actor

Speech to text with Whisper, no API key needed: transcribe audio, video and podcast RSS episodes to text, SRT and VTT subtitles and timestamped JSON segments. 99 languages. Optional own Groq or OpenAI key.

- **URL**: https://apify.com/rod_analytics/media-transcriber.md
- **Developed by:** [Rod Services](https://apify.com/rod_analytics) (community)
- **Categories:** AI, Videos
- **Features:** Limited permissions
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.10 / 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

**Speech to text for audio, video and podcasts: Whisper transcripts, SRT and VTT subtitles and timestamped segments.**
**No API key needed.** Paste a file link or a podcast RSS feed, press Start, get the transcript in seconds. $0.003 per audio minute, one bill.

### What you get

For every audio or video file, or every podcast episode:

- A clean **transcript** in the original language, 99 languages supported.
- **SRT and WebVTT subtitle files**, ready for YouTube Studio, video editors and HTML5 players.
- **JSON segments with start and end times**, for search, quotes and RAG.
- Title, publish date and feed title for podcast episodes.

It runs **OpenAI Whisper large v3 turbo on Groq** through a hosted key of this Actor, so you need no Groq or OpenAI account. Long recordings are split into chunks automatically: a 3 hour podcast works the same as a 3 minute voice memo. Optionally paste your own Groq or OpenAI key to pick other models or translate to English.

Typical uses:

- **Podcast transcription from RSS.** Point it at any feed. It takes the newest N episodes.
- **Meeting recordings, interviews and lectures.** MP4, MOV, MKV and WEBM work. Only the audio track is used.
- **Subtitles** for videos and accessibility.
- **AI agents and LLM pipelines.** Feed transcripts into summarizers, show notes, chatbots or vector databases. Callable through the Apify API and MCP.

### Quick start

1. Open the **Input** tab.
2. Add links in **Audio or video URLs**, upload a file, or paste a **Podcast RSS feed URL**.
3. Optional: set a **Language hint** such as `en`, `de` or `lt`.
4. Click **Start**. Transcripts appear in the **Output** tab. Subtitle files are in the key-value store.

The prefilled example transcribes the 2 minute Gettysburg Address recording in about 15 seconds.

From code, one HTTP call runs the Actor and returns the rows:

```bash
curl -X POST "https://api.apify.com/v2/acts/rod_analytics~media-transcriber/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"rssFeedUrl": "https://librivox.org/rss/389", "maxEpisodes": 2, "outputFormats": ["text", "srt"]}'
```

Want to check your links first? Turn on **Dry run**. It downloads, converts and splits the audio without transcribing and without the per minute charge.

### Input example

```json
{
  "rssFeedUrl": "https://librivox.org/rss/389",
  "maxEpisodes": 3,
  "language": "en",
  "outputFormats": ["text", "srt", "vtt", "json"]
}
```

| Field                                  | What it does                                                                                                     |
| -------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| `audioUrls`                            | Direct links to MP3, M4A, WAV, FLAC, OGG, OPUS, AAC, MP4, MOV, MKV, WEBM and more. Drive and Dropbox links work. |
| `rssFeedUrl`, `maxEpisodes`            | Podcast RSS or Atom feed, and how many of the newest episodes to transcribe.                                     |
| `uploadedFile`, `keyValueStoreRecords` | Files uploaded in Console, or records in a key-value store.                                                      |
| `language`                             | ISO 639-1 language hint. Empty means auto detect.                                                                |
| `outputFormats`                        | `text`, `srt`, `vtt`, `json` files saved to the key-value store.                                                 |
| `maxDurationMinutes`                   | Transcribe at most this many minutes per file. Protects you from surprise costs.                                 |
| `prompt`                               | Names, brands and jargon that help the model spell them right.                                                   |
| `dryRun`                               | Download and split only. No charge per minute.                                                                   |
| `provider`, `apiKey`, `model`          | Optional. Your own Groq or OpenAI key and model. Empty uses the hosted key.                                      |
| `translateToEnglish`                   | Return an English translation. Needs your own key.                                                               |

### Output sample

Real result of the prefilled example, shortened. Download the dataset as JSON, CSV, Excel or HTML.

```json
{
  "sourceUrl": "https://www.archive.org/download/gettysburg_shurtagal_librivox/Gettysburg_Address_Lincoln_64kb.mp3",
  "sourceType": "url",
  "title": "Gettysburg Address",
  "durationSeconds": 100.336,
  "language": "en",
  "text": "This is a LibriVox recording, all LibriVox recordings in the public domain. ... The Gettysburg Address by Abraham Lincoln, November 19, 1863. Four score and seven years ago...",
  "segments": [
    {
      "id": 2,
      "start": 8.04,
      "end": 12.68,
      "text": "The Gettysburg Address by Abraham Lincoln, November 19, 1863."
    },
    {
      "id": 3,
      "start": 13.44,
      "end": 18.38,
      "text": "Four score and seven years ago, our fathers brought forth on this continent a new nation"
    }
  ],
  "segmentsCount": 28,
  "wordCount": 307,
  "srtUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/srt-0000-Gettysburg-Address.srt",
  "vttUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/vtt-0000-Gettysburg-Address.vtt",
  "provider": "groq",
  "model": "whisper-large-v3-turbo",
  "apiKeySource": "hosted",
  "billedMinutes": 2,
  "warnings": [],
  "error": null
}
```

| Field                                   | Description                                                                |
| --------------------------------------- | -------------------------------------------------------------------------- |
| `title`, `feedTitle`, `publishedAt`     | Episode title and date from RSS, or the media title tag, or the file name. |
| `durationSeconds`, `transcribedSeconds` | Length of the file and of the part that was transcribed.                   |
| `language`                              | ISO 639-1 code, detected or from your hint.                                |
| `text`, `segments`                      | Full transcript, and `{id, start, end, text}` with times in seconds.       |
| `srtUrl`, `vttUrl`, `txtUrl`, `jsonUrl` | Files in the key-value store.                                              |
| `provider`, `model`, `apiKeySource`     | What transcribed the file, and whether the hosted key or yours was used.   |
| `billedMinutes`                         | Audio minutes charged for this file.                                       |
| `warnings`, `error`                     | What went wrong or was changed, in plain words.                            |

The **Overview** view shows one row per file. The **Segments** view shows one row per timestamped segment.

### Pricing

Pay per event, one bill. The model cost is included when the hosted key is used.

| Event                                     | Free tier | Bronze  | Silver  | Gold    |
| ----------------------------------------- | --------- | ------- | ------- | ------- |
| Audio minute, per started minute per file | $0.003    | $0.0027 | $0.0024 | $0.0021 |
| Run start, per GB of memory               | $0.001    | $0.001  | $0.001  | $0.001  |

| Audio                 | Free tier | Gold   |
| --------------------- | --------- | ------ |
| 1 hour podcast        | $0.18     | $0.126 |
| 10 episodes of 45 min | $1.35     | $0.95  |
| 100 hours of meetings | $18.00    | $12.60 |

- Minutes are counted per file and rounded up, so a 20 second clip is one minute.
- **Dry runs, rejected links and failed files are free** of the per minute charge.
- The price is the same with your own key. Then your provider also bills you for the model.
- Your discount tier follows your Apify subscription plan.
- Set **Maximum cost per run** in Run options. The Actor stops taking new minutes at the limit and cuts a long file short with a warning.

### Optional: your own API key

The hosted key is shared by all users and has Groq's rate limits. Short waits are retried. If the shared key is out of quota, the run ends with one free row that says so, and files that were not transcribed are not charged. Retry later, or bring your own key:

- **Groq** keys are free to create at [console.groq.com/keys](https://console.groq.com/keys).
- **OpenAI** keys are at [platform.openai.com/api-keys](https://platform.openai.com/api-keys).

Paste the key into **Your own API key** and pick the **Provider**. Your key is needed for **Translate to English** and for models other than whisper-large-v3-turbo.

| Provider | Model                              | Timestamps    | Translation        | Provider price   |
| -------- | ---------------------------------- | ------------- | ------------------ | ---------------- |
| Groq     | `whisper-large-v3-turbo` (default) | Yes           | No, switches to v3 | ~$0.04 per hour  |
| Groq     | `whisper-large-v3`                 | Yes           | Yes                | ~$0.111 per hour |
| OpenAI   | `whisper-1`                        | Yes           | Yes                | $0.006 per min   |
| OpenAI   | `gpt-4o-mini-transcribe`           | No, estimated | No                 | $0.003 per min   |
| OpenAI   | `gpt-4o-transcribe`                | No, estimated | No                 | $0.006 per min   |

### FAQ

**Do I need an API key?** No. Without a key the Actor uses its hosted Groq key with Whisper large v3 turbo.

**Can I transcribe YouTube, TikTok, Instagram, Facebook or Vimeo links?** No. Their terms forbid downloading media with third-party tools, so these page links are rejected with a message. Use a direct link to a file you own or may use, upload the file, or use the podcast RSS feed.

**Is my own API key safe?** It is a secret input that Apify stores encrypted. The Actor sends it only to the provider you picked, never logs it and never writes it to the dataset. Use a separate key with a spending limit.

**Do you store my audio?** Audio is downloaded into the run container, converted, sent to the provider and deleted when the file is done. Transcripts are saved in your own run storage. The provider processes the audio under its own data policy.

**Tips for better transcripts.** Give a language hint for short clips and music intros. Use the vocabulary prompt for names, products and acronyms.

**Known limitations.** No speaker labels yet. Word counts for Chinese and Japanese count characters. Files behind logins or DRM cannot be downloaded.

Found a bug or need speaker labels, summaries or delivery to your storage? Open an issue on the **Issues** tab.

### Related Actors

| Actor                                                                                                               | What it does                                          |
| ------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- |
| [Website Content Crawler to Markdown for RAG & LLMs](https://apify.com/rod_analytics/website-to-markdown)           | Crawl a site and get clean Markdown for RAG and LLMs  |
| [PDF to Markdown & Text Extractor with OCR](https://apify.com/rod_analytics/doc-to-markdown)                        | Turn PDF, DOCX and scans into Markdown or text        |
| [SEO Audit Tool: Site Crawler, Broken Links & Score](https://apify.com/rod_analytics/seo-site-audit)                | Crawl a site for broken links and SEO issues          |
| [PageSpeed Insights & Lighthouse Bulk Checker](https://apify.com/rod_analytics/lighthouse-audit)                    | Core Web Vitals and Lighthouse scores for many URLs   |
| [Tech Stack Detector: Wappalyzer & BuiltWith Alternative](https://apify.com/rod_analytics/tech-stack-detector)      | See which CMS, analytics and frameworks a site uses   |
| [Bulk Domain Lookup: DNS, WHOIS, SPF, DMARC & SSL](https://apify.com/rod_analytics/domain-security-audit)           | DNS, mail security and SSL checks for domain lists    |
| [Email Validator & Verifier: Bulk MX & Disposable Check](https://apify.com/rod_analytics/bulk-email-verifier)       | Clean email lists before you send                     |
| [Website Contact Scraper: Emails, Phones & Social Links](https://apify.com/rod_analytics/company-contact-extractor) | Emails, phones and social links from company websites |
| [VIES VAT Checker & EU Company Registry Lookup](https://apify.com/rod_analytics/eu-company-lookup)                  | Validate EU VAT numbers and look up companies         |
| [Companies House Scraper: UK Company Search & Officers](https://apify.com/rod_analytics/uk-companies-house)         | UK company profiles, officers and filings             |
| [EU TED Tenders Scraper & Alerts: Public Procurement](https://apify.com/rod_analytics/ted-tenders)                  | EU public tenders with daily alerts                   |
| [Greenhouse, Lever & Ashby Job Scraper: 7 ATS in One Feed](https://apify.com/rod_analytics/multi-ats-jobs-api)      | Jobs from 7 ATS platforms in one feed                 |
| [GitHub Scraper: Repo Stats, Stars, Trending & Search](https://apify.com/rod_analytics/github-repo-stats)           | Stars, activity and trending GitHub repos             |

# Changelog

This Actor's version history is a separate document: https://apify.com/rod_analytics/media-transcriber/changelog.md

# Actor input Schema

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

Direct links to media files: MP3, M4A, WAV, FLAC, OGG, OPUS, AAC, MP4, MOV, MKV, WEBM and more. Google Drive and Dropbox share links are converted to direct downloads. YouTube, TikTok, Instagram, Facebook and Vimeo page links are rejected because their terms forbid downloading.

## `rssFeedUrl` (type: `string`):

A podcast RSS or Atom feed. The Actor takes the audio enclosures of the latest episodes and adds the episode title and publish date to the output.

## `maxEpisodes` (type: `integer`):

How many of the newest feed episodes to transcribe.

## `uploadedFile` (type: `string`):

Upload one audio or video file from your computer. Apify stores it in a key-value store and passes its URL to the Actor.

## `keyValueStoreRecords` (type: `array`):

Keys of media records in this run's default key-value store, for example when another Actor calls this one. Use `storeId/key` for other stores. For your own stores the record URL with its signature in Audio or video URLs is more reliable.

## `provider` (type: `string`):

Only used with your own API key. Without a key the Actor uses its hosted Groq key with Whisper large v3 turbo. Groq runs Whisper large v3 turbo very fast and cheap. OpenAI offers gpt-4o-mini-transcribe and whisper-1.

## `apiKey` (type: `string`):

Optional. Leave empty to use the Actor's hosted Groq key: no account needed, same price per minute. Paste your own Groq key (console.groq.com/keys) or OpenAI key (platform.openai.com/api-keys) to choose other models, translate to English, or get your own rate limits. Your key is stored encrypted and used only to call the provider from your run. The provider then bills transcription to your account.

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

`auto` picks whisper-large-v3-turbo on Groq. On OpenAI it picks whisper-1 when you ask for SRT, VTT or JSON timestamps, otherwise gpt-4o-mini-transcribe. Translation uses whisper-large-v3 on Groq and whisper-1 on OpenAI. gpt-4o models return no timestamps, so their subtitle times are estimated. The hosted key always uses whisper-large-v3-turbo.

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

ISO 639-1 code of the spoken language, for example `en`, `de`, `es`, `lt`. Leave empty to detect it automatically. A hint improves accuracy and speed.

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

Return an English translation instead of the original language transcript. Needs your own API key.

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

Files saved to the key-value store for each transcript. The dataset always has plain text and timestamped segments.

## `prompt` (type: `string`):

Optional context for the model: names, brands, jargon or spelling style. Whisper uses about the first 224 tokens.

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

Transcribe at most this many minutes of each file. Longer files are cut and a warning is added. Protects you from surprise costs.

## `dryRun` (type: `boolean`):

Download, convert and split the audio into chunks, then stop. No API key needed, no provider calls, no per minute charge. Use it to check that your files and feed work.

## `chunkMinutes` (type: `integer`):

Long audio is split into chunks of this length with a 5 second overlap. Chunks are mono 16 kHz and stay under 20 MB, below the 25 MB provider limit.

## `concurrency` (type: `integer`):

How many chunks are sent to the provider at the same time. Lower it if your key hits rate limits. 429 responses are retried with backoff.

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

Skip source files larger than this. Video files can be large; only the audio track is used.

## Actor input object example

```json
{
  "audioUrls": [
    "https://www.archive.org/download/gettysburg_shurtagal_librivox/Gettysburg_Address_Lincoln_64kb.mp3"
  ],
  "rssFeedUrl": "https://librivox.org/rss/389",
  "maxEpisodes": 3,
  "keyValueStoreRecords": [],
  "provider": "groq",
  "model": "auto",
  "translateToEnglish": false,
  "outputFormats": [
    "text",
    "srt",
    "vtt",
    "json"
  ],
  "maxDurationMinutes": 180,
  "dryRun": false,
  "chunkMinutes": 10,
  "concurrency": 3,
  "maxFileSizeMb": 1000
}
```

# Actor output Schema

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

No description

## `overview` (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://www.archive.org/download/gettysburg_shurtagal_librivox/Gettysburg_Address_Lincoln_64kb.mp3"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("rod_analytics/media-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://www.archive.org/download/gettysburg_shurtagal_librivox/Gettysburg_Address_Lincoln_64kb.mp3"] }

# Run the Actor and wait for it to finish
run = client.actor("rod_analytics/media-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://www.archive.org/download/gettysburg_shurtagal_librivox/Gettysburg_Address_Lincoln_64kb.mp3"
  ]
}' |
apify call rod_analytics/media-transcriber --silent --output-dataset

```

## MCP server setup

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