Subtitle Converter & Resync — SRT/VTT/ASS avatar

Subtitle Converter & Resync — SRT/VTT/ASS

Pricing

from $20.00 / 1,000 converted subtitle files

Go to Apify Store
Subtitle Converter & Resync — SRT/VTT/ASS

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

François Fernandez

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 hours ago

Last modified

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 timingThis Actor
Turn a video or audio file into translated subtitlesVideo & Audio to Translated Subtitles
Check and repair an existing SRT/VTT against professional rulesProfessional Subtitle QC
Do everything: transcribe, translate, QC and burn subtitles into a videoProfessional 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 problemUse
Subtitles are late (or early) by the same amount all the way throughGlobal offset
Subtitles start fine, then drift further and further outFramerate conversion or two-point sync
They drift and you do not know the frameratesTwo-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

FieldDescription
subtitleTextEasiest option: paste the complete contents of one SRT, VTT, ASS/SSA or JSON file. No upload storage is needed.
pastedFileNameOptional filename used for outputs created from pasted content. Default pasted-subtitles.srt.
subtitleStoreSelect 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.
subtitleFilesUpload one or more SRT, VTT, ASS/SSA or JSON files directly in the Apify Console.
subtitleUrlsOptional direct download URLs. Direct file URLs, not YouTube or TikTok page links.
outputFormatsAny of srt, vtt, ass, txt, json. Default srt.
offsetMsShift every cue. Negative = earlier, positive = later.
sourceFps / targetFpsFramerate the file was authored against, and the framerate of your video. Must be set together.
useAnchorSync + the four anchor fieldsTwo-point sync. The anchors must be at least 30 seconds apart.
dropNegativeCuesRemove cues pushed before zero instead of clamping them to 00:00:00.
keepLineBreaksInTxtPreserve 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.

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.

EventPriceWhen it is charged
actor-start$0.01Once per valid processing run
converted-file$0.02Once 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, STYLE and REGION blocks are skipped correctly.
  • ASS override tags ({\an8}, {\pos(...)}), drawing blocks and \N breaks are handled; Comment: events are dropped; out-of-order events are re-sorted.
  • ASS centiseconds are read correctly — 0:00:01.50 is 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

LimitValue
Accepted input formatsSRT, WebVTT, ASS/SSA, JSON
Available output formatsSRT, WebVTT, ASS, TXT, JSON
Input files per run20 maximum
File size32 MB maximum per file
Retiming anchorsAt 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.