Video & Audio Transcriber - Word-Level SRT & VTT
Pricing
from $19.40 / 1,000 transcribed minutes
Video & Audio Transcriber - Word-Level SRT & VTT
Transcribe video or audio files from a link: mp4, mov, webm, mp3, wav or m4a, one file or a batch. Each row holds the full text, timed segments, a start and end for every word, and SRT, VTT and TXT links. Runs on your own OpenAI key. $20.00 per 1,000 transcribed minutes ($0.02 a minute).
Pricing
from $19.40 / 1,000 transcribed minutes
Rating
5.0
(1)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Transcribe any video or audio file into text, with a start and end time on every word: give it
a public link to the file and get back the full transcript, sentence-level segments and the word
list, plus ready-made .srt, .vtt and .txt files in the run's storage.
You bring your own OpenAI key, so the transcription itself is billed to you by OpenAI on top of what you pay here. And plan around long recordings: anything much past 50 minutes of speech is likely to be refused.
| Input | One public media URL, or a list of them. mp4, mov, webm, mp3, wav, m4a |
| Output | One row per file, with the transcript, segments, words and file links |
| Ceiling | Around 50 minutes of speech per file, and about 5 GB per file at the default memory |
| Account needed | Your own OpenAI API key |
| Price | $20.00 per 1,000 transcribed minutes, so $0.02 a minute on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 250 minutes. OpenAI bills your key separately |
🔍 What Video & Audio Transcriber does
It downloads the file you point it at, pulls the speech out as compressed mono audio, and sends that for transcription. What comes back is the plain text, the segments with their timings, and the word list with a start and end time on each word. That word list is what karaoke-style captions need.
Give it mediaUrls instead of mediaUrl and it walks the list, writing one row per file. A file
that fails does not stop the ones after it.
📋 What data you get from each transcribed file
| What you get | Field |
|---|---|
| The whole transcript as one string | text |
| Sentence-sized cues with their start and end | segments |
| Every word with its own start and end, in seconds | words |
| The language it was transcribed in | language |
| Word and segment counts | wordCount, segmentCount |
| The billed length: where the last speech segment ends | durationSeconds |
| SRT, VTT and TXT files in the run's storage, with download links | srtKey, srtUrl, vttKey, vttUrl, txtKey, txtUrl |
| Which input link the row belongs to | sourceUrl |
▶️ How to transcribe a video or audio file
- Open Video & Audio Transcriber and click Try for free.
- Paste a direct file link into Media URL, or a list into Media URLs (batch).
- Put your key into OpenAI API key (BYO).
- Leave Include word timestamps on if you want karaoke captions, then click Start.
- Read the rows in the dataset, or open the run's Key-value store tab for the subtitle files.
Start it with no key or no link and you get the free sample row instead.
💰 How much does it cost to transcribe video or audio?
$0.02 per transcribed minute on the Free plan, $0.0198 on Starter, $0.0196 on Scale and $0.0194 on Business. A 12-minute clip is 12 minutes, rounded up to the next whole minute, with one minute as the smallest charge per file. On the free plan, the $5 Apify gives you each month covers about 250 minutes.
The length billed is the speech in the file, measured to where the last segment ends, so silence at the end costs nothing. A file that fails and the sample row are not billed any minutes. If the maximum cost you set on the run cannot cover the next file, that file and the rest of the batch are skipped and not charged.
Your OpenAI key is charged separately by OpenAI for the transcription itself.
📥 What you give it
{"mediaUrl": "https://example.com/podcast.mp3","language": "auto","wordTimestamps": true,"outputFormats": ["srt", "vtt", "txt"],"openaiApiKey": "sk-..."}
| Field | Default | What it is |
|---|---|---|
mediaUrl | none | A public, direct link to one video or audio file. |
mediaUrls | none | A list, for a batch. One dataset row per URL. You can use this instead of mediaUrl or alongside it. |
language | auto | ISO code of the spoken language, or auto to detect it. |
wordTimestamps | true | Adds the per-word words array to the row. Turn it off for a much smaller row on long files. |
outputFormats | ["srt", "vtt"] | Which files to write into the run's storage. The form starts at srt, vtt and txt, which is a prefill, not the default. |
openaiApiKey | none | Your own key. Marked secret, so it is not stored with the run input. |
model | whisper-1 | Any transcription model your key can reach. |
baseUrl | none | Point it at any OpenAI-compatible endpoint. Empty means https://api.openai.com/v1. |
The URL has to be the file itself, not a page that plays it. A link ending in .mp4 or .mp3
works; a video page does not.
📤 What you get back
No run on record has transcribed a file with a customer's key, so here is the real sample row a
keyless run wrote on 3 October 2026, notice cut short. A delivered row has the same shape plus your
sourceUrl, the words array when word timings are on, and a key and link for each file format
you asked for.
{"_demo": true,"_notice": "SAMPLE OUTPUT ... provide a \"mediaUrl\" and \"openaiApiKey\" for a real transcript.","ok": true,"sourceUrl": null,"language": "en","text": "Welcome back to the show. Today we cover the deep ocean.","wordCount": 11,"segmentCount": 2,"durationSeconds": 8,"segments": [{ "id": 0, "start": 0, "end": 4, "text": "Welcome back to the show." },{ "id": 1, "start": 4, "end": 8, "text": "Today we cover the deep ocean." }],"srtKey": null,"vttKey": null}
| Field | How to read it |
|---|---|
words | One entry per word, { word, start, end } in seconds. Present only when wordTimestamps is on. |
segments | Sentence-sized cues. This is what the .srt and .vtt files are built from. |
durationSeconds | Where the last speech segment ends, rounded. This is the length that gets billed, not the file's own runtime. |
srtUrl, vttUrl, txtUrl | Download links, present only for the formats you asked for. |
sourceUrl | Which input URL this row belongs to. On a batch this is the only way to tell rows apart. |
🧾 Reading the output
Four kinds of row can land in your dataset.
| Row | How to spot it | Charged a minute |
|---|---|---|
| A transcript | ok: true and a sourceUrl | yes |
| A failed file | ok: false and an error string | no |
| A file skipped at your cost limit | ok: false, _diagnostic: true, errorCode: "MAX_COST_TOO_LOW" | no |
| The sample row | _demo: true | no |
Check ok before you count rows. A failed file still writes a row, so a batch of ten can show
ten rows with only six transcripts among them. The error field on those rows says what went wrong:
a download that failed, a file over the size limit, no speech in the audio, or the status your
provider returned.
MAX_COST_TOO_LOW rows carry minutesNeeded and minutesCovered. The batch stops there, and the
run's status message says how many files were done and how many were left uncharged.
The default table view hides sourceUrl and error. Switch the dataset to All fields, or
export as JSON, when you are working through a batch.
💡 What people use it for
- Word-timed captions for Shorts and Reels, where each word pops as it is spoken.
- Turning a podcast back catalogue into searchable text, one run per batch of episodes.
- Pulling quotes out of recorded interviews with a timestamp you can jump to.
- Getting a
.vtttrack ready to upload alongside a video for accessibility.
From a long talk to a voiced short, in three runs:
- Transcribe the talk here.
- Put the rows into Sources on
Story to Script Rewriter. It reads
textoff each row and writes a short spoken script. - Put its rows into Texts (batch) on
AI Text to Speech Voiceover, which reads
scriptoff each one and hands back the audio.
🚧 What it does not do
- It does not split long recordings. The audio goes up as one upload, and transcription endpoints commonly stop at 25 MB. At the bitrate used here that lands somewhere around 50 minutes of speech, so a full hour is likely to be refused. Cut long files before sending them.
- No speaker labels. You get the words and the timings, not who said them.
- It does not resolve a video page. Give it the file URL, not the page the player sits on.
- The run finishes even when every file failed. Failures are rows, not a failed run, so always
read
ok. - A run stops at one hour and a single download stops after 15 minutes, whichever comes first.
- Rows get large. An hour of speech with word timestamps is a heavy JSON row. Turn
wordTimestampsoff when you only need the text. - Accuracy is the model's. Accents, crosstalk and background noise affect it, and naming the language usually helps more than changing anything else here.
- It is not an official tool of any platform or company named on this page. Dami's Studio is independent and is not affiliated with or endorsed by any of them.
🧭 Which transcript tool do you need?
| If you want | Use |
|---|---|
| A transcript with word-level timings from a file you host | This one |
| The captions a YouTube video already has, as text, SRT and VTT | YouTube Transcript Scraper |
| The spoken words from a TikTok video, from its caption track | TikTok Transcript Scraper |
| That transcript translated into other languages | Subtitle Translator |
| Captions burned into the picture | Auto Caption Burner |
| A video re-voiced in another language | AI Video Dubber |
❓ Questions people ask
What counts as a transcribed minute?
The speech in the file, measured to the end of the last segment and rounded up. Silence at the end
of a recording does not add to it, which is also why durationSeconds can be shorter than your
file.
Can I use a different provider than OpenAI?
Yes. Set baseUrl to any OpenAI-compatible endpoint and model to whatever it serves.
Why did one file in my batch come back empty?
Read its error field. Most often the link was not a direct file link, or the audio had no speech
in it.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has ready-made
code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/video-audio-transcriber. Either way
the run happens on your Apify account at the same price, and OpenAI bills your key as usual.
Is it legal to transcribe a recording?
Only transcribe media you own or have the right to use. Recordings of people carry personal data, which GDPR and similar laws cover, so have a reason for holding it. Apify's write-up on scraping and the law is a reasonable starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the run ID and the media URL you used. The error
field on the failing row usually names the problem on its own.