Subtitle Generator - SRT/VTT (Whisper, bilingual, CJK-aware)
DeprecatedPricing
from $15.00 / 1,000 transcribed minutes
Subtitle Generator - SRT/VTT (Whisper, bilingual, CJK-aware)
DeprecatedTurn audio or video files into clean SRT/VTT subtitles with Whisper on CPU. Readable cue splitting (line length, CJK-aware), word timestamps, English translation and bilingual subtitles. No API key needed.
Pricing
from $15.00 / 1,000 transcribed minutes
Rating
0.0
(0)
Developer
Aoi
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Share
Subtitle Generator - SRT / VTT from audio & video (Whisper)
Turn any audio or video file into clean, readable subtitles with OpenAI's Whisper running on CPU inside Apify. No API key, no sign-up with a third party, no file ever leaves the Apify platform.
What makes this one different from a plain transcriber:
- Broadcast-style cues. Subtitles are rebuilt from word timestamps into cues that respect a maximum line length, a maximum number of lines and a maximum duration, and break at sentence ends and pauses, instead of dumping Whisper's raw segments.
- CJK-aware. Japanese, Chinese and Korean have no spaces; wide characters are counted properly, lines break
after punctuation, and cues follow Whisper's phrase boundaries.
maxCharsPerLine: 32gives tidy 16-character Japanese lines for vertical video. - Bilingual subtitles. One click adds an English translation under every original line - for language learning content, travel vlogs and interviews.
- Word-level timestamps on request, for karaoke-style or word-highlight captions.
- Whisper large-v3-turbo on the Accurate tier: near large-v3 accuracy at a fraction of its cost. Japanese narration comes out with correct proper nouns and punctuation (a punctuation prompt is applied automatically for Japanese).
- Three quality levels (small greedy / small / large-v3-turbo) so you can trade speed for accuracy per job.
Input
| Field | Type | Default | Description |
|---|---|---|---|
mediaUrls | array | - | Direct links to mp3, wav, m4a, ogg, flac, mp4, mov, webm, mkv... (anything FFmpeg decodes). YouTube / TikTok page links are not supported; pass a direct file URL. |
language | string | auto | ISO 639-1 code (en, ja, es...). Empty = auto-detect. |
quality | enum | balanced | fast (small, greedy), balanced (small, default), accurate (large-v3-turbo, ~3x slower, best for Japanese/Chinese/accents). |
translateToEnglish | boolean | false | Adds English transcript + English SRT/VTT (second pass). |
bilingualSubtitles | boolean | false | Extra SRT with original line + English line in every cue. |
maxCharsPerLine | integer | 42 | Wide (CJK) characters count double. 32 for mobile/vertical. |
maxLinesPerCue | integer | 2 | |
maxCueDurationSec | integer | 6 | |
wordTimestamps | boolean | false | Adds a words array per file. |
vocabularyHint | string | - | Names and jargon, comma separated. |
vadFilter | boolean | true | Skip silence; avoids hallucinated text. |
saveFilesToKeyValueStore | boolean | true | Store .srt, .vtt, .txt files and return their URLs. |
maxDurationMinutes / maxFileSizeMb / downloadTimeoutSec | integer | 180 / 500 / 120 | Safety limits; rejected files are not charged. |
Example
{"mediaUrls": ["https://example.com/interview.mp4"],"language": "ja","quality": "accurate","bilingualSubtitles": true,"maxCharsPerLine": 32}
Output
One dataset record per file:
| Field | Description |
|---|---|
url, fileName, ok, error | Source and status. Failed files get ok: false and an error message. |
language, languageProbability | Detected language. |
durationSeconds, tookMs | Media length and processing time. |
text | Full transcript. |
segments | Whisper's raw segments (start, end, text). |
cues | The subtitle cues after re-flow (start, end, text). |
srt, vtt | Subtitle files as text. |
srtUrl, vttUrl, txtUrl | Download links (key-value store). |
words | Word-level timestamps (when wordTimestamps is on). |
translationText, translationSrt, translationVtt, translationSrtUrl | English translation (when requested). |
bilingualSrt, bilingualSrtUrl | Original + English cues (when requested). |
Pricing
You pay per started minute of audio that was transcribed successfully. accurate quality costs more per minute,
and translation / bilingual output adds a second per-minute charge. Downloads that fail, files above the size or
duration limits and undecodable inputs are not charged. Platform usage is included.
Speed and limits
fastruns at roughly 3x realtime on the default 4 GB memory (a 30-minute podcast in about 10 minutes);balancedabout 1.5x;accurateabout 1x realtime. Give long files more memory (8 GB = 2 CPUs) to finish sooner at the same price.- English translation uses Whisper medium (large-v3-turbo cannot translate), so translated runs take about twice as long.
- Timestamps are word-level for Latin scripts and character-level for CJK scripts.
- No speaker diarization. Overlapping speech and heavily compressed phone audio reduce accuracy.
- Links must be public. Signed URLs that expire in seconds may fail to download.
Tips
- For vertical videos (Shorts, Reels, TikTok) use
maxCharsPerLine: 32andmaxLinesPerCue: 2. - Put proper nouns in
vocabularyHint; Whisper spells them far better with a hint. - For Japanese use
quality: "accurate", setlanguage: "ja"explicitly and put names invocabularyHint. - Chain this Actor with a video downloader Actor if your source is a YouTube or TikTok page.
Support
Open an issue on the Issues tab with the media URL (or its format and length) and the input you used.