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.
./pgm2srt.pl -hVý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 $PATHV 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 pgm2srta 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 -va pokud Perl máte, je třeba změnit na prvním řádku skriptu cestu k němu.
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.
-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í. |
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
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