Převod titulků z DVD do TXT - pgm2srt - č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ý.

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).

Instalace

Jak jsem se již zmínil, program 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. 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.

pgm2srt

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

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.

Co umíme?

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í nastavím velikost písma na malé s použitím voleb -r -w 150 (mám zatím jen 15" monitor!!! :o( ). 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. Několik ukázek vidíte na následujících screen shotech.


Tady je vidět, že kurzíva algoritmu většinou problémy nečiní. Parametr -r se občas hodí, protože v původním titulku bývá kromě rozpoznaného znaku označeno také okolí, které zasahuje do svislých hranic znaku. Zejména při interpunkci za kurzívou člověk neví, co přesně program našel, pokud nepoužijete volbu -r.


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.

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ě čá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                                      ####  #
000000000011110010000000                            
Musí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í.

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.

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ší).

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.


LINUX

malá ikona

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