Převod titulků z DVD do TXT - pgm2srt - již ne-chybějící článek mezi subtitle2pgm a srtrepair

S úspěšným dokončením "projektu" srtrepair.pl se slabým článkem v řetězci převodu DVD titulků do TXT podoby stal software pro převod obrázkových titulků na text. Program dvdsub Martina Kačera mi plně nevyhovoval a protože v Céčku neumím (dvdsub je právě v něm), přistoupil jsem k vlastnímu pokusu o něco podobného v Perlu. Na následujících řádcích se dozvíte, nakolik jsem byl úspěšný.

Program běhá zatím jen v textovém režimu, ale do budoucna bych chtěl k němu vytvořit také GUI. I nadále zůstává závislost na balíku transcode a zejména jeho komponentách tcextract a subtitle2pgm, případně také tccat, pokud k dekryptování DVD nepoužijete MPlayer (viz můj postup pro ripování DVD). Závislostí zde mám na mysli to, že pgm2srt umí pracovat jen s titulky již převedenými do PGM obrázků včetně časovacího souboru *.srtx.

Instalace

Jak jsem se již zmínil, program -přesněji skript- je napsán v Perlu, což je interpetový jazyk. K provedení skriptu tedy potřebujete mít nainstalován Perl, který je běžně součástí každé solidní distribuce. Pokud máte Perl nainstalován, stačí program běžně spustit z příkazové řádky. Pro začátek v adresáři, kde jste pgm2srt.pl uložili, napište
   ./pgm2srt.pl -h
Výsledkem bude stručný help obsažený v programu. Znaky ./ se zapisují proto, aby systém hledal program v aktuálním adresáři. Pokud si jste jisti, že v systému nemáte žádný jiný program či skript s názvem pgm2srt, můžete si vytvořit symbolický link tak, abyste mohli pgm2srt.pl volat odkudkoli. Nejprve si zjistíme, které adresáře systém prohledává při volání programů/aplikací z příkazové řádky:
   echo $PATH
V seznamu odděleném dvojtečkami by se měl nacházet i adresář /home/UŽIVATEL/bin (jestli ne, můžete si ho na konec přidat příkazem PATH=$PATH:/home/UŽIVATEL/bin). Tady bude nejlepší vytvořit symbolický odkaz. Pokud adresář neexistuje, vytvořte ho, a presuňte se do něj. Zde napíšeme
   ln -s /home/UŽIVATEL/Dokumenty/pgm2srt.pl pgm2srt
a na příště už odkudkoli můžeme volat jen pgm2srt. /home/UŽIVATEL/Dokumenty/pgm2srt.pl je úplná cesta, kde jste pgm2srt.pl uložili.

Pokud skript pgm2srt.pl nejde spustit z důvodu, že shell nenajde vhodný interpret - Perl, tak se nejdříve přesvěčte, zda máte Perl nainstalován např. pomocí

   perl -v
a pokud Perl máte, je třeba změnit na prvním řádku skriptu cestu k němu.

pgm2srt

Program zpracovává jednotlivé obrázkové titulky, které byly pomocí programu subtitle2pgm převedeny do sekvence PGM obrázků. Postup pro tento převod najdete v mém předchozím článku o převodu titulků z DVD. Tento projekt plnohodnotně nahrazuje tam uvedený dvdsub Martina Kačera.

Nejprve je otevřen soubor *.srtx, který obsahuje časování titulků a názvy souborů jednoutlivých obrázků s titulky - vše je vygenerováno programem subtitle2pgm. Následně jsou analyzovány jednotlivé obrázky. V obrázku program hledá jednotlivá písmenka. U prvního výskytu znaku je uživatel dotázán na jeho textovou reprezentaci. Pokud na tentýž znak program narazí znovu, porovná ho s 'obrazy' již rozpoznaných znaků v paměti, a pokud najde absolutní shodu, vyzvedne jeho textovou reprezentaci a bez dotazu na uživatele pokračuje hledáním dalšího znaku. Je zde využito toho, že v DVD titulcích vypadají shodné znaky přesně stejně. Pokud je odchylka byť minimální, program se pozastaví a zeptá se uživatale, co to vlastně rozpoznal. Problémy nastávají u kurzívy a kombinace znaků, které se buď přímo dotýkají, nebo se jejich poloha vertikálně prolíná - např. 'aj', kdy spodní část j je pod a. V takovém případě je těžké obecně odlišit, zda shluk bodů vertikálně oddělených několika pixely jsou dva různé znaky, nebo se jedná o znak s diakritikou. Program za běhu vypisuje na obrazovku část titulku, ve kterém zrovna narazil na zatím neznámý znak - viz obrázky níže.

Budu i nadále pracovat na vylepšování rozpoznávacích algoritmů. Zatím se tedy stává, že některé znaky jsou rozpoznány společně - pak uživatel vloží celou textovou reprezentaci. Čím více znaků je rozpoznáno společně, tím více má práce uživatel - musí častěji ťukat do klávesnice. Za poměrně vysokou schopnost rozpoznat právě jen jeden znak je zaplaceno relativně pomalejším během programu. To je jeden z dalších úkolů do budoucna - zrychlit, zpřehlednit a zefektivnit programový kód.

Hlášení chyb a připomínky jsou vítány.

Problémy a tipy

Jednotlivé volby programu

Program se spouští z příkazové řádky a jako poslední parametr vyžaduje název zpracovávaného srtx souboru. Nezapomeňte, že před jméno programu musíte zapsat znaky ./ aby ho systém hledal v aktuálním adresáři (pokud jste si již dříve nevyrobili symbolický link). Pokud volba obsahuje parametr, musí tento následovat ihned za ní. Některé volby lze zřetězovat, za volbou s parametrem nesmí následovat jiná volba ale parametr. Tak řekl Perl :o)
   -v
   pgm2srt -v
Vypíše verzi programu. Ta se ukládá na začátku programu do konstanty VERZE.
   -h
   pgm2srt -h
Vypíše stručný help obsažený v programu včetně několika příkladů. Příkaz pgm2srt -hv vypíše help a verzi programu, příkaz pgm2srt -vh učiní to samé v nezměněném pořadí - to je dáno pořadím testování volání jednotlivých prodprogramů v hlavním programu.
   -o <Název_výstupního_souboru>
   pgm2srt -o Titulky.srt titulky.srtx
slouží ke specifikaci názvu výstupního souboru titulků. Pokud není volba použita, je k původnímu názvu vstupního souboru titulků připojeno .new. Tato volba tedy vyžaduje parametr, který musí následovat bezprostředně po ní (ostatně jako v případě všech 'parametrických' voleb v Perlu).
   -r
   pgm2srt -r titulky.srtx
Kromě výseku části titulku, v níž byl rozpoznán zatím neznámý znak, "vykresluje" také konkrétní podobu znaku tak, jak jej program rozpoznal a jak bude uložen v databázi rozpoznaných znaků - hodí se v případě kurzívy, kdy znaky vertikálně zasahují jeden do druhého a někdy tak jen z části titulku nemusí být jasné, co přesně program rozpoznal.
   -w <číslo>
   pgm2srt -w 100 titulky.srtx
číslo udává maximální počet znaků na řádek, které bude program vypisovat při zobrazení části titulku - souvisí s šířkou vámi používaného terminálu; implicitní hodnota je 80.
   -c <číslo>
   pgm2srt -c 15 titulky.srtx
číslo udává minimální výšku jednoho řádku v pixelech - musí to být nejméně výška diakritiky plus její vzdálenost od znaku plus něco málo; implicitní hodnota je 10 a nemělo by být potřeba ji měnit - leda že by docházelo k vyhodnocování neucelených řádků titulků (např. pouze diakritika)
   -d <číslo>
   pgm2srt -d 4 titulky.srtx
číslo v pixelech udává maximální vertikální vzdálenost diakritiky a teček nad znaky (počet prázdných pixelů mezi "aktivními" pixely) - využívá se při stanovení, zda jeden shluk pixelů nad jiným bude považován za součást znaku nebo ne. Pokud se vám nad znaky ztrácí tečky či diakritika, je tuto hodnotu nutno zvýšit. Implicitní hodnota je 3.
   -g <číslo>
   pgm2srt -g 8 titulky.srtx
číslo v pixelech se používá pro stanovení, zda jde jen o oddělení znaků, nebo o mezeru mezi slovy. Implicitní hodnota je 6 a při její změně je nutno uvažovat i kurzívu - tam jsou mezery mezi slovy (počet prázných vertikálních pixel-sloupců) menší/užší a často se blíží vzdálenosti mezi mezi znaky u normálního písma.
   -e <číslo>
   pgm2srt -e 5 titulky.srtx
číslo v pixelech udává počet vertikálních pixel-sloupců, které jsou z každé strany znaku upravovány tak, aby do znaku nezasahovaly okraje sousedních znaků - hlavně při kurzívě. Implicitní hodnota je 4. Pokud program příliš často generuje spojené znaky, je třeba toto číslo zvýšit.
   -s <Název_ukládané_OCR_databáze>
   pgm2srt -s Titulky titulky.srtx
slouží ke specifikaci názvu výstupního souboru, v němž bude uložena databáze rozpoznaných znaků po ukončení práce na titulcích. K názvu je připojena ještě přípona '.pgm2srt'. Formát souboru je popsán na jeho začátku. Soubor je kompletně textový a tak v něm lze bez problémů provádět úpravy. Jestliže jste se např. v půlce práce na titulcích překlepli a špatně zadali textový ekvivalent rozpoznaného znaku, nemusíte vše začínat znovu. Jen po skončení programu zeditujete uloženou OCR databázi - vyhledáte textový znak, který jste vložili špatně, a jednoduše ho přepíšete na nový. Např. program rozpozná é a vy vložíte í. Pak stačí vyhledat v souboru znak í a uvidíte např. následující:
%3650
>í

    #######
 ############
 #############
#####  ##  ####
###    ##   ###  #
##     ##    ##  ###
##     ##    ##  ####
##     ##    ##   ###
###    ##   ###    ##
####   ##  ####     #
 ####  #######
 ####  #######
  ###  ######
    #  ####


Musíte zkontolovat textovou reprezentaci rozpoznaného znaku, jestli je to opravdu to špatně zadané í a ne správné í či í kurzívou - uvědomte si, že pro jeden textový znak může a zpravidla existuje v DVD titulcích více grafických podob. Tady při troše představivosti vidíme opravu é, takže akorát stačí í přepsat na é a uložit. A v dalším kroku titulky znovu projedeme s využitím takto upravené OCR databáze - viz následující volba. Stejně tak můžete využít uloženou OCR databázi v případě, že mezery mezi písmeny a slovy nevyhovují implicitnímu nastavení a výsledkem jsou buď mezery ve slovech, nebo nerozdělená slova. V takovémto případě je nutno zároveň použít volbu -g a zkusit jinou než implicitní hodnotu, se součastným použitím volby -l. Pokud jsou ve slovech mezery, je nutno zvýšit parametr pro -g, někdy stačí i jen o jediný pixel - z implicitních 6 na 7. Pokud se slova slévají (vypadávají mezery), parametr pro -g je nutno snížit. Výjimečně to však nezabírá, když mezery v pasážích s kurzívou jsou diametrálně jiné než v běžném textu. Můžete se mrknout na jednu vygenerovanou databázi.
   -l <Název_načítané_OCR_databáze>
   pgm2srt -l Titulky titulky.srtx
načte OCR databázi Titulky.pgm2srt a začne zpracovávat soubor titulky.srtx. Pokud zadaná OCR databáze plně odpovídá znakové sadě použité v titulcích, uživatel nebude dotázán na žádný znak, všechny by měly být identifikovatelné z dřívějška. Tady taky uvidíte, jak "rychlý" program opravdu je, když nemusí čekat na uživatelský vstup. Zatížení procesoru vylétne na možné maximum. Název OCR databáze lze zadat buď bez "přípony" .pgm2srt nebo s ní.

Příklad

pgm2srt -o Zorro.srt -s Zorro -rw 120 titulky.srtx

Já osobně využívám pouze volby -r, -w, -s (občas -l), popř. -o.

Jak to vypadá?

Jelikož se část obrázkového titulku zobrazuje v terminálu jako text, je spotřeba místa značná. Já si proto v emulátoru terminálu v grafickém rozhraní (v KDE používám Konsole) nastavím velikost písma na malé a použiju volby -rw 100. Nevýhodou je však špatná viditelnost interaktivních hlášení (uživatelský vstup). To bych chtěl časem vyřešit vytvořením GUI (Graphical User Interface - no prostě grafické/klikací prostředí/rozhraní). Několik ukázek vidíte na následujících screen shotech.


Znaky kt se na první pohled jeví, že jsou spojeny jen v jednom bodě. Můj algoritmus však testuje jen pixel-sloupce, které obsahují jediný aktivní pixel a takový sloupec zde není - v místě spojení kt jsou dva pixely - musíte brát v úvahu i ten dolní od k. Každopádně programu řeknete jednou, že jde o kt, a příště, až na tyto dva slité znaky narazí, sám kt dosadí.


Tady máme tři slité znaky - r a y jsou odděleny pixel-sloupcem v němž je pouze jeden aktivní pixel, ale znaky y a t již nikoli. Za předpokladu, že již z předchozích titulků se do OCR databáze uložily rozpoznané znaky r a yt, pak se vás program na nic ptát nebude a sám je doplní. V opačném případě, jako zde, se vás dotáže. A zje je problém - vy vložíte znaky tři, ale algoritmus je sekvenci schopen rozložit jen na "znaky" dva - r a yt, protože najde jen jeden pixel-sloupec, ve kterém je jediný aktivní pixel. Proto si tuto kombinaci nezapamatuje. V další verzi to vyřeším nějakou oklikou - nejspíš zapamatováním celé sekvence tří znaků dohromady.


Úplně stejný problém jako výše.


Vložte normální aspostrof. Pomocí programu srtrepair s volbou -g dojde k nahrazení d' na ď.


S běžnou kurzívou si algorytmus radí velmi slušně.


Jak vidíte, přijatelný vertikální překryv (do tří pexelů) z obou stran není žádný problém.


I tohle algorytmus zvládne.


Tak toto bych už nečekal :o)


Problém dvojice znaků aj jsem už zmínil. Obtížnost jeho řešení je neadekvátní zisku.


Tady vidíte užitečnost volby -r - program se ptá na jen na i bez tečky za větou.


Další příklad příliš vysokého vertikálního překryvu písmen v kurzívě - 5 pexelů.


4 pixely překryvu znaků ještě algorytmus zvládne.


Další slité znaky. Neúplnost h zevnitř je drobná skulinka v algorytmu, která nemá na výsledek žádný vliv.


Jste zmatení? Tady došlo ke zřídkavému jevu - dva řádky titulků z jednoho obrázku mesi sebou nemají horizontální pixelovou mezeru - např. spodní část j v horním řádku končí tam, kde začíná horní část diakritiky nad velkým písmenem ve spodním řádku titulku. Tak se stane, že diakritika velkých znaků spodního řádku je přiřazena hornímu řádku. Horní háček zde je zvýrazněná část titulku a spodní háček je zobrazený rozpoznaný znak. Řešením je poznačit si problémový titulek (a na konci ho zkontrolovat) a jen odklepnout ENTER. Jak třeba takový problémový titulek vypadá:

Algorytmus rozdělí dva řádky obrázkového titulku následovně - viz dva červené rámečky. Takže první dotaz programu bude na háček dole, pak na pomlčku a až potom na A. Problém je v nedostatečné mezeře mezi jednotlivými řádky titulků. A na to je můj rozum krátký :o)


V kurzívě často uteče tečka u vykřičníku či otazníku. Ono se vlastně zas tak moc neděje :o)


Příklad slitých znaků, se kterými si algorytmus dokáže poradit - na tuto kombinaci se vás už nezeptá a navíc se nezeptá už ani na r ani na ý. Kdyby už dříve znal samostatné r a ý, neptal by se na toto.


Takhle to vypadá u mě v Konsole s malým písmem při rozlišení 1280x960 po použití příkazu

   pgm2srt -s hannibal -w 140 -r -o hannibal.srt -p @ -b _ -a \' titulky.srtx
Zpětné lomítko je použito proto, aby shell/bash neinterpretoval apostrof, ale nezměněn ho předal jako parametr skriptu. Kdo si tedy zvyknul na vzhled výstupu programu dvdtit Martina Kačera, může si ho klidně nasimulovat i v mém programu :o)

TO DO aneb Plány do budoucna

Aktuální verze programu

Tento můj program (i ty další na mých stránkách) je free software; může být šířen a/nebo modifikován za podmínek GNU General Public Licence vydaných Free Software Foundation (verze 2 licence nebo pozdější).

Na světě je již grafická verze programu pod názvem gpgm2srt.

v2.1 - 7.5.2004
pgm2srt4.pl

v2.0 - 11.11.2003
pgm2srt3.pl

v1.1 - 21.10.2003
pgm2srt2.pl

v1.0 - 13.10.2003
pgm2srt.pl


LINUX

malá ikona

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