Převod titulků z DVD - The Never-ending Story

Tak jsem tu zas :o) Při převodu titulků do TXT z DVD "Černý Jestřáb sestřelen [Black Hawk Down]" jsem narazil na velmi nepříjemný problém - titulky se časově překrývaly, tedy následující titulek začínal dříve, než předchozí skončil. To má za následek vypadávání těch titulků, které začínají moc brzo. Zkusil jsem titulky převést ještě pod windowsy za pomocí SubRipu a výsledek se mi zdál ještě horší. Navíc se mi úplně rozjela synchronizace titulků s obrazem resp. zvukem, když jsem použil formát SUB (MicroDVD). Takže jsem se vrátil k SRT formátu a jal se ručně hledat místa, kde se vyskytovaly problémy. Po chvíli mě to přestalo bavit (už mi z těch tisíců řádků přecházel zrak) a tak jsem se rozhodnul pokusit se naprogramovat něco, co by tuhle špinavou práci za mě udělalo pohodlněji, rychleji a přesněji.

Výsledek vám zde nabízím. Je to prográmek v Turbo Pascalu 7.0 - nekamenujte mě, tohle jsem se naučil ještě na gymplu a od té doby jsem neměl čas upgradovat :o)) Program jsem vytvářel v TP 7.0 pro MS-DOS, v Linuxu jsem ho pak jen mírně upravil (týká se to jen 3 míst, kde se mapují soubory příkazem assign) a zkompiloval pomocí Free Pascal Compileru (součást distribuce MandrakeLinuxu). Ke stažení máte následující soubory:

Nejdřív uvedu obecné komunikační projevy programu a pak se zastavím jednotlivě u specifik pro oba operační systémy. Výpisy programu v konzoli budu uvádět jen z Linuxu.

Program se spouští bez jakýchkoliv parametrů, názvy souborů se zadávají až v něm; v Linuxu nelze tudíž využít výpomoci klávesy TAB. Nejprve se program zeptá na název souboru titulků, který chcete zkontrolovat a případně pak také opravit. V Linuxu dbejte na rozdíl mezi malými a velkými písmeny. Ve Windows je přípustných max. 8 znaků v názvu, tečka a přípona jsou nepovinné (tečka je povinná jen u nově vytvářeného souboru) - tedy pokud nejsou v názvu souboru.
Soubor musí být ve stejném adresáři jako program. Při nenalezení souboru program skončí s hlášením Runtime error - nezdržoval jsem se ošetřením neexistence souborů.

V prvním kroku program prověří, zda jsou řádky zakončovány ve stylu Windows (CR-LF tedy 2 bajty 13 a 10), nebo jako v Linuxu pouze bajtem 10. O tomto vás taky informuje hlášením. Tuhle pasáž jsem do programu přidal pro případ jeho provozování ve Windows - ty si totiž na linuxáckém zakončení řádků vylámou zuby :o) tedy pokud se týká použitých procedur v tomto programu (readln). Jestliže jste ve Windows a program zahlásí 'Zakonceni radku ve stylu LINUX', pak nepokračujte v jeho provádění a převeďte titulky ze znakové stránky ISO-8859-2 do CP-1250. V Linuxu je to jedno, ten si poradí s obojím, výsledkem bude soubor ve formátu ISO-8859-2 a tak se nezalekněte menší délky souboru oproti původnímu, pokud byl v CP-1250.

   $ ./srtcheck

   Zadej nazev souboru [v aktualnim adresari]: Jestrab.titulky.srt
   Zakonceni radku je ve stylu WINDOWS
   Mam pokracovat? [a/n]: A
Když tedy na dotaz odpovíte ano, nastupuje druhá fáze. Dochází k ověřování správnosti časování titulků, resp. testování, zda se konec předcházejícího titulku nepřekrývá se začátkem toho následujícího. Tady jsem se upnul na SRT formát titulků tak, jak vzejdou po použití programu dvdsub (viz můj předchozí článek), například:

1
00:00:07,000 --> 00:00:12,050
"Podle skutečných událostí" 

2
00:00:15,000 --> 00:00:19,539
"Jedině mrtví se dočkali konce války." 

3
00:00:20,000 --> 00:00:22,539
Platón
Program hledá sekvenci znaků --> na pozici 14 v řádku. Jakmile jej najde, je z prvního titulku převeden čas ukončení titulku na číslo v sekundách a z následujícího titulku čas jeho začátku. Tyto dva časy se porovnají a pokud je čas konce prvního titulku menší než čas začátku druhého, je vše v pořádku a pokračuje se porovnáváním druhého a třetího titulku a tak dále až ke konci souboru. Pokud textový formát času nemá přesně podobu XX:XX:XX,XXX a není na přesných místech jako v uvedeném případě (čas začátku titulku začíná na pozici 1 na řádku a čas konce titulku na pozici 18), pak program zahlásí chybu:
   číslo_titulku-chyba ve formatu casu!
a jeho běh se ukončí. Nezbývá, než se do souboru titulků podívat a zjistit, kde je chyba. Ale při použití programu dvdsub by k tomu nemělo nikdy dojít.

Program vypisuje za každý nalezený titulek tečku (jejich počet a pořadí vůči vypisovaným číslům titulků není úplně přesné, o to mi nešlo, má to být jakýsi ukazatel průběhu). V případě, že narazí na titulek s délkou menší než 0,2 sekundy, pak vypíše číslo_titulku-spatna delka titulku! Takovýto titulek musíte opravit ručně. V případě překryvu titulků vypíše jejich čísla, přičemž opravit je potřeba ten druhý. Tady máme krátkou ukázku:

   .....4-spatna delka titulku!...7-spatna delka titulku!.....
   ...........................................................
   ...........................................................
   ............................158-159....
   Casovani titulku se prekyva, celkem chyb: 3
Po překontrolování celého souboru program vypíše celkový počet chyb, které nalezl, a zeptá se, zda má provést také opravu u špatně načasovaných titulků:
   Mam se pokusit o opravu casovani titulku? [a/n]: a
   Zadej nazev noveho souboru: Jestrab.titulky.nove.srt
Při potvrzení se soubor titulků začne prohledávat znovu tak, jak je uvedeno výše, s tím, že nalezené chyby se opraví. Tady jsem si vymyslel svoje pravidla pro opravu načasování titulku. Když předchozí titulek končí čárkou, pomlčkou či středníkem, pak následující titulek začne za 0,2 sekundy co ten předchozí končí. Tady poznámku - prakticky se ukázalo, že v ukončení titulků se problémy nevyskytují, pouze v jejich začátcích. Proto je pevným bodem konec předchozího titulku a upravuje se začátek následujícího. Když je titulek na více než jeden řádek, je jeho délka nastavena (začátek posunut oproti konci) na 4 sekundy. Pokud má titulek jen jeden řádek a má méně než 10 znaků, pak je jeho délka nastavena na 1,5 sekundy, jinak na 2,8 sekundy. Po nastavení délky titulku - posunutí jeho začátku vůči konci - se opět zkontroluje, zda se nový začátek nepřekrývá s koncem předcházejícího titulku. Pokud ano, je začátek nastaven na 0,2 sekundy po konci předešlého titulku. Je zde opět použito teček k zobrazení průběhu. Poté, co program opraví celý soubor, vypíše:
   Kontroluji po sobe:
a proběhne celý první krok kontroly titulků, tentokráte už na novém opraveném souboru. Zbylé chyby už musíte opravit ručně - mělo by se jednat jen o titulky, jejichž délka je nulová či záporná (resp. menší než 0,2 sec, jak jsem psal už výše).

Snad vám tenhle prográmek ušetří práci a zkvalitní převod DVD na CD.

Nové verze programu

5.6.2003
Pro Linux jsem upravil zadávání názvů souborů. Nyní se program spouští již s parametrem z příkazové řádky, kterým je název souboru s titulky, které se mají zkontrolovat a případně opravit. Takže už lze pro zadání názvu souboru použít klávesu TAB. A když pak zvolíte opravu titulků, tak se už program neptá na název nového souboru, ale rovnou ho pojmenuje tak, že ke vstupnímu souboru připojí .new
zdroják pro Linux binárka pro Linux

6.6.2003
Na návrh bibriho jsem změnil postup pojmenování nového souboru při opravě - původní testovaný soubor s titulkama se přejmenuje na .old a nový s opravenými titulkami se jmenuje stejně jako původní špatný. Tak si vyberte, co vám víc vyhovuje. Nebo si to napište úplně jinak :o))
zdroják pro Linux binárka pro Linux

24.6.2003
Odstraněn problém při převodu a zápisu čísla v sekundách na čas ve formátu XX:XX:XX,XXX - při specifickém čísle v sekundách docházelo k vypuštění jedné číslice u desetinné části vteřin a program pak končil hlášením '-chyba ve formatu casu!'. Týká se to oblasti řádků 283-291.
zdroják pro Linux binárka pro Linux

7.11.2003
Program jsem přepsal do Perlu, spojil s programem srtshift a přidal pár dalších šikovných funkcí - viz článek o SRTREPAIR.


LINUX

malá ikona

Počítadlo z http://pocitadlo.netway.cz/