rendered paste body#!/usr/bin/perl
# ocr.pl 0.1
# Copyright (C) 2008 -- zukex <zukex.pukex@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
#
# ###########################################################################
# requires: libunicode-maputf8-perl
use Encode;
use Unicode::String;
Unicode::String->stringify_as( 'utf8' );
use Getopt::Std;
getopt('io');
sub usage {
printf "Usage: ocr.pl -i input.sub [-o output.sub]\n";
exit(-1);
}
#if ($#ARGV < 0) { usage(); }
printf "$#ARGV input: $opt_i\n";
my $file;
my @lines;
$file = "<$opt_i";
open(INFO, $file);
@lines = <INFO>;
close(INFO);
#print @lines;
my $lnro = 1;
my $lastline;
my $laststart;
my $lastend;
my $lastdur;
my $fps;
my $mindur;
my $maxlinelen = "50";
my $maxlinelen_single = "40";
my %commontypos1 = (
"aikalailla","aika lailla", # common typos, list based on divxfinland.ocr
"aikatavalla","aika tavalla",
"aikapäiviä","aika päiviä",
"ainakun","aina kun",
"aivankuin","aivan kuin",
"ajanmittaan","ajan mittaan",
"ajantasalla","ajan tasalla",
"alas päin","alaspäin",
"alin omaa","alinomaa",
"allamainittu","alla mainttu",
## "allapäin","alla päin(paikasta)allapäin(mielialasta)",
"allaoleva","alla oleva",
"alle kirjoittanut","allekirjoittanut",
"alle viivattu","alleviivattu",
"alunalkaen","alun alkaen",
"alunperin","alun perin",
"alunpitäen","alun pitäen",
"aniharva","ani harva",
"aniharvoin","ani harvoin",
"arvossapidetty","arvostettu",
"asiaan kuuluva","asiaankuuluva",
"asian mukainen","asianmukainen",
"edellämainittu","edellä mainittu",
"edelläoleva","edellä oleva",
"edeltäkäsin","edeltä käsin",
"edessä päin","edessäpäin",
"ehdointahdoin","ehdoin tahdoin",
"ennenaikaan","ennen aikaan",
"ennenkaikkea","ennen kaikkea",
"ennenkuin","ennen kuin",
"ennenmuinoin","ennen muinoin",
"ennenpitkää","ennen pitkää",
"ennenvanhaan","ennen vanhaan",
"ensikädessä","ensi kädessä",
"ensisijassa","ensi sijassa",
"ensivuonna","ensi vuonna",
"ensi sijainen","ensisijainen",
"erilailla","eri lailla",
"eritavalla","eri tavalla",
"eri arvoinen","eriarvoinen",
"eri kokoinen","erikokoinen",
"eri näköinen","erinäköinen",
"eri tyyppinen","erityyppinen",
"esiin tullut","esiintullut",
"eteen päin","eteenpäin",
"heikunkeikun","heikun keikun",
"hetikun","heti kun",
"hissunkissun","hissun kissun",
"huiskinhaiskin","huiskin haiskin",
"hujanhajan","hujan hajan",
"huomen aamu","huomenaamu",
"huomen aamun","huomenaamun",
"huomen aamua","huomenaamua",
"huomen aamuun","huomenaamuun",
"huomen aamujen","huomenaamujen",
"huomen aamuja","huomenaamuja",
"huomen aamuihin","huomenaamuihin",
"huomen aamuisen","huomenaamuisen",
"huomen aamuinen","huomenaamuinen",
"huomen ilta","huomenilta",
"huomen illan","huomenillan",
"huomen iltaa","huomeniltaa",
"huomen iltaan","huomeniltaan",
"huomen iltojen","huomeniltojen",
"huomen iltoja","huomeniltoja",
"huomen iltoihin","huomeniltoihin",
"huomen iltaisen","huomeniltaisen",
"huomen iltainen","huomeniltainen",
"huomioonottaen","huomioon ottaen",
"hyväksi käyttö","hyväksikäyttö",
"hyväksikäyttäminen","hyväksi käyttäminen",
"hädintuskin","hädin tuskin",
"hälläväliä","hällä väliä",
"ikäänkuin","ikään kuin",
"itseasiassa","itse asiassa",
"itsekukin","itse kukin",
"itsestäänselvä","itsestään selvä",
"iänkaiken","iän kaiken",
"jokaikinen","joka ikinen",
"jokakertakun","joka kerta kun",
"jokapäivä","joka päivä",
"jokatapauksessa","joka tapauksessa",
"joka päiväinen","jokapäiväinen",
"jompi kumpi","jompikumpi",
"jonkajälkeen","jonka jälkeen",
"jonkinaikaa","jonkin aikaa",
"jonkinverran","jonkin verran",
"jonkin näköinen","jonkinnäköinen",
"joten kuten","jotenkuten",
"juurtajaksaen","juurta jaksaen",
"juurtajaksain","juurta jaksain",
"jälkeen päin","jälkeenpäin",
"jälleen vakuutettu","jälleenvakuutettu",
"kahdenkesken","kahden kesken",
"kaikenkaikkiaan","kaiken kaikkiaan",
"kaiken lainen","kaikenlainen",
"kaikinpuolin","kaikin puolin",
"kauttarantain","kautta rantain",
"kertakaikkiaan","kerta kaikkiaan",
"kerta kaikkinen","kertakaikkinen",
"keskenjäänyt","kesken jäänyt",
"keskenkaiken","kesken kaiken",
"kiikunkaakun","kiikun kaakun",
"kipinkapin","kipin kapin",
"kokolailla","koko lailla",
"kolmin kertainen","kolminkertainen",
"kynsinhampain","kynsin hampain",
"kädenkäänteessä","käden käänteessä",
"käsinkirjoitettu","käsin kirjoitettu",
"loppujenlopuksi","loppujen lopuksi",
"lukuunottamatta","lukuun ottamatta",
"läpi näkyvä","läpinäkyvä",
"läsnäoleva","läsnä oleva",
"läsnäollessa","läsnä ollessa",
"läsnä olija","läsnäolija",
"läsnä olo","läsnäolo",
"metrinpituinen","metrin pituinen",
"mielinkielin","mielin kielin",
"mielinmäärin","mielin määrin",
"minkätakia","minkä takia",
"minkätähden","minkä tähden",
"minkävuoksi","minkä vuoksi",
"minkä lainen","minkälainen",
"miten kuten","mitenkuten",
"mitenpäin","miten päin",
"mitävarten ","mitä varten",
"moninverroin","monin verroin",
"mukaanluettuna","mukaan luettuna",
"mukaanlukien","mukaan lukien",
"mukkelismakkelis","mukkelis makkelis",
"mullinmallin","mullin mallin",
"muunmuassa","muun muassa",
"muun lainen","muunlainen",
"niinkuin","niin kuin",
"niinkauan","niin kauan",
"niinikään","niin ikään",
"niinollen","niin ollen",
"niinpäin","niin päin",
"niinsanotusti","niin sanotusti",
"niinsanottu","niin sanottu",
"nimen omaan","nimenomaan",
"nipinnapin","nipin napin",
"nippanappa","nippa nappa",
"niukinnaukin","niukin naukin",
"noinpäin","noin päin",
"noniin","no niin",
"nurinpäin","nurin päin",
"näinollen","näin ollen",
"oikeinpäin","oikein päin",
"olemassaoleva","olemassa oleva",
"olemassa olo","olemassolo",
"olemassaoleminen","olemassa oleminen",
"osan otto","osanotto",
"paikkapaikoin","paikka paikoin",
"perinjuurin","perin juurin",
"perinpohjin","perin pohjin",
"pikku hiljaa","pikkuhiljaa",
"pois päin","poispäin",
"poissaoleva","poissa oleva",
"poissa olo","poissaolo",
"poissaoleminen","poissa oleminen",
"puheenaoleva","puheena oleva",
"päin vastoin","päinvastoin",
"päällä päin","päälläpäin",
"päätäpahkaa","päätä pahkaa",
"ristiinrastiin","ristiin rastiin",
"ruotsin suomalainen","ruotsinsuomalainen",
"samaanaikaan","samaan aikaan",
"samallakun","samalla kun",
"saman aikainen","samanaikainen",
"saman arvoinen","samanarvoinen",
"samantien","saman tien",
"samanverran","saman verran",
"sanoinkuvaamaton","sanoin kuvaamaton",
"senjälkeen","sen jälkeen",
"sensijaan","sen sijaan",
"sentakia","sen takia",
"sentähden","sen tähden",
"senverran","sen verran",
"senvuoksi","sen vuoksi",
"siellä päin","sielläpäin",
"siellätäällä","siellä täällä",
"sikinsokin","sikin sokin",
"silloinkun","silloin kuin",
"sillointällöin","silloin tällöin",
"sillälailla","sillä lailla",
"sillätapaa","sillä tapaa",
"sillätavoin","sillä tavoin",
"sillävälin","sillä välin",
"silmälläpitäen","silmällä pitäen",
"sinnetänne","sinne tänne",
"sinne päin","sinnepäin",
"sisään päin","sisäänpäin",
"sittenkun","sitten kun",
"sitämukaa","sitä mukaa",
"sitäpaitsi","sitä paitsi",
"sitävarten","sitä varten",
"sitävastoin","sitä vastoin",
"sivu mennen","sivumennen",
"suinpäin","suin päin",
"suomen kielinen","suomenkielinen",
"suomenkieli","suomen kieli",
"suoraapäätä","suoraa päätä",
"suunapäänä","suuna päänä",
"suuntaaantava","suuntaa antava",
"suurinpiirtein","suurin piirtein",
"taakse päin","taaksepäin",
"tavantakaa","tavan takaa",
"terve tullut","tervetullut",
"toimeen paneva","toimeenpaneva",
"toimeen pano","toimeenpano",
"tottakai","totta kai",
"tuikitavallinen","tuiki tavallinen",
"tuikitärkeä","tuiki tärkeä",
"tuollapuolen","tuolla puolen",
"tuonne päin","tuonnepäin",
"tuotapikaa","tuota pikaa",
"tähänasti","tähän asti",
"tähän astinen","tähänastinen",
"tälläkertaa","tällä kertaa",
"tällälailla","tällä lailla",
"tällätavoin","tällä tavoin",
"tämänjälkeen","tämän jälkeen",
"tämänsijaan","tämän sijaan",
"tämänvuoksi","tämän vuoksi",
"tänneasti","tänne asti",
"tänne päin","tännepäin",
"umpi mähkään","umpimähkään",
"uuden vuoden aatto","uudenvuoden aatto",
"tälläkertaa","tällä kertaa",
"tällälailla","tällä lailla",
"tällätavoin","tällä tavoin",
"tämänjälkeen","tämän jälkeen",
"tämänvuoksi","tämän vuoksi",
"tänneasti","tänne asti",
"tänne päin","tännepäin",
"töintuskin","töin tuskin",
"umpi mähkään","umpimähkään",
"uraa uurtava","uraauurtava",
"uuden aikainen","uudenaikainen",
"uuden tyyppinen","uudentyyppinen",
"valantehnyt","valan tehnyt",
"vartavasten","varta vasten",
"viimeaikoina","viime aikoina",
"viimekädessä","viime kädessä",
"viime aikainen","viimeaikainen",
"viime kertainen","viimekertainen",
"viime vuotinen","viimevuotinen",
"viimeksimainittu","viimeksi mainittu",
"vinksinvonksin","vinksin vonksin",
"voimassaoleva","voimassa oleva",
"voimassa olo","voimassaolo",
"vuoronperään","vuoron perään",
"vähänväliä","vähän väliä",
"väärinpäin","väärin päin",
"yht aikaa","yhtaikaa",
"yhtä aikainen","yhtäaikainen",
"yhtäaikaa","yhtä aikaa",
"yhtähyvin","yhtä hyvin",
"yhtäkaikki","yhtä kaikki",
"yhtäkuin","yhtä kuin",
"yhtälailla","yhtä lailla",
"yhtämittaa","yhtä mittaa",
"yhtäpäätä","yhtä päätä",
"yhtäsuuri","yhtä suuri",
"yht äkkiä","yhtäkkiä",
"yksin omaan","yksinomaan",
"yksintein","yksin tein",
"ylenmäärin","ylen määrin",
"yllinkyllin","yllin kyllin",
"yllämainittu","yllä mainittu",
"ylläoleva","yllä oleva",
"yltäpäältä","yltä päältä",
"ylös alaisin","ylösalaisin",
"ylös päin","ylöspäin",
"äskenmainittu","äsken mainittu",
"elin taso","elintaso", # added to divxfinland.ocr on 13.05.2005
"eloonjäänyt","eloon jäänyt",
"elossaoleva","elossa oleva",
"elämänkerta","elämäkerta",
"elämän kerta","elämäkerta",
"elämän laatu","elämänlaatu",
"enintäin","enintään",
"aatamin aikainen","aataminaikainen",
"aallon pituus","aallonpituus",
"aikatavalla","aika tavalla",
"ajan tasainen","ajantasainen",
"allamainittu","alla mainittu",
"allaoleva","alla oleva",
"allaesitetty","alla esitetty",
"alta päin","altapäin",
"alta vastaaja","altavastaaja",
"alussamainittu","alussa mainittu",
"amppeeri","ampeeri",
"anivarhain","ani varhain",
"anivarhainen","ani varhainen",
"anteeksi antamaton","anteeksiantamaton",
"anteeksi antava","anteeksiantava",
"appelssiini","appelsiini",
"arka luontoinen","arkaluontoinen",
"arka luonteinen","arkaluonteinen",
"arki pyhä","arkipyhä",
"rahan arvoinen","rahanarvoinen",
"omaisuudenarvoinen","omaisuuden arvoinen",
"aseista riisunta","aseistariisunta",
"asian omainen","asianomainen",
"ajan mukainen","ajanmukainen",
"totuuden mukainen","totuudenmukainen",
"edeltä päin","edeltäpäin",
"edellä kävijä","edelläkävijä",
"edelläesitetty","edellä esitetty",
"edessäoleva","edessä oleva",
"edes takaisin","edestakaisin",
"edestä päin","edestäpäin",
"eleffantti","elefantti",
"elikkä","eli",
"elikä","eli",
"eninten","eniten",
"ennen näkemätön","ennennäkemätön",
"ensialkuun","ensi alkuun",
"ensi apu","ensiapu",
"ensi esiintyminen","ensiesiintyminen",
"ensi esitys","ensiesitys",
"ensi kertalainen","ensikertalainen",
"ensikokemus","ensi kokemus",
"ensi lumi","ensilumi",
"ensiluokka","ensi luokka",
"ensiksimainittu","ensiksi mainittu",
"ensinmainittu","ensin mainittu",
"ensi painos","ensipainos",
"ensitilassa","ensi tilassa",
"ensi tapaaminen","ensitapaaminen",
"ensi vaikutelma","ensivaikutelma",
"eri ikäinen","eri-ikäinen",
"eri suuruinen","erisuuruinen",
"erikoko","eri koko",
"eri lainen","erilainen",
"erin omainen","erinomainen",
"esiin tulleesta","esiintulleesta",
"lapsuuden aikainen","lapsuudenaikainen",
"rauhan aikainen","rauhanaikainen",
"sodan aikainen","sodanaikainen",
"toisen maailmansodanaikainen","toisen maailmansodan aikainen",
"etu käteen","etukäteen",
"anteeksi antava","anteeksiantava", # added to divxfinland.ocr on 12.05.2006
"paikan päällä","paikanpäällä"
);
sub preservecase {
my ($orig, $replace) = @_;
if ($orig =~ /^[A-Z ]+$/) {
return uc($replace);
} elsif ($orig =~ /^[A-Z]/) {
return ucfirst($replace);
} else {
return $replace;
}
}
sub commontypos1 {
my ($linetxt) = @_;
foreach $typo (keys %commontypos1)
{
if ($linetxt =~ /[ ^\|](${typo})[ \.\-\?!\,\|]/i) {
my $replacement = preservecase($1,$commontypos1{$typo});
print "line $lnro fix typo: \"$1\" -> \"$replacement\" \n";
}
}
}
my %abbre1 = (
"hra\\\.","herra",
"rva\\\.","rouva",
"nti\\\.","neiti",
"tri\\\.","tohtori"
);
sub abbre1 {
my ($linetxt) = @_;
foreach $abbre (keys %abbre1)
{
if ($linetxt =~ /[ ^\|](${abbre})[ \.\-\?!\,\|]/i) {
my $replacement = preservecase($1,$abbre1{$abbre});
print "line $lnro fix typo: \"$1\" -> \"$replacement\" \n";
}
}
}
foreach $line (@lines) {
my $linetxt = $line;
#Dealing with iso-8859-15 so converting to utf8
$linetxt = Unicode::String::latin1($linetxt);
$linetxt =~ s/{[0-9]+}{[0-9]+}//;
$line =~ /{([0-9]+)}{[0-9]+}/;
my $linestart = $1;
$line =~ /{[0-9]+}{([0-9]+)}/;
my $lineend = $1;
my $linedur = $lineend - $linestart;
my $linetxt1 = $linetxt;
$linetxt1 =~ s/\|.*//;
my $linetxt2;
if ($linetxt =~ /\|/) {
$linetxt2 = $linetxt;
$linetxt2 =~ s/.*\|//;
}
### FIX FOR UTF8 lenght detection
my $line1len = $linetxt1;
$line1len = length(decode_utf8($line1len));
my $line2len = $linetxt2;
$line2len = length(decode_utf8($line2len));
####
if ($lnro == 1) {
$linetxt =~ /([0-9.]+)/;
$fps = int($1 + .5);
$mindur = $fps*2;
}
if ($fps < 1) {$fps = "24"; $mindur = "48";}
if (length ($lastline) > 1) {
if ($linestart > 5 && $linestart-$lastend-4 < 0) {
print "line $lnro is missing 4 frame gap\n";
}
if ($linedur < $mindur) {
print "line $lnro has too short duration, $linedur vs $mindur\n";
}
if ($line1len > $maxlinelen_single && $line2len < 1) {
print "line $lnro is $line1len chars long, even though line 2 is unused (max for single line: $maxlinelen_single)\n";
} elsif ($line1len > $maxlinelen || $line2len > $maxlinelen) {
print "line $lnro has too long lines line1: $line1len line2: $line2len maxlen: $maxlinelen\n";
}
if ($linetxt =~ /\.\.\.(\|| )[a-z]/) {
print "line $lnro has lowercase chars after ...\n";
}
if ($linetxt =~ /^[a-z]/ && ! $lastline =~ /-$/) {
print "line $lnro starts with lowercase but previous line doesn't end in -\n";
}
if ($linetxt =~ / \|/ || $linetxt =~ /\| /) {
print "line $lnro has unnecessary spaces (before or after linechange)\n";
}
commontypos1($linetxt);
abbre1($linetxt);
}
#print "$line";
#print "linestart: $linestart lineend: $lineend dur: $linedur len1: $line1len len2: $line2len\n";
#print "linetxt $linetxt";
#print "linetxt1 $linetxt1\n";
#print "linetxt2 $linetxt2\n";
#print "\n";
$lastline = $line;
$laststart = $linestart;
$lastend = $lineend;
$lastdur = $linedur;
$lnro = $lnro+1;
}
print "\n";
print "fps: $fps mindur: $mindur";
print "\n";