Naar de hoofdinhoud
SubtitleMatrix

Ondertitels op de audio synchroniseren

Media-invoerOpnieuw synchroniseren met de audio

De eerste run downloadt de video-engine — ongeveer 31 MB, door deze site geleverd en daarna door de browser gecachet. Hij wordt alleen gebruikt om het audiospoor te lezen; de ondertitels worden tegen het geluid zelf gematcht, zonder spraakmodel en zonder dat er iets wordt geüpload.

Opties

Hoe ver de ondertitels van hun plek af kunnen zitten, in beide richtingen. Het is een kosten- en risico-instelling, geen nauwkeurigheidsinstelling: een wijder venster vindt een grotere afwijking, maar geeft de zoekopdracht ook meer kansen om te blijven hangen op een toevalligheid die goed scoort. Meer dan ongeveer een minuut komt niet van een knip of een logo — zoveel betekent meestal een andere montage van de film, of een beeldsnelheidsverschil, wat deze pagina apart oplost. Kies het kleinste venster dat je vermoeden dekt.

Deze pagina repareert ondertitels die in de juiste volgorde staan maar op de verkeerde tijden. Je geeft haar twee dingen — het ondertitelbestand en de video of audio waar het bij hoort — en ze rekent uit hoeveel de tekst is weggedreven en schrijft het bestand opnieuw met elk blok verplaatst. Drift van een paar seconden komt van trims en logo’s; drift die door de film heen groeit komt van een framerateverschil, waarbij een master op 23,976 fps is gekoppeld aan ondertitels die op 25 fps zijn getimed en de fout aan het einde van het eerste uur al anderhalve minuut is.

De meting komt uit de audio zelf. De pagina haalt een monospoor eruit, vouwt het in frames van twintig milliseconden luidheid en markeert welke frames spraak bevatten. Daarna stelt ze steeds één vraag: hoeveel van de ondertiteltekst valt bij deze verschuiving en deze snelheidsverandering op spraak in plaats van op stilte? Het antwoord wordt per blok gescoord en gemiddeld, en het winnende paar wordt toegepast. Er komt geen spraakherkenning aan te pas, en daarom duurt het een paar seconden en werkt het ook wanneer de ondertitels in een taal staan waarvoor je geen model hebt.

Omdat de score een meting is en geen garantie, is de pagina zo gebouwd dat ze niets doet wanneer de meting zwak is. Vijf blokken of minder, een audiotrack zonder waarneembare spraak, een beste score die nog steeds vooral op stilte valt, of twee heel verschillende uitlijningen die ongeveer hetzelfde scoren — elk daarvan eindigt met een rapport en zonder herschreven ondertitelbestand. Een stille mislukking is hier veel beter dan een zelfverzekerde: ondertitels die vijf seconden scheef staan zien er slordig uit, maar ondertitels die vijf seconden scheef staan door een tool die succes claimde zijn moeilijk te merken en moeilijk uit te leggen.

Is de uitlijning goed, dan krijg je twee bestanden, omdat de twee verschillende vragen beantwoorden. De gecorrigeerde ondertitel houdt het formaat waarin hij binnenkwam, genoemd film.synced.srt of wat de extensie ook was, klaar om af te spelen. Het rapport is een klein tekstbestand met de verschuiving in milliseconden, de werkelijk toegepaste verhouding, de score, het vertrouwen en één regel die zegt of het bestand überhaupt is aangeraakt. Beide komen uit dezelfde run, dus een batch afleveringen levert voor elk een bijpassend paar op. Annuleren werkt hier tussen twee stappen, niet midden in een decodeer- of vergelijkingsstap.

Het werk is lokaal. De audio wordt gedecodeerd door ffmpeg dat naar WebAssembly is gecompileerd, één keer van deze site gedownload (ongeveer 31 MB) en daarna gecacht; de ondertitel wordt in de tab geparseerd. Niets van je film of je ondertitels wordt ergens naartoe gestuurd — er is geen uploadstap om over te slaan, wat belangrijk is voor materiaal dat de machine niet mag verlaten.

Veelgestelde vragen

Hoe verschilt een gemeten verschuiving van de vaste offset die ik op de verschuifpagina intyp?

De verschuifpagina past een getal toe dat je al kent, dus ze blijft correct of de audio het nu eens is of niet. Deze pagina begint aan de andere kant: ze gaat ervan uit dat je het getal niet kent, leest de spraakactiviteit uit de audio en lost de verschuiving en de snelheidsverandering samen op. Daarom kan ze ook een framerateprobleem repareren, wat geen enkele losse offset kan uitdrukken — bij 25 tegen 23,976 is de fout nul aan het begin en groeit ze met ongeveer 3,6 seconden per uur, dus een verschuiving die het begin repareert maakt het einde erger.

Waarom weigert de pagina soms helemaal een nieuw ondertitelbestand te schrijven?

Omdat een verkeerde correctie moeilijker te ontdekken is dan een ontbrekende. De zoektocht meldt vier dingen: met hoeveel blokken ze moest werken, of de audio spraak bevatte, welk deel van de ondertiteltijd op spraak viel en hoeveel beter de winnaar was dan het beste werkelijk andere alternatief. Is een daarvan zwak, dan levert de run alleen het rapport op, waarvan de statusregel not-found zegt samen met de reden. Je verliest niets — het oorspronkelijke bestand blijft onaangeroerd — en je krijgt een getal dat je kunt controleren voordat je iets met de hand doet.

Wat betekent de verhouding in het rapport bij een verschil van 23,976 naar 25 fps?

Bloktijden worden met de verhouding vermenigvuldigd en daarna met de offset verschoven, dus een verhouding van 1,0427 betekent dat de ondertitels op een snellere framebasis zijn getimed en elk blok later moet worden uitgerekt. De pagina probeert beide richtingen van elk gangbaar paar, omdat welke kant ze leest afhangt van welk bestand je toevallig hebt: 1,0427 en 0,9590 zijn hetzelfde verschil vanaf de andere kant bekeken. Is de gemelde verhouding 1,000000 en ligt de offset onder een frame, dan past het bestand al en blijft het met rust.

Houdt het gecorrigeerde bestand mijn opmaak, of alleen de tijden?

De timing verandert en verder niets. De ondertitel wordt geparseerd naar dezelfde interne representatie die elke andere pagina op deze site gebruikt, het begin en einde van elk blok worden herschreven en het geheel wordt teruggeserialiseerd naar het formaat waarin het aankwam. ASS-opmaak, positionering en inline tags overleven; de eigen structuur van het bestand ook, en daarom geeft een .ass erin een .ass eruit in plaats van een afgeplatte .srt. De enige zichtbare uitzondering is een blok dat door een grote verhouding onder één milliseconde wordt gedrukt; dat wordt op één milliseconde gehouden en in het verliesoverzicht geteld.

Werkt dit wanneer de ondertitels in een andere taal staan dan de audio?

Ja, en dat is het punt van luidheid meten in plaats van woorden herkennen. Spraakactiviteit is een vorm — een zin is een uitbarsting energie gevolgd door een gat — en die vorm is dezelfde of de stem nu Duits of Spaans spreekt. Een Duitse nasynchronisatie onder Spaanse ondertitels lijnt net zo goed uit als een bijpassend paar. Wat ze niet kan, is een nagesynchroniseerde regel van een originele onderscheiden, dus als de nasynchronisatie extra dialoog invoegt, vindt de uitlijning nog steeds de algehele passing, maar individuele blokken in de ingevoegde passages kunnen op de verkeerde regel staan.

Gerelateerde hulpmiddelen