Subtitle Converter & Resync — SRT/VTT/ASS
Pricing
from $20.00 / 1,000 converted subtitle files
Subtitle Converter & Resync — SRT/VTT/ASS
Convert SRT, VTT, ASS/SSA and JSON subtitles, then fix timing with a global offset, framerate conversion or two-point synchronization. Supports batch processing and multiple output formats without third-party APIs.
Pricing
from $20.00 / 1,000 converted subtitle files
Rating
0.0
(0)
Developer
François Fernandez
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
15 hours ago
Last modified
Categories
Share
Subtitle Converter & Resync — SRT, VTT, ASS, TXT, JSON
Convert subtitle files between formats and fix broken timing, including the drift that a simple offset can never repair.
No video or audio upload. No transcription. No third-party API key. Pure text processing keeps runs fast and inexpensive, even for long subtitle files.
Which Actor should I use?
| I want to… | Use |
|---|---|
| Convert a subtitle format, or fix subtitle timing | This Actor |
| Turn a video or audio file into translated subtitles | Video & Audio to Translated Subtitles |
| Check and repair an existing SRT/VTT against professional rules | Professional Subtitle QC |
| Do everything: transcribe, translate, QC and burn subtitles into a video | Professional Subtitle Translator & Video Captioner |
What it does
Format conversion — SRT, VTT, ASS/SSA and JSON in; SRT, VTT, ASS, TXT and JSON out. Ask for several output formats in one run.
Timing repair, three ways:
| Your problem | Use |
|---|---|
| Subtitles are late (or early) by the same amount all the way through | Global offset |
| Subtitles start fine, then drift further and further out | Framerate conversion or two-point sync |
| They drift and you do not know the framerates | Two-point sync |
Common uses
- Convert subtitle files for Premiere Pro, DaVinci Resolve, CapCut, Final Cut Pro, players, or delivery platforms
- Repair a constant subtitle delay without editing every cue
- Correct progressive drift caused by a framerate mismatch
- Resynchronize a file from two known dialogue timestamps
- Convert several subtitle files or create several output formats in one automated run
- Integrate subtitle conversion into Make, Zapier, API, or agent workflows
Why an offset is often not enough
A constant lag and a framerate mismatch look identical in the first minute and behave completely differently by minute ninety. A file authored at 25 fps played against a 23.976 fps video drifts by about 4% — roughly three and a half minutes over a feature film. No offset fixes that, because the error grows with time.
Two-point sync solves both at once. Give the current and correct timestamps of two lines far apart — ideally the first and the last of the file — and the Actor computes the scale and the shift together.
Input
| Field | Description |
|---|---|
subtitleText | Easiest option: paste the complete contents of one SRT, VTT, ASS/SSA or JSON file. No upload storage is needed. |
pastedFileName | Optional filename used for outputs created from pasted content. Default pasted-subtitles.srt. |
subtitleStore | Select the same Apify Key-Value Store used by subtitleFiles. This grants read-only access to private uploads under Apify limited permissions. Not needed for public direct URLs. |
subtitleFiles | Upload one or more SRT, VTT, ASS/SSA or JSON files directly in the Apify Console. |
subtitleUrls | Optional direct download URLs. Direct file URLs, not YouTube or TikTok page links. |
outputFormats | Any of srt, vtt, ass, txt, json. Default srt. |
offsetMs | Shift every cue. Negative = earlier, positive = later. |
sourceFps / targetFps | Framerate the file was authored against, and the framerate of your video. Must be set together. |
useAnchorSync + the four anchor fields | Two-point sync. The anchors must be at least 30 seconds apart. |
dropNegativeCues | Remove cues pushed before zero instead of clamping them to 00:00:00. |
keepLineBreaksInTxt | Preserve the original line layout in TXT output. |
Up to 20 files can be processed in one run. Each file may be up to 32 MB. Uploaded files and direct URLs can be combined in the same batch.
Recommended: paste subtitle content
For the simplest Console workflow, copy all the text from one subtitle file into Paste your subtitles here — easiest option, choose the output formats, and run the Actor. This avoids private-storage permissions entirely and works with SRT, VTT, ASS/SSA and JSON.
{"subtitleText": "1\n00:00:01,000 --> 00:00:03,000\nHello world!\n","pastedFileName": "episode-01.srt","outputFormats": ["vtt", "json"],"offsetMs": 0}
Advanced: private file uploads on Apify
Apify runs Store Actors with limited permissions. When uploading a private file, first select a Key-Value Store under Upload storage, then choose that same store in the Subtitle files uploader. The Actor receives read-only access to that store for the duration of the run. No API token or environment variable is required.
Example — fix a 2-second lag and export both formats
{"subtitleUrls": ["https://example.com/episode-01.srt"],"outputFormats": ["srt", "vtt"],"offsetMs": -2000}
Example — two-point sync on a drifting file
{"subtitleUrls": ["https://example.com/feature.srt"],"outputFormats": ["srt"],"useAnchorSync": true,"anchorObservedA": "00:00:04,120","anchorDesiredA": "00:00:02,000","anchorObservedB": "01:38:12,400","anchorDesiredB": "01:34:57,000"}
Free readiness check
Running the Actor without a subtitle file or URL performs a zero-cost readiness
check. It validates the input configuration, writes an OUTPUT record with
status: "ready", and does not charge actor-start or converted-file.
Output
Converted files land in the key-value store, one per input file per format, keeping the original filename stem.
The dataset holds one row per input file: detected format, cue count, the retiming that was applied, how many cues were clamped or dropped, the files written, and any parse errors found.
The OUTPUT record contains the complete run summary: requested and converted
file counts, failures, output formats, retiming, generated storage keys, safe
error messages, and charged events.
Secure file delivery
Generated subtitle files remain in the run's private Key-Value Store. Open the run's Storage > Key-value store tab to download them. API users retrieve the listed storage keys with their own Apify token. The Actor does not create unsigned public download links.
Example output summary
{"status": "success","filesRequested": 1,"filesConverted": 1,"filesFailed": 0,"outputFormats": ["srt", "vtt", "json"],"retiming": "offset -2000 ms","chargedEvents": {"actor-start": 1,"converted-file": 1},"files": [{"file": "episode-01.srt","outputs": {"srt": "episode-01.srt","vtt": "episode-01.vtt","json": "episode-01.json"},"error": null}]}
Pricing
This Actor uses pay-per-event pricing.
| Event | Price | When it is charged |
|---|---|---|
actor-start | $0.01 | Once per valid processing run |
converted-file | $0.02 | Once per input file, only after its output files exist |
A file that produced nothing usable is never billed beyond the start event. Asking for five output formats costs the same as asking for one.
Typical custom-event totals:
- One successfully converted input file, with one or five output formats: $0.03
- Five successfully converted input files: $0.11
- One unreadable file that produces no output: $0.01
The Apify Console displays and enforces the maximum permitted run cost before execution. Platform usage is included according to the Actor's pricing setup.
Notes on robustness
The parser is deliberately tolerant: a malformed file produces reported issues, not a crashed run. Unreadable blocks are listed in parseErrors and the rest of the file is still converted.
- BOM, CRLF, Windows-1252 and Latin-1 files are handled.
- WebVTT
NOTE,STYLEandREGIONblocks are skipped correctly. - ASS override tags (
{\an8},{\pos(...)}), drawing blocks and\Nbreaks are handled;Comment:events are dropped; out-of-order events are re-sorted. - ASS centiseconds are read correctly —
0:00:01.50is 1500 ms, not 1050 ms. - Cues that round to zero duration are given 1 ms so players still display them.
- Files above 32 MB are rejected as not being subtitle files.
- One broken file does not stop the other files in the same batch.
- HTTP and HTTPS are the only accepted URL schemes.
- Localhost, private-network addresses, embedded credentials, and every unsafe redirect are rejected.
- The Apify token is attached only to official private Key-Value Store record URLs and is never forwarded to another host.
- Signed URL query strings and credentials are not copied into output errors.
Limits
| Limit | Value |
|---|---|
| Accepted input formats | SRT, WebVTT, ASS/SSA, JSON |
| Available output formats | SRT, WebVTT, ASS, TXT, JSON |
| Input files per run | 20 maximum |
| File size | 32 MB maximum per file |
| Retiming anchors | At least 30 seconds apart |
Social-platform page links such as YouTube, TikTok, Instagram, Facebook, or X are not subtitle-file URLs and are refused.
Privacy
Conversion and retiming run entirely inside the Actor container. Subtitle text is not sent to a transcription provider, translation provider, AI model, or other third-party API. Uploaded inputs and generated outputs remain in Apify storage according to the account's retention settings.
Limitations
This Actor does not transcribe media, translate dialogue, check spelling or meaning, perform professional subtitle QC, align cues to shot changes, or burn subtitles into video. ASS styling is converted conservatively: positioning and override tags are removed when producing text-oriented outputs. Use the linked QC or full-pipeline Actor when those additional operations are required.
Support
Include the Apify run ID, the selected input format, and a minimal reproducible subtitle file when reporting a problem. Do not include private API tokens.
Built by Lumaxys.