# Audio & Video to Text: Podcast Transcript + On-Screen Text (`fraserlabs/audio-video-transcript`) Actor

Podcast, audio and video links to AI-ready text: timestamped transcript (Whisper large-v3-turbo, ~100 languages) plus on-screen text for videos. Direct files, RSS episode links, SoundCloud. $0.005 per minute, no API key, failed links free.

- **URL**: https://apify.com/fraserlabs/audio-video-transcript.md
- **Developed by:** [FraserLabs](https://apify.com/fraserlabs) (community)
- **Categories:** AI, Videos, Developer tools
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 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?

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: Podcast Transcript + On-Screen Text

Paste a link to a podcast episode, an audio file or a video, get back **a timestamped transcript** as clean JSON, plus the **text shown on screen** for videos. Each link also gets a ready-to-paste text block for ChatGPT, Claude, Gemini, or your own pipeline.

**$0.005 per minute of media** (a 1-hour podcast costs $0.30). You pay only for links processed successfully. No login, no API key of your own, no account anywhere.

### What you can use it for

- **Podcast transcripts.** Turn episodes into searchable text for show notes, clips, quotes, SEO pages or research.
- **AI agents and RAG.** Feed audio and video into embeddings or a prompt. The `llm_text` field is one block per link.
- **Meeting, lecture and interview recordings.** Any public audio or video file link works: `.mp3`, `.m4a`, `.wav`, `.mp4`, `.mov`, `.webm` and more.
- **Video research.** For videos, on-screen text (slides, titles, burned-in captions, name tags) comes with timestamps next to the speech.

### Why this Actor

| | This Actor | Typical transcription Actor |
|---|---|---|
| Transcript with timestamps | Yes (Whisper large-v3-turbo, ~100 languages) | Yes |
| **On-screen text** for videos, with timestamps | **Yes** | No |
| Music / silence | Detected and skipped: no invented "Thank you." lines; `speech_seconds` tells you how much voice there is | Whisper-based tools may invent text on music |
| Long files | Up to 3 hours per link | Often 1 hour or less |
| Price | **$0.005 per minute**, no API key needed | $0.006-0.015 per minute, or bring your own key |

### Sample output

From a public TED Radio Hour episode (49.7 minutes; URL and lists shortened):

```json
{
  "url": "https://.../npr.simplecastaudio.com/.../default.mp3",
  "platform": "generic",
  "duration_s": 2979.16,
  "language": "en",
  "speech_seconds": 2934.4,
  "hook": { "spoken": "This is the TED Radio Hour.", "on_screen": "" },
  "transcript": [
    { "start": 0.0, "end": 3.28, "text": "This is the TED Radio Hour." },
    { "start": 4.42, "end": 6.82, "text": "Each week, groundbreaking TED Talks." },
    { "start": 6.84, "end": 8.1, "text": "Our job now is to dream big." }
  ],
  "transcript_text": "This is the TED Radio Hour. Each week, groundbreaking TED Talks. Our job now is to dream big. ...",
  "on_screen_text": [],
  "llm_text": "VIDEO: https://.../default.mp3\n...\nTRANSCRIPT:\n[0:00.0] This is the TED Radio Hour.\n...",
  "status": "ok"
}
```

The full transcript of that episode is 7,373 words and took about 75 seconds.

#### Output fields

| Field | Meaning |
|---|---|
| `transcript` | Spoken words as timestamped segments (seconds). Empty when there is no speech. |
| `transcript_text` | The transcript as one string. |
| `on_screen_text` | Videos only: text shown in the video with `start`/`end` (seconds), `position` (top/middle/bottom) and `kind` = `caption` (repeats the speech) or `overlay` (not spoken). |
| `hook` | What is said (and shown) in the first 3 seconds. |
| `speech_seconds` | Seconds of detected voice. Lets you filter music-only files. |
| `duration_s` | Length of the media in seconds (what the per-minute price is based on). |
| `creator`, `caption`, `views`, `published_at` | Filled when the page provides them (hosting pages); `null` for direct file links. |
| `language` | Detected spoken language (ISO code). |
| `llm_text` | Everything above as one plain-text block, ready to paste into an AI model. |
| `status` | `ok`, or `error` with an `error` message. Failed links are **not charged**. |

### How to use it

1. Paste one or more public links into **Audio / video URLs**:
   - a **direct file** link (`https://.../episode.mp3`, `.mp4`, `.m4a`, `.wav` ...);
   - a **podcast episode**: the audio URL from the show's RSS feed (the `enclosure` link). Feeds from NPR, Simplecast, Megaphone, Omny, Buzzsprout, Transistor, Spreaker, BBC and others were tested;
   - a **page with an embedded video or audio**, e.g. SoundCloud or Streamable.
2. Click **Start**.
3. Download the results as JSON, CSV or Excel, or read them through the Apify API, integrations (Make, Zapier, n8n) or the Apify MCP server for AI agents.

Input example:

```json
{
  "urls": [
    "https://example.com/podcast/episode-42.mp3",
    "https://soundcloud.com/forss/flickermood"
  ]
}
```

Links are processed one after another within a run (a 50-minute episode takes about a minute). For large batches, split the links over several runs to process them in parallel.

### Pricing

- **$0.005 per started minute** of media, only for links processed successfully (minimum 1 minute per link).
- Examples: 10-minute video = $0.05 · 1-hour podcast = $0.30 · 3-hour podcast = $0.90.
- Files longer than 3 hours are skipped and **not charged**. Failed links (private, deleted, login-only, unreachable) are **not charged**.
- Set **Maximum cost per run** in the run options to cap your spend. The Actor stops cleanly when the cap is reached.

### Settings

| Setting | Default | What it does |
|---|---|---|
| Audio / video URLs | (required) | Public links, one per line. |
| Read on-screen text | on | Videos only. Turn off if you only need the transcript. |
| Add llm_text field | on | One ready-to-paste text block per link. |
| Proxy configuration | automatic | Leave empty. The Actor uses Apify datacenter proxy and switches to residential automatically if a site blocks a request. |

### Limitations

- **Public links only.** Anything that needs a login, a paywall or DRM (Spotify, Apple Music, Netflix ...) cannot be processed and is not charged.
- **Instagram, TikTok and Facebook** links are not processed here: use the sister Actors [Instagram Reels Transcript](https://apify.com/fraserlabs/instagram-reels-transcript), [TikTok Transcript](https://apify.com/fraserlabs/tiktok-transcript) and [Facebook Reels Transcript](https://apify.com/fraserlabs/facebook-reels-transcript) (priced per video, with hooks and post stats).
- **YouTube** is not supported.
- **Up to 3 hours** per link.
- **On-screen text** is most accurate on designed text (titles, slides, captions). Text physically in the scene is read less reliably.
- **Songs:** lyrics may appear in the transcript; pure music returns an empty transcript.
- **Need frames?** [Video Frame Extractor](https://apify.com/fraserlabs/video-frame-extractor) returns the key frames of video links as image URLs, each with its timestamp and the text visible on it ($2 per 1,000 frames).

### FAQ

**Do I need an account or API key anywhere?** No. Speech-to-text is included in the price.

**Which languages are supported?** Speech in about 100 languages (Whisper large-v3-turbo). On-screen text is tuned for Latin-script text.

**Is this legal?** The Actor processes publicly available media and collects no personal data. You are responsible for how you use the output under the source's terms and the laws that apply to you (e.g. copyright, GDPR).

**Something wrong with a result?** Open an issue on the Actor's Issues tab with the link. Reliability fixes ship within 24 hours.

# Actor input Schema

## `urls` (type: `array`):

Public links, one per line: direct audio/video files (.mp3, .m4a, .wav, .mp4, .mov, .webm ...), podcast episode links (the episode's audio URL from its RSS feed, or its page on hosts like SoundCloud), and pages with an embedded video. No login needed. You pay per started minute of media, only for links processed successfully. For Instagram, TikTok or Facebook use FraserLabs' dedicated Actors.

## `includeOnScreenText` (type: `boolean`):

For videos: read text shown in the video (titles, burned-in captions, slides, name tags) with timestamps. Ignored for audio-only links.

## `includeLlmText` (type: `boolean`):

One plain-text block per link with title, timestamped transcript and on-screen text, ready to paste into ChatGPT, Claude or your own pipeline.

## `proxyConfiguration` (type: `object`):

Leave empty: the Actor uses Apify datacenter proxy and switches to residential automatically only when a site blocks a request.

## Actor input object example

```json
{
  "urls": [
    "https://www.w3schools.com/html/mov_bbb.mp4"
  ],
  "includeOnScreenText": true,
  "includeLlmText": true
}
```

# Actor output Schema

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

One item per video: transcript, on-screen text, hook, caption and stats.

## `llmText` (type: `string`):

One plain-text block per video, ready to paste into an AI model.

# 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 = {
    "urls": [
        "https://www.w3schools.com/html/mov_bbb.mp4"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fraserlabs/audio-video-transcript").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 = { "urls": ["https://www.w3schools.com/html/mov_bbb.mp4"] }

# Run the Actor and wait for it to finish
run = client.actor("fraserlabs/audio-video-transcript").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 '{
  "urls": [
    "https://www.w3schools.com/html/mov_bbb.mp4"
  ]
}' |
apify call fraserlabs/audio-video-transcript --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fraserlabs/audio-video-transcript"
        }
    }
}
```

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/SieqDnO9MFzWdhdy1/builds/Ik5G6ONtrKZ6P9OUm/openapi.json
