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

Transcribe podcast RSS feeds and audio or video URLs to text, timestamped segments, SRT and VTT subtitles. Optional: translate to any language (text + SRT) and get YouTube chapters, a summary and keywords. Whisper large-v3-turbo, 99 languages. $0.004 per audio minute.

- **URL**: https://apify.com/brasspage/media-transcriber.md
- **Developed by:** [Brasspage](https://apify.com/brasspage) (community)
- **Categories:** AI, Videos, For creators
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

### Podcast transcription and speech to text: audio and video to text, SRT and VTT

Transcribe **podcast RSS feeds** and **direct audio or video file URLs** to text with OpenAI's open **Whisper large-v3-turbo** model. For every file you get the full transcript, timestamped segments, **SRT and VTT subtitles**, the detected language, the duration and the word count.

**Price: $0.004 per audio minute.** A 1-hour podcast episode costs $0.24. You pay only for the minutes that the Actor transcribes. On the Apify free plan, you can try the first 5 audio minutes of each run, up to 30 free minutes per month (see [Limits](#limits)).

#### New: translation and chapters

Both are optional and off by default.

- **Translate to any language** (`translateTo`): set a language code such as `es`, `de`, `fr`, `ja` or `pt-BR`. You get the translated text and a **translated SRT file with the same timestamps**, ready to upload as a second subtitle track. Use `en` to get English subtitles for a podcast in another language. **$0.002 per audio minute.**
- **Chapters, summary and keywords** (`chapters: true`): 5 to 15 chapter markers with titles and start times, as YouTube description lines (`00:00 Intro`), plus a 3-sentence summary and 5 keywords. Paste the lines into a YouTube description or your show notes. **$0.01 per file.**

When you turn on both, the chapters, summary and keywords are in the translation language.

### What you get

For each episode or file, one row with:

- **The full transcript**, plus the detected language, the duration and the word count.
- **Timestamped segments** (start, end, text).
- **SRT and VTT subtitles**, in the row and as files to download, with a `.txt` transcript.
- **Episode details** for podcast feeds: show title, episode title, GUID and publish date.
- **Optional extras:** a translation with its own SRT file, and chapters, a summary and keywords.
- **No charge for failures:** a file that fails gives a row with an `error` field.

### Quick start

1. Keep the prefilled NPR News Now feed, or paste your podcast RSS feed or a direct audio or video URL.
2. Optional: set **Translate to** (for example `es`) and turn on **Chapters, summary and keywords**.
3. Click **Start**. A 5-minute episode is ready in about 10 seconds and costs about $0.03.
4. Read the text in the **Output** tab, or download the `.txt`, `.srt` and `.vtt` files.

### What you can do with it

- **Podcast transcription:** give a feed URL and get the latest N episodes as text. Schedule it with "Only new episodes since last run" to transcribe each new episode as it comes out.
- **Video to text:** send MP4, MOV or WEBM links. The Actor takes the audio track only. Files can be up to 2 GB.
- **Subtitles:** download ready-to-use `.srt` and `.vtt` files for video players, YouTube Studio uploads or editing tools.
- **Subtitles in other languages:** translate the SRT to Spanish, German, Japanese or any other language, with the original timestamps.
- **Show notes and YouTube chapters:** get chapter lines, a summary and keywords for each episode.
- **AI agents, RAG and LLM pipelines:** clean text plus `{start, end, text}` segments in JSON. Call it from the Apify API, the Apify MCP server, LangChain, n8n, Make or Zapier.
- **Content repurposing and SEO:** turn episodes into show notes, blog posts, quotes and searchable archives.
- **Research and monitoring:** track what is said on news, finance or industry podcasts.

### How it works

1. You give podcast RSS feed URLs, direct media file URLs, or upload a file.
2. For feeds, the Actor reads the public RSS feed and takes the newest episodes (you can filter by date).
3. The Actor downloads the file from public hosts only, and ffmpeg converts the audio to 16 kHz mono. Long files are split into 20-minute parts and the timestamps are joined again, so 3-hour episodes work.
4. Whisper large-v3-turbo transcribes the audio. 99 languages are supported, with automatic language detection.
5. Optional: an open LLM (gpt-oss-20b) translates the segments in batches and keeps each segment's timestamps, and writes the chapters, summary and keywords.
6. You get one dataset row per file, plus `.txt`, `.srt` and `.vtt` files (and the translated `.txt` and `.srt`) in the run's key-value store.

### Input

| Field                   | Description                                                                                                                                                         |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `podcastRssUrls`        | Public podcast RSS feed URLs.                                                                                                                                       |
| `maxEpisodesPerFeed`    | How many of the newest episodes to transcribe per feed (default 1).                                                                                                 |
| `publishedAfter`        | Skip episodes published before this date (`YYYY-MM-DD`).                                                                                                            |
| `onlyNewSinceLastRun`   | Skip episodes that an earlier run already transcribed. Use with a schedule.                                                                                         |
| `mediaUrls`             | Direct links to MP3, M4A, AAC, WAV, OGG, OPUS, FLAC, MP4, MOV, MKV or WEBM files. Apify key-value store record URLs also work (private stores in your account too). |
| `audioFile`             | Upload one file from your computer.                                                                                                                                 |
| `language`              | ISO-639-1 code such as `en`, `es` or `de`. Empty means automatic detection. Setting it improves accuracy.                                                           |
| `translateTo`           | Optional. Language code to translate into, such as `es`, `de`, `ja` or `pt-BR`. Empty means no translation.                                                         |
| `chapters`              | Optional. `true` adds chapters, a 3-sentence summary and 5 keywords.                                                                                                |
| `maxAudioMinutesPerRun` | Safety limit: total audio minutes per run (default 600). A file that goes over the limit is cut at the limit.                                                       |

#### Example input

```json
{
  "podcastRssUrls": ["https://feeds.npr.org/500005/podcast.xml"],
  "maxEpisodesPerFeed": 3,
  "mediaUrls": ["https://example.com/interview.mp4"],
  "language": "en",
  "translateTo": "es",
  "chapters": true
}
```

`https://feeds.npr.org/500005/podcast.xml` is NPR News Now, a public 5-minute news podcast. It is a quick, cheap way to try the Actor.

### Output

One dataset item per file:

```json
{
  "sourceUrl": "https://feeds.npr.org/500005/podcast.xml",
  "feedTitle": "NPR News Now",
  "episodeTitle": "NPR News: 10-15-2026 1AM EDT",
  "episodeGuid": "nx-s1-20261015-0100",
  "publishedAt": "2026-10-15T01:00:00-04:00",
  "mediaUrl": "https://.../default.mp3",
  "durationSec": 318.48,
  "language": "English",
  "wordCount": 812,
  "text": "Live from NPR News, I'm ...",
  "segments": [
    { "start": 0.0, "end": 4.2, "text": "Live from NPR News, I'm ..." }
  ],
  "srt": "1\n00:00:00,000 --> 00:00:04,200\nLive from NPR News, I'm ...\n",
  "vtt": "WEBVTT\n\n00:00:00.000 --> 00:00:04.200\nLive from NPR News, I'm ...\n",
  "txtUrl": "https://api.apify.com/v2/key-value-stores/.../records/transcript-0001.txt",
  "srtUrl": "https://api.apify.com/v2/key-value-stores/.../records/transcript-0001.srt",
  "vttUrl": "https://api.apify.com/v2/key-value-stores/.../records/transcript-0001.vtt",
  "minutesBilled": 6,
  "model": "whisper-large-v3-turbo",
  "llmModel": "openai/gpt-oss-20b",
  "translatedLanguage": "es",
  "translatedText": "En vivo desde NPR News, soy ...",
  "translatedSrt": "1\n00:00:00,000 --> 00:00:04,200\nEn vivo desde NPR News, soy ...\n",
  "translatedTxtUrl": "https://api.apify.com/v2/key-value-stores/.../records/transcript-0001.es.txt",
  "translatedSrtUrl": "https://api.apify.com/v2/key-value-stores/.../records/transcript-0001.es.srt",
  "translationMinutesBilled": 6,
  "chapters": [
    { "start": 0, "title": "Titulares" },
    { "start": 92, "title": "Investigación federal" }
  ],
  "chaptersText": "00:00 Titulares\n01:32 Investigación federal",
  "summary": "Three sentences about the episode.",
  "keywords": ["economía", "Ucrania", "Tennessee", "encuesta", "Starlink"],
  "transcribedAt": "2026-10-15T05:12:00+00:00"
}
```

The translation and chapter fields appear only when you turn those options on. If a translation or the chapters fail, the row has a `translationError` or `chaptersError` field, you still get the transcript, and you are not charged for the failed part.

If a file or feed fails (for example a 404, or a URL that is not media), you get a row with an `error` field and you are not charged for it.

### Pricing

Pay per event. There is no monthly fee.

| Event                | Price                                                   |
| -------------------- | ------------------------------------------------------- |
| Actor start          | $0.005 per run                                          |
| `audio-minute`       | $0.004 per started minute of audio, per file            |
| `translation-minute` | $0.002 per started minute of audio, per translated file |
| `chapters-run`       | $0.01 per file with chapters, summary and keywords      |

Examples: a 5-minute news episode costs about $0.025. A 45-minute interview costs $0.185, or $0.285 with a translation and chapters. 100 hours of audio cost $24.

Set **Maximum cost per run** in the run options to cap your spending. The Actor stops before a file that does not fit in the remaining budget.

#### Limits

- **Max audio minutes per run** (`maxAudioMinutesPerRun`, default 600 = 10 hours). The run stops when it reaches this total. A file that goes over the limit is cut at the limit, and you pay only for the minutes you get. The last dataset row has a `note` that tells you the limit was reached. Raise the limit or start another run for more.
- **Apify free plan: free trial of 5 audio minutes per run and 30 free minutes per month.** On the free plan, the Actor transcribes only the first 5 audio minutes of each run, then stops with a note. Each audio minute, translated minute and chapters run counts as one free minute. After 30 in a calendar month (UTC), runs return only a note until the 1st of the next month. To get full transcripts of all your files, upgrade to a [paid Apify plan](https://apify.com/pricing). Paid plans have no trial limit.
- With **Only new episodes since last run**, an episode that was cut is not marked as done, so a later run transcribes all of it.
- Translation and chapters use only the transcribed minutes. On the free plan, you can try them on the 5 trial minutes of each run.

### FAQ

**Can I transcribe YouTube, Spotify, TikTok or Instagram links?**
No. The terms of those platforms do not allow downloading their media, so the Actor rejects those page URLs. Use direct media file URLs or public podcast RSS feeds. Most podcasts that are on Spotify or Apple Podcasts also publish a public RSS feed. Search for "<show name> RSS feed" to find it.

**Which languages are supported?**
All 99 Whisper languages, for example English, Spanish, German, French, Portuguese, Italian, Japanese, Chinese, Hindi and Arabic. Set `language` when you know it.

**How long can a file be?**
Files can be up to 2 GB. A run transcribes up to 600 audio minutes by default; raise `maxAudioMinutesPerRun` for more. Long files are split into 20-minute parts. Each part is sent separately, and the timestamps are joined back into one timeline.

**How good is the translation?**
Good for clear speech in widely used languages. The model translates each subtitle line separately, so every translated line keeps its original timestamps. Names, numbers and technical terms can need a quick check before you publish.

**Can the audio trick the AI that writes chapters or translations?**
The transcript goes to the model only as data, with fixed instructions. The model has no tools and no internet access. The Actor accepts only the expected JSON shape and drops everything else, for example extra fields, wrong line counts, or links and HTML that are not in the transcript.

**How fast is it?**
Usually 1 to 2 minutes for a 1-hour episode. A 5-minute episode takes about 10 seconds.

**How accurate is it?**
Whisper large-v3-turbo gives near state-of-the-art accuracy for clear speech. Music, heavy cross-talk and low-quality phone audio reduce accuracy. Speaker labels (diarization) are not included.

**How do I use it from an AI agent or my code?**
Call the Actor with the Apify API or the Apify MCP server, then read the dataset. The `text` field is ready for an LLM, and `segments` let you cite timestamps. To give an AI agent this one tool, connect it to the Apify MCP server at `https://mcp.apify.com?tools=brasspage/media-transcriber`.

**Who is responsible for the rights to the audio?**
You are. Only transcribe media that you own, that is public, or that you have permission to process. The Actor does not store your media after the run, and it does not try to get around paywalls or logins.

**Something does not work?**
Open an issue on the Issues tab with the run URL. Fixes are usually quick.

### Related Actors

Other tools from the same developer, with the same pay-per-result pricing:

- [ATS Jobs API](https://apify.com/brasspage/careers-site-jobs-api): every open job from Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee and Personio boards, with new-job alerts.
- [Google Sheets Export & Sync](https://apify.com/brasspage/google-sheets-sync): send the results of any Actor to a Google Sheet (append, replace or upsert).
- [Website Contacts & Tech Stack](https://apify.com/brasspage/website-contact-tech-audit): public emails, phones, social links, CMS and pixels for a list of websites.
- [PDF OCR to Markdown](https://apify.com/brasspage/pdf-ocr-to-markdown): scanned PDFs and images to clean Markdown with tables, for $0.006 per page.

# Actor input Schema

## `podcastRssUrls` (type: `array`):

Public podcast RSS feeds. The Actor transcribes the latest episodes of each feed (see 'Latest episodes per feed').

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

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

## `publishedAfter` (type: `string`):

Skip feed episodes published before this date (YYYY-MM-DD).

## `onlyNewSinceLastRun` (type: `boolean`):

Remember transcribed episodes (in a named key-value store in your account) and skip them next time. Good for scheduled runs.

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

Direct links to media files (MP3, M4A, WAV, OGG, FLAC, MP4, MOV, WEBM, ...), including Apify key-value store record URLs. Page URLs from YouTube, Spotify, TikTok, Instagram and similar sites are not supported.

## `audioFile` (type: `string`):

Upload one audio or video file from your computer.

## `translateTo` (type: `string`):

Optional. Language code to translate the transcript into, for example es, de, fr, ja or pt-BR. You get the translated text and a translated SRT file with the same timestamps. Leave empty for no translation. $0.002 per audio minute.

## `chapters` (type: `boolean`):

Optional. Add 5-15 chapter markers with titles and start times as YouTube description lines ('00:00 Intro'), a 3-sentence summary and 5 keywords. With a translation, they are in the translation language. $0.01 per file.

## `maxAudioMinutesPerRun` (type: `integer`):

Safety limit. The run stops after this many audio minutes in total. A file that goes over the limit is cut at the limit, and the last dataset row says so. On the Apify free plan, runs are a free trial of the first 5 audio minutes per run and 30 free minutes per month (translation and chapters count too); upgrade to a paid Apify plan for full transcripts.

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

ISO-639-1 code of the spoken language (for example en, es, de). Leave empty to detect it automatically. Setting it improves accuracy.

## Actor input object example

```json
{
  "podcastRssUrls": [
    "https://feeds.npr.org/500005/podcast.xml"
  ],
  "maxEpisodesPerFeed": 1,
  "onlyNewSinceLastRun": false,
  "chapters": false,
  "maxAudioMinutesPerRun": 600
}
```

# Actor output Schema

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

One item per audio or video file: episode and feed title, duration, language, word count, full text, timestamped segments, SRT/VTT text and links, minutes billed, or an error. With translation: translated text and SRT (same timestamps) and their links. With chapters: chapter list, YouTube chapter lines, summary and keywords. A last row with a note appears when the run stops at its minute limit.

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

Key-value store with transcript-NNNN.txt, .srt and .vtt files for each transcribed file, plus transcript-NNNN.<language>.txt and .srt when you translate.

# 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 = {
    "podcastRssUrls": [
        "https://feeds.npr.org/500005/podcast.xml"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("brasspage/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 = { "podcastRssUrls": ["https://feeds.npr.org/500005/podcast.xml"] }

# Run the Actor and wait for it to finish
run = client.actor("brasspage/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 '{
  "podcastRssUrls": [
    "https://feeds.npr.org/500005/podcast.xml"
  ]
}' |
apify call brasspage/media-transcriber --silent --output-dataset

```

## MCP server setup

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