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ý.
Prográm 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).
./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. 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.
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, zkontroluje ho s 'obrazy' již rozpoznaných znaků, a pokud najde absolutní shodu, vyzvedne jeho textovou reprezentaci a bez dotazu 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.
Tomu říkám blízká setkání třetího druhu... i s tak blízko položenými znaky v kurzivě si algoritmus poradí. A pište si,
že i to í rozpoznal taky správně...
Problém, se kterým si zatím nevím rady a možná ho nikdy ani řešit nebudu - jakmile jsou písmenka spojena, má
algoritmizační invence je v koncích. Problém totiž je, že třeba znak u má někdy "kolébku" a "čárku" spojeny jen jediným
pixelem.
Stejný problém - některé DVD titulky jsou holt "nekvalitní" :o) a písmenka jsou spojena.
Kombinace aj apod. je pro mě zatím oříšek. První znak je rozpoznán správně, ale druhý...
Problematiskou kombinaci písmen aj apod. se mi zatím jednoduše, elegantně a spolehlivě nepodařilo vyřešit - jak
mám poznat, že "ocásek" j pod a není tečka u vykřičníku? Kdyby nebylo vykřičníku a otazníku, život by byl
hned jednodušší :o) Znak j byl sice rozpoznán správně jako jeden, ale k dalšímu použití je tento vzorek nepoužitelný
vzhledem ke zbytku z a (jedině zase pro j za a v kurzívě).
Další problém s kurzivou - jednak spojené znaky (překryv je už plných šest vertikálních pixelových sloupců!) a pak neúplné h. Řešení neúplnosti je snadné, ale dále by
zpomalilo algoritmus, takže to zapracuju až když se mi podaří vše zrychlit.
-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ě části titulku, v níž byl rozpoznán zatím neznámý znak, "vykresluje" pod 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ě sazahují jeden do druhého a někdy 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; 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ů |
-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 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íží velikosti mezer 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 textovou reprezentaci 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 >í 000000000011111110000000 ####### 000000000111111111100000 ############ 000000001111111111110000 ############# 000000011111111111110000 #### ## ##### 000000111100110011111000 # ### ## ### 000100111000110000111000 ### ## ## ## 011100110000110000011000 #### ## ## ## 111100110000110000011000 pro usnadnění nuly ### ## ## ## 111000110000110000011000 nahradím mezerou a ## ### ## ### 110000111000110000111000 jedničky křížkem # #### ## #### 100000111100110001111000 ####### #### 000000011111110011110000 ####### #### 000000011111110011110000 ###### ### 000000001111110011100000 #### # 000000000011110010000000Musíte zkontolovat bitovou reprezentaci rozpoznaného znaku, jestli je to opravdu to é a ne í č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 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. |
-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.
v1.0 - 13.10.2003
pgm2srt.pl
v1.1 - 21.10.2003
pgm2srt2.pl
v2.0 - 11.11.2003
Verze 2 již obsahuje změny ve vnitřním algoritmu, proto jsem pro ni začal
psát nový manuál.