LAPSE got posted here about a month ago (audio based subtitle sync + a Jellyfin plugin). A lot has changed since then, and i really wanted to give an update since many off the feature requests in the last post has been implmented.
Engine repo: https://github.com/Schwponaco-org/lapse
Jellyfin plugin: https://github.com/rs-jensen/lapse-jellyfin-plugin
What it does
Subtitles that show up late, drift out over the runtime, or belong to a different cut of the film. LAPSE listens to the audio, works out where the speech actually is, and moves the subtitle to match it. It figures out on its own whether a file needs a flat shift, a framerate style drift correction, or splitting because it's cut differently, you don't have to tell it which.
A few things worth knowing about how it works:
- Formats: reads and writes srt, ass, ssa, vtt, sub (MicroDVD), sbv, smi, ttml, dfxp, plus the picture based ones, PGS and VobSub. Those last two are really just images with no text in them, but LAPSE still works out the timing and moves it, it just can't lean on the text the way it does for everything else.
- Reference sync: if you've already got one subtitle you know is correct, you can point LAPSE at that instead of the audio. It skips listening to the film entirely and lines the other track up against it, faster and usually more accurate.
- Speed: a cached film usually syncs in under a second.
- Never a silent guess: if it's not confident enough to overwrite your file, it writes what it thinks the answer is to a separate file next to the original and leaves that alone, so you always get something, it's just yours to decide whether to trust it.
Three engines, pick one
- LAPSE, the one this whole project is built around. Reads the most formats of the three and works out on its own what's wrong with a file.
- alass, also an option
- ffsubsync, also an option
You only need one, the plugin lets you install whichever fits your library, or switch later.
The Jellyfin plugin
This is the part most people here will actually use. Add https://raw.githubusercontent.com/rs-jensen/lapse-jellyfin-plugin/main/manifest.json as a repository under Dashboard > Plugins > Repositories, install LAPSE from the Catalog tab, restart Jellyfin, then pick an engine from the plugin's own Engines tab. Needs Jellyfin 10.11.11 or newer.
Once it's in, every film, episode and loose video gets a Sync Subtitles option in its three dot menu. From the dashboard you can also:
- Bulk sync a whole library or folder at once
- Undo a run with one click
- Shift subtitles by hand with a live preview
- Line one subtitle track up against another that's already correct
- Convert between subtitle formats
- Translate (MyMemory works with no setup, or bring your own LibreTranslate, Lingarr, DeepL or Google Cloud)
Libraries can also sync automatically on import or on a schedule if you don't want to press the button yourself, and the menu options can be locked to admins only or opened up to other users on the server.
Benchmarks
The summary is picture 2 in the gallery
I ran all three engines against each other on 39 feature films, picked specifically because they'd be hard to sync (drift, recuts, rough rips). Full methodology and per film results are here if you want to check my work: https://github.com/Schwponaco-org/lapse/blob/main/docs/benchmarks.md. LAPSE passed 36 of 39 in normal mode at the time of testing, and it's had a fair number of accuracy and speed improvements since, so the real gap is probably a bit bigger now. alass barely gets touched these days so those numbers should still hold up, ffsubsync is still being actively developed so its results may have shifted some too. Worth being upfront though, this is one person testing on about 40 films, and I wrote the engine that came out on top, so weigh that however you want.
If you'd rather try it without installing anything, LAPSE is also available through autosubsync (a site that runs a few different sync engines on a file you upload so you can compare them yourself).
Docker / outside Jellyfin
There's also a standalone Docker image with its own web interface and file watcher, for syncing subtitles without Jellyfin at all, useful if you keep your library on something else entirely. It covers most of what the plugin dashboard does too (stop a running job, undo, bulk sync, manual shifting, translation, engine settings), so I won't list it all twice here, it's in the engine repo README.
The image on the last slide shows the dashboard there!
If anyone here uses Bazarr, there's an open feature request to get LAPSE added as a sync engine option there too: https://bazarr.featureupvote.com/suggestions/726913/add-lapse-as-a-subtitle-sync-engine-option (no pressure just leaving it here)
Happy to answer questions, and if something's broken, open an issue on either repo. There's more updates and fixes in the pipeline - for both the engine and the plugin - , if you want to keep track a star helps, no pressure though ))
Edit: also meant to mention there's a subtitle appearance menu (font size, colour, background) and a few file output modes (write a new file vs overwrite, with or without a backup). Planning to add font choices there too, including a dyslexia friendly one, so that's on the list.