Synkronisér undertekster med lyden
Den første kørsel downloader videomotoren – cirka 31 MB, leveret af dette websted og cachet af browseren bagefter. Den bruges kun til at læse lydsporet; underteksterne matches mod selve lyden, uden talemodel og uden at noget uploades.
Indstillinger
Hvor langt underteksterne kan være fra, hvor de burde være, i begge retninger. Det er en indstilling for omkostning og risiko snarere end for nøjagtighed: et bredere vindue finder en større afdrift, men giver også søgningen flere chancer for at lande på en tilfældighed, der scorer godt. Intet ud over cirka et minut kommer fra et klip eller en logo – så meget betyder normalt et andet klip af filmen eller et misforhold i billedhastigheden, som denne side løser separat. Vælg det mindste vindue, der dækker dit gæt.
Denne side retter undertekster, der står i den rigtige rækkefølge, men på de forkerte tider. Du giver den to ting – undertekstfilen og den video eller lyd, den hører til – og den regner ud, hvor langt teksten er drevet, og skriver derefter filen igen med hver blok flyttet. Drift på nogle få sekunder kommer fra klip og logoer; drift, der vokser gennem filmen, kommer fra et billedhastighedsmismatch, hvor en 23,976 fps-master blev parret med undertekster timet til 25 fps, og fejlen er allerede halvandet minut ved slutningen af den første time.
Målingen laves ud fra lyden selv. Siden udtrækker et monospor, folder det til tyve millisekunder lange rammer af lydstyrke og markerer, hvilke rammer der indeholder tale. Derefter stiller den ét spørgsmål igen og igen: for denne forskydning og denne hastighedsændring, hvor meget af undertekstteksten lander på tale frem for på stilhed? Svaret scores pr. blok og gennemsnitsberegnes, og det vindende par er det, der anvendes. Der indgår ingen talegenkendelse, hvilket er grunden til, at det kører på et par sekunder, og til at det virker, når underteksterne er på et sprog, du ikke har en model til.
Fordi scoren er en måling frem for en garanti, er siden bygget til at gøre ingenting, når målingen er svag. Fem blokke eller færre, et lydspor uden registrerbar tale, en bedste score, der stadig for det meste lander på stilhed, eller to meget forskellige justeringer, der scorer nogenlunde det samme – hver af dem ender med en rapport og ingen omskrevet undertekstfil. En stille fiasko er langt bedre her end en selvsikker: undertekster skubbet fem sekunder forkert ser sjuskede ud, men undertekster skubbet fem sekunder forkert af et værktøj, der påstod succes, er svære at opdage og svære at forklare.
Når justeringen er god, får du to filer, fordi de to besvarer forskellige spørgsmål. Den rettede undertekst beholder det format, den kom i, navngivet film.synced.srt eller hvad end filtypen var, klar til afspilning. Rapporten er en lille tekstfil med forskydningen i millisekunder, det anvendte forhold, scoren, sikkerheden og én linje, der siger, om filen overhovedet blev rørt. Begge kommer ud af samme kørsel, så en batch af afsnit giver et matchet par til hvert af dem.
Arbejdet foregår lokalt. Lyden dekodes af ffmpeg kompileret til WebAssembly, downloadet én gang fra dette sted og cachet bagefter; underteksten parses i fanen. Intet om din film eller dine undertekster sendes nogen steder hen – der er ingen upload at springe over, hvilket betyder noget for materiale, der ikke må forlade maskinen.
Ofte stillede spørgsmål
Hvordan adskiller en målt forskydning sig fra det faste offset, jeg taster ind på forskydningssiden?
Forskydningssiden anvender et tal, du allerede kender, så den forbliver korrekt, uanset om lyden er enig. Denne side starter fra den modsatte ende: den antager, at du ikke kender tallet, læser taleaktiviteten ud af lyden og løser for forskydning og hastighedsændring sammen. Det er også derfor, den kan rette et billedhastighedsproblem, som ingen enkelt offset kan udtrykke – ved 25 mod 23,976 er fejlen nul i starten og vokser med omkring 3,6 sekunder pr. time, så en forskydning, der reparerer begyndelsen, gør slutningen værre.
Hvorfor nægter siden nogle gange helt at skrive en ny undertekstfil?
Fordi en forkert rettelse er sværere at opdage end en manglende. Søgningen rapporterer fire ting: hvor mange blokke den havde at arbejde med, om lyden indeholdt tale, hvor stor en del af underteksttiden der landede på tale, og hvor meget bedre vinderen var end det bedste reelt anderledes alternativ. Er blot én af dem svag, giver kørslen kun rapporten, hvis tilstandslinje siger not-found sammen med årsagen. Du mister intet – den oprindelige fil er urørt – og du får et tal, du kan tjekke, før du gør noget manuelt.
Hvad betyder forholdet i rapporten for et mismatch mellem 23,976 og 25 fps?
Bloktiderne multipliceres med forholdet og forskydes derefter med offsettet, så et forhold på 1,0427 betyder, at underteksterne blev timet til en hurtigere billedbase, og hver blok skal strækkes senere. Siden prøver begge retninger af hvert almindeligt par, fordi hvilken vej det læses, afhænger af, hvilken fil du tilfældigvis har: 1,0427 og 0,9590 er det samme mismatch set fra hver sin ende. Er det rapporterede forhold 1,000000, og er offsettet under en frame, flugter filen allerede og lades i fred.
Beholder den rettede fil min stil, eller kun tiderne?
Tiden ændres, og intet andet gør. Underteksten parses ind i den samme interne repræsentation, som alle andre sider her bruger, start og slut på hver blok skrives om, og den serialiseres tilbage til det format, den kom i. ASS-stil, placering og inline-tags overlever; det gør filens egen struktur også, hvilket er grunden til, at en .ass ind giver en .ass ud frem for en flad .srt. Den ene synlige undtagelse er en blok, der klemmes til under en millisekund af et stort forhold; den holdes på en millisekund og tælles i tablisten.
Virker det, når underteksterne er på et andet sprog end lyden?
Ja, og det er pointen med at måle lydstyrke frem for at genkende ord. Taleaktivitet er en form – en sætning er et energistød efterfulgt af et hul – og den form er den samme, uanset om stemmen taler tysk eller spansk. En tysk dub under spanske undertekster justerer lige så godt som et matchet par. Det, den ikke kan, er at skelne en dubbet linje fra en original, så hvis dubben indsætter ekstra dialog, finder justeringen stadig den samlede pasform, men enkelte blokke i de indsatte passager kan sidde på den forkerte linje.