Ondertitels omzetten naar tekst — SRT, VTT, SBV, ASS

Zet SRT-, VTT-, SBV- en ASS-ondertitels om in een schoon transcript. Verwijdert tijdcodes, smeedt afgebroken zinnen aaneen en haalt de herhaling van automatische ondertiteling eruit.

Ondertitels omzetten naar tekst: de tijdcodes weghalen is de makkelijke helft

Elk ondertitelformaat codeert hetzelfde: korte stukjes spraak vastgeprikt aan tijdcodes. Dat terugbrengen tot leesbare proza lijkt een script van vijf regels — cijfers weg, pijlen weg, plak de rest aan elkaar. Laat dat script los op een echt ondertitelbestand en je krijgt iets wat bíjna klopt, en dat is erger dan overduidelijk fout, want je moet het lezen om het te merken.

Twee dingen breken het. Ondertitels worden afgebroken om op een scherm te passen, niet om een zin af te maken, dus naïef aaneenplakken levert proza op die om de zes woorden gehakt is. En automatisch gegenereerde ondertitels rollen mee, waarbij tekst zich over meerdere cues herhaalt, zodat aaneenschakelen elke zin twee of drie keer oplevert. Dit gereedschap regelt allebei. Upload of plak hierboven een bestand en het resultaat verschijnt meteen, in dit browsertabblad.

Het probleem van de meerollende dubbelingen

Dit is degene waar mensen in trappen. Automatische ondertiteling op YouTube en in de meeste live-systemen zendt geen losse tekstblokken uit. Het zendt een meebewegend venster uit, zodat de kijker de woorden ziet aangroeien. In het bestand ziet dat er zo uit:

  • Cue 1: de appel valt niet
  • Cue 2: de appel valt niet ver van
  • Cue 3: niet ver van de boom

Gedachteloos aaneengeplakt krijg je “de appel valt niet de appel valt niet ver van niet ver van de boom” — vijftien woorden waar er acht zijn uitgesproken. Over een lezing van een uur verdubbelt tot verdrievoudigt dat de lengte, en daarmee is het transcript onbruikbaar om te lezen, te doorzoeken of samen te vatten.

De oplossing is om per cue alleen te houden wat hij toevoegt. Voor elke nieuwe cue zoekt het gereedschap de langste reeks woorden die tegelijk een achtervoegsel is van de tekst tot dan toe en een voorvoegsel van de nieuwe cue, en gooit die weg. Toegepast op het voorbeeld hierboven krijg je “de appel valt niet ver van de boom” precies één keer terug. De vergelijking loopt tegen een begrensd venster van recente woorden in plaats van tegen het hele transcript, wat het snel houdt op een bestand van drie uur en voorkomt dat een zinsnede wordt geschrapt die twintig minuten later terecht terugkomt.

Zinnen weer aan elkaar

Een ondertitelregel is op een scherm gedimensioneerd: een stuk of veertig tekens, twee regels tegelijk, afgebroken waar de tekst toevallig de rand haalde. Zinnen lopen routineus over drie of vier cues. Eén regel per cue aanhouden levert een document op dat technisch gezien het transcript is en praktisch gezien onleesbaar.

De alineamodus verzamelt cues en breekt af wanneer twee voorwaarden samenvallen: er is genoeg tekst opgebouwd voor een alinea, én de huidige cue eindigt op een zinsafsluitend leesteken. Zo valt een afbreking nooit midden in een gedachte. Een harde bovengrens forceert uiteindelijk toch een afbreking, want sommige sprekers gaan heel lang door zonder punt en een ononderbroken blok tekst is op zijn eigen manier onleesbaar. Een sprekerswissel begint altijd een nieuwe alinea, wat uitmaakt bij interviews en panels.

Vier formaten, één idee

Het formaat wordt afgeleid uit de inhoud van het bestand zelf en niet uit de extensie, want ondertitelbestanden worden voortdurend hernoemd en een .txt met SubRip-data erin is heel gewoon.

  • SubRip (.srt) — een numerieke index, een tijdcodebereik met komma's als decimaalteken, dan de tekst. Het meest geproduceerde formaat en het eenvoudigste.
  • WebVTT (.vtt) — de standaard van de browser. Punten in plaats van komma's als decimaalteken, plus optionele blokken NOTE, STYLE en REGION die geen spraak zijn en vóór het parsen worden verwijderd. VTT staat ook inline opmaak toe: <v Speaker> noemt wie er praat, <c.classname> past styling toe, en kale tijdstempels binnen een cue sturen het karaoke-achtig oplichten van woorden aan. Alles wordt uitgepakt, en de voice-tag wordt een sprekerlabel.
  • YouTube (.sbv) — een paar tijdcodes gescheiden door een komma op een eigen regel, dan de tekst. Geen index, geen opmaak.
  • Advanced SubStation (.ass en .ssa) — een lijst met events met een gedeclareerde kolomvolgorde. De parser leest die Format:-regel in plaats van posities aan te nemen, want het veld Text staat juist als laatste zodat het komma's kan bevatten. Override-blokken tussen accolades zijn stijlinstructies en gaan eruit; \N-regelafbrekingen worden spaties. De kolom Name geeft, als hij gevuld is, de spreker.

Sprekers, geluidseffecten en wat je bewaart

Sprekerstoewijzing komt op drie manieren binnen, afhankelijk van het formaat: een eigen veld in ASS, een voice-tag in VTT, of de kale conventie NAAM: aan het begin van een regel in SRT, dat helemaal geen sprekersveld heeft. Alle drie worden herkend en genormaliseerd naar dezelfde uitvoer. De heuristiek voor de derde is bewust smal — een reeks hoofdletters gevolgd door een dubbele punt — want een prefix in kleine letters zou gewone zinnen met dubbele punten matchen en het transcript aan flarden scheuren.

Geluidsaanduidingen tussen haken zoals [MUSIC], (laughter) en [APPLAUSE] blijven standaard staan en zijn met een schakelaar te verwijderen. Wat juist is, hangt volledig af van de klus: voor een doorzoekbaar archief of een toegankelijkheidsdocument horen ze bij de inhoud, en om een lezing door een model te laten samenvatten zijn ze ruis.

Drie uitvoervormen

De presets dekken wat mensen werkelijk willen. Schoon transcript geeft doorlopende alinea's zonder tijdcodes, om te lezen, te citeren of aan een model te geven. Met tijdstempel houdt de alinea's maar zet bij elke alinea de starttijd, wat je wilt als het transcript vooral een manier is om terug te navigeren naar een moment in de video. Ondertitelregels houdt één regel per cue met zijn tijdcode en zonder ontdubbeling — het dichtst bij het originele bestand, handig als je de ondertitels zelf controleert in plaats van ze door te lezen.

Naast de uitvoer meldt het gereedschap het gedetecteerde formaat, het aantal cues, het aantal woorden, de gedekte duur en hoeveel herhalingen zijn verwijderd. Dat laatste getal is het eerlijkste: is het hoog, dan was de bron automatisch gegenereerd en meerollend, en zie je precies hoeveel van het ruwe bestand herhaling was.

Er verlaat niets de browser

Ondertitelbestanden zijn niet altijd openbaar. Interviewopnames, interne personeelsbijeenkomsten, rechtszaken, medische consulten en niet-uitgebracht beeldmateriaal leveren ze allemaal op. Het parsen gebeurt in JavaScript in dit tabblad, dus het bestand wordt lokaal gelezen en nooit geüpload. Dat is ook waarom de conversie direct is en waarom een optie wijzigen meteen opnieuw rendert in plaats van weer een rondje naar een server te maken.