Skip to content

Settings — Sync Engines

This page tunes the fallback chain for automatic subtitle sync — what runs first, what runs if it fails, when the chain bails out. The user-facing sync workflow lives at Multi-Engine Sync; this page configures the global defaults that workflow uses.

Sublarr ships four sync engines. The order determines which gets tried first; if it fails or its result fails the sanity check, the next engine runs.

EngineBest forSpeed
ffsubsyncMost cases — phonetic alignment between subtitle and audio.Medium (~ 2-5 min per file).
alassHard cases — handles large drift and mid-file resync points.Slow (~ 5-15 min).
framerateFixed PAL ↔ NTSC offset (24 vs 23.976 fps).Instant.
chapterContainer has chapter markers — align cues to chapter boundaries.Instant.

Default order: ffsubsync → framerate → chapter → alass. Reorder via drag-and-drop in the engine list.

After every sync attempt, Sublarr compares the original cue boundaries to the synced output. If the result differs by more than the threshold from a sanity-checked alignment, the engine’s output is rejected and the chain falls through to the next engine.

SettingDefaultValuesEffect
Sanity threshold (s)2.50.5–10.0Maximum acceptable divergence between expected and produced timing at any cue boundary.
Sanity sample size105–50Number of cues spot-checked. Larger = stricter.

If every engine fails the sanity check, the chain aborts and the original (unsynced) subtitle is kept; the failure is reported to Activity → Sync and as a sync_failed notification event.

SettingDefaultValuesEffect
Max offset (s)601–600Maximum offset ffsubsync will consider. Cap to avoid runaway alignments on noisy audio.
Use VADontoggleVoice Activity Detection — improves accuracy on dialogue.
Encoding overrideemptyencoding nameForce a specific subtitle encoding. Empty = auto-detect.
SettingDefaultValuesEffect
Split penalty70–20Higher = fewer split points (one offset for the whole file). Lower = aggressive resync at scene changes.
No-split flagofftoggleForce single-offset alignment regardless of split penalty.
Sub FPS overrideemptyfloatSource subtitle’s frame rate. Empty = auto-detect.
SettingDefaultValuesEffect
PAL ↔ NTSC factor25 / 23.976floatConversion factor. Override for non-standard pairs.
Detect directionautoauto / pal-to-ntsc / ntsc-to-palWhich direction to convert. auto infers from container metadata.
SettingDefaultValuesEffect
Min chapters31–20Skip the engine if the file has fewer than this many chapter markers.
Anchor modefirst-cuefirst-cue / chapter-spacingWhether to align based on the first cue’s chapter or use chapter spacing as the metric.

Sync runs in three contexts:

TriggerBehaviour
Library → Sidecar pill → SyncOne-off; user picks engines or uses default chain.
Auto-sync on downloadRight after a successful download. Enable in Settings → Automation → Auto-sync.
Auto-sync on extractRight after extracting an embedded subtitle, when the embedded timing differs from the container.

Sync engines need access to the audio track. Sublarr extracts audio once per video and caches the result:

SettingDefaultEffect
Cache audio extractsonRe-use the audio file for repeated sync attempts on the same video.
Cache directory/config/cache/audioWhere extracted audio lives.
Cache size limit (GB)10LRU eviction when exceeded.
Cache TTL (days)7Drop audio extracts older than this regardless of size.

Sometimes you know a series is consistently mis-synced in a specific way (e.g. always 24/25 fps PAL conversion). Override per-series:

SurfaceEffect
Library → Series detail → Sync overrideForce a specific engine and skip the chain.
Profile → Default sync enginePer-profile default for the chain start.

When sync gives wrong-but-consistent results

Section titled “When sync gives wrong-but-consistent results”

If every sync run produces output that’s offset by exactly the same amount (e.g. always 100 ms early), the issue is usually:

CauseFix
Different audio delay between videosAdjust Settings → Subtitles → Stream Management → Audio offset compensation.
Subtitle source has consistent driftApply a one-time global offset in the editor; don’t re-sync every episode.
Container metadata claims wrong fpsForce the framerate engine first with the correct factor.