Gå till huvudinnehållet
SubtitleMatrix

Synka undertexter mot ljudet

MedieinmatningSynka om mot ljudet

Första körningen laddar ner videomotorn – ungefär 31 MB, serverad av den här webbplatsen och cachad av webbläsaren efteråt. Den används bara för att läsa ljudspåret; undertexterna matchas mot själva ljudet, utan talmodell och utan att något laddas upp.

Inställningar

Hur långt undertexterna kan ligga från där de borde vara, i endera riktningen. Det är en inställning för kostnad och risk snarare än för noggrannhet: ett bredare fönster hittar en större drift men ger också sökningen fler chanser att landa på ett sammanträffande som råkar få bra poäng. Inget bortom ungefär en minut kommer från en trimning eller en logotyp – så mycket betyder vanligtvis en annan klippning av filmen, eller en bildfrekvens som inte stämmer, vilket den här sidan löser separat. Välj det minsta fönster som täcker din gissning.

Den här sidan rättar undertexter som ligger i rätt ordning men på fel tider. Du ger den två saker – undertextfilen och videon eller ljudet den hör till – och den räknar ut hur långt texten har drivit, och skriver sedan om filen med varje textblock flyttat. Drift på några sekunder kommer från klippningar och logotyper; drift som växer genom filmen kommer från en bildfrekvensmissmatchning, där en 23,976 fps-master parade ihop sig med undertext tidsatt för 25 fps och felet redan är en och en halv minut vid slutet av första timmen.

Mätningen görs ur ljudet självt. Sidan extraherar ett monospår, viker det till tjugo millisekunder långa bildrutor av ljudstyrka och markerar vilka rutor som innehåller tal. Sedan ställer den samma fråga om och om igen: för den här förskjutningen och den här hastighetsändringen, hur mycket av undertextens tid landar på tal i stället för på tystnad? Svaret poängsätts per textblock och medelvärdesbildas, och det vinnande paret är det som tillämpas. Ingen taligenkänning är inblandad, vilket är varför det går på ett par sekunder och varför det fungerar när undertexten är på ett språk du inte har någon modell för.

Eftersom poängen är en mätning och inte en garanti är sidan byggd att göra ingenting när mätningen är svag. Fem textblock eller färre, ett ljudspår utan detekterbart tal, en bästa poäng som fortfarande mestadels landar på tystnad, eller två mycket olika justeringar som poängsätter ungefär lika – var och en av dem slutar med en rapport och ingen omskriven undertextfil. Ett tyst misslyckande är mycket bättre här än ett självsäkert: undertext som puttats fem sekunder fel ser stökig ut, men undertext som puttats fem sekunder fel av ett verktyg som påstod sig lyckats är svår att upptäcka och svår att förklara.

När justeringen är bra får du två filer, eftersom de svarar på olika frågor. Den rättade undertexten behåller formatet den kom in med, namngiven film.synced.srt eller vilken ändelsen nu var, färdig att spela. Rapporten är en liten textfil med förskjutningen i millisekunder, proportionen som faktiskt tillämpades, poängen, konfidensen och en rad som säger om filen alls rördes. Båda kommer från samma körning, så en säsong avsnitt ger ett matchande par för varje. Blir mätningen svag får du bara rapporten.

Arbetet sker lokalt. Ljudet avkodas av ffmpeg kompilerat till WebAssembly, nedladdat en gång från den här sajten och cachat efteråt; undertexten tolkas i fliken. Inget om din film eller din undertext skickas någonstans – det finns inget uppladdningssteg att hoppa över, vilket spelar roll för material som inte får lämna datorn. Sökfönstret i fältet styr hur långt bort en förskjutning får letas – 30 sekunder som standard, med snävare eller vidare val – och avbrytning verkar innan nästa steg i körningen börjar.

Vanliga frågor

Hur skiljer sig en uppmätt förskjutning från den fasta offset jag skriver in på förskjutningssidan?

Förskjutningssidan tillämpar ett tal du redan känner till och förblir korrekt oavsett om ljudet håller med. Den här sidan börjar i andra ändan: den utgår från att du inte vet talet, läser talaktiviteten ur ljudet och löser förskjutningen och hastighetsändringen tillsammans. Det är också därför den kan rätta ett bildfrekvensproblem, vilket ingen enskild offset kan uttrycka – vid 25 mot 23,976 är felet noll i början och växer med ungefär 3,6 sekunder per timme, så en förskjutning som lagar början gör slutet värre.

Varför vägrar sidan ibland att skriva en ny undertextfil alls?

Eftersom en felaktig rättning är svårare att upptäcka än en utebliven. Sökningen rapporterar fyra saker: hur många textblock den hade att arbeta med, om ljudet innehöll något tal, hur stor del av undertextens tid som landade på tal och hur mycket bättre vinnaren var än det bästa genuint annorlunda alternativet. Är något av dem svagt ger körningen bara rapporten, vars tillståndsrad säger not-found tillsammans med orsaken. Du förlorar ingenting – originalfilen är orörd – och du får ett tal du kan kontrollera innan du gör något för hand.

Vad betyder proportionen i .sync.txt-rapporten för en missmatchning mellan 23,976 och 25 fps?

Textblockens tider multipliceras med proportionen och förskjuts sedan med offseten, så en proportion på 1,0427 betyder att undertexten var tidsatt för en snabbare bildbas och att varje block måste sträckas senare. Sidan provar båda riktningarna av varje vanligt par, eftersom vilken väg den läses beror på vilken fil du råkar hålla: 1,0427 och 0,9590 är samma missmatchning sedd från vardera ändan. Står det 1,000000 i rapporten och offseten är under en bildruta ligger filen redan rätt och lämnas i fred.

Behåller den rättade undertextfilen min formatering, eller bara tiderna?

Tiderna ändras och inget annat. Undertexten tolkas till samma interna representation som varje annan sida på sajten använder, start och slut för varje textblock skrivs om, och den serialiseras tillbaka till formatet den kom i. ASS-formatering, positionering och inline-taggar överlever; det gör även filens egen struktur, vilket är varför en .ass in ger en .ass ut i stället för en tillplattad .srt. Det enda synliga undantaget är ett textblock som en stor proportion trycker under en millisekund, vilket hålls vid en millisekund och räknas i förlustlistan.

Fungerar omsynkningen när undertexten är på ett annat språk än ljudet?

Ja, och det är poängen med att mäta ljudstyrka i stället för att känna igen ord. Talaktivitet är en form – en mening är en energistöt följd av ett glapp – och formen är densamma vare sig rösten talar tyska eller spanska. En tysk dubbning under spansk undertext justeras lika bra som ett matchat par. Det sidan inte kan göra är att skilja en dubbad rad från en ursprunglig, så om dubbningen lägger till extra dialog hittar justeringen fortfarande den övergripande passformen, men enstaka textblock i de insatta passagerna kan hamna på fel rad.

Relaterade verktyg