Kirjoittaja Aihe: Ylen tekstityksen kuvista srt-tiedosto...  (Luettu 20729 kertaa)

SuperOscar

  • Käyttäjä
  • Viestejä: 3993
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: Ylen tekstityksen kuvista srt-tiedosto...
« Vastaus #20 : 07.01.19 - klo:21.19 »
ReadMe - kirjoitti...

No sehän tietenkin jäi lukemati – ei tosimies lue dokkareita! 8)

Enihuu, hieman hankalaahan tuo käyttö toistaiseksi on, kun ohjelmia ei voi vain heittää jonnekin kansioon ja ajaa sieltä vaan ne täytyy kopioida työskentelykansioon. Wrapper-skriptinä toimivan makesrtsubtitles.sh:n pitäisi mieluummin osata etsiä kutsumansa kamat jostakin. Eikähän se iso korjaus olisikaan, pitäisi vain korvata ”./” ohjelmien poluissa jollakin, mikä ensin on selvitetty (tai luotetaan $PATHiin).

Itse lopputulos on enimmäkseen kunnossa, mutta skripti äänekäs:

Koodia: [Valitse]
rm: tiedostoa 'errors.txt' ei voi poistaa: Tiedostoa tai hakemistoa ei ole
Warning. Invalid resolution 0 dpi. Using 70 instead.
Warning. Invalid resolution 0 dpi. Using 70 instead.
Warning. Invalid resolution 0 dpi. Using 70 instead.
Traceback (most recent call last):
  File "./makeOneLine.py", line 32, in <module>
    res=res+(f.readlines()[0][0:-1])
IndexError: list index out of range
Warning. Invalid resolution 0 dpi. Using 70 instead.

Sitten miljoona riviä noita samanlaisia Tesseractin varoituksia ja aina välissä tuo Traceback-viesti.
pöytäkone 1, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; NUC: openSUSE Leap 15.5; RPi 1: FreeBSD 13.2-RELEASE; RPi 2: LibreELEC 11

kamara

  • Käyttäjä
  • Viestejä: 2944
    • Profiili
Vs: Ylen tekstityksen kuvista srt-tiedosto...
« Vastaus #21 : 08.01.19 - klo:07.17 »
Enihuu, hieman hankalaahan tuo käyttö toistaiseksi on, kun ohjelmia ei voi vain heittää jonnekin kansioon ja ajaa sieltä vaan ne täytyy kopioida työskentelykansioon. Wrapper-skriptinä toimivan makesrtsubtitles.sh:n pitäisi mieluummin osata etsiä kutsumansa kamat jostakin. Eikähän se iso korjaus olisikaan, pitäisi vain korvata ”./” ohjelmien poluissa jollakin, mikä ensin on selvitetty (tai luotetaan $PATHiin).

Itse lopputulos on enimmäkseen kunnossa, mutta skripti äänekäs:

Koodia: [Valitse]
rm: tiedostoa 'errors.txt' ei voi poistaa: Tiedostoa tai hakemistoa ei ole
Warning. Invalid resolution 0 dpi. Using 70 instead.
Warning. Invalid resolution 0 dpi. Using 70 instead.
Warning. Invalid resolution 0 dpi. Using 70 instead.
Traceback (most recent call last):
  File "./makeOneLine.py", line 32, in <module>
    res=res+(f.readlines()[0][0:-1])
IndexError: list index out of range
Warning. Invalid resolution 0 dpi. Using 70 instead.

Sitten miljoona riviä noita samanlaisia Tesseractin varoituksia ja aina välissä tuo Traceback-viesti.

Joo, en ole viitsinyt viimeistellä scriptiä, niin se on varsin äänekäs.
Ensimmäinen errors.txt yrittää poistaa virhe-tiedoston, mikäli sellainen on, ja yleensähän sellaista tiedostoa ei ole, joten se valittaa tiedoston puutteesta.

Tesseract ei tykkää LodePNG:llä tehdystä kuvasta, koska LodePNG ei määrittele kuvalle resoluutiota (siis pistettä/tuuma). Siistä siis tulee toi...
Koodia: [Valitse]
Warning. Invalid resolution 0 dpi. Using 70 instead.

Jälkimmäinen, jonka pitäisi ilmentyä hivenen harvemmin tulee siitä, ettei tesseract-anna tekstiä (tavuakaan), mutta python-ohjelma yrittää poistaa viimeisen tavun.

Laiskuuttahan se tietenkin on, mutta toisaalta toimivaa peliä ei kannata sorkkia.

Jos muuttaa makesrtsubtitles.sh:n tällaiseksi, niin pitäisi toi ensimmäinen virheilmoitus poistua ("errors.txt-tiedostoa ei voi poistaa")...
Koodia: [Valitse]
#!/bin/bash
declare -i i
i="0"
touch errors.txt
rm errors.txt
touch errors.txt
for f in *.png
do
    i="$i+1"
    echo $i
    #echo ${f%kuva.png}
    ./YLEsubtextPrepare $f
    python ./makeOneLine.py ${f} $i rm
    echo
done
#rm *pngNormalWord*

kamara

  • Käyttäjä
  • Viestejä: 2944
    • Profiili
Vs: Ylen tekstityksen kuvista srt-tiedosto...
« Vastaus #22 : 05.02.19 - klo:17.47 »
Tein ruman, mutta halutun muutoksen python-scriptiin. Sen jälkeen ei pitäisi liikoja huudella resoluution puutteesta, mutta riippuvuuksiin tuli imagemagick muiden ohjelmien lisäksi, ja ohjelma sen takia toimii hitaammin:
cat makeOneLine.py
Koodia: [Valitse]
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys , os,os.path #, serial, threading
#import optparse
#converttimestamps.py

args = sys.argv
#print args
if len(args)>3:
    #print args[1]
    #sys.ex
    #os.remove("errors.txt")
    f=os.popen("cat spumux.xml|grep "+args[1])
    rows=f.readlines()
    f.close()
    #print("OK?:"+rows[0])
    error=False
    row=rows[0].replace(".",",")
    print row[14:14+11] + " --> " + row[14+11+7:14+11+7+11]
    for x in range(10):
        s=args[1]+"NormalWords-"+str(x)
        res=""
        for y in range(10):
            ss=s+"-"+str(y+1)+".png"
            if(os.path.isfile(ss)):
                #print (ss)
                f=open(ss+"oTags.txt","r")
                for line in f:
                    res=res+(line)
                f.close()
                f=os.popen("convert -units PixelsPerInch "+ss+" -density 74 "+ss+".png")
                rline=f.readlines()
                f.close()
                f=os.popen("mv "+ss+".png "+ss)
                rline=f.readlines()
                f.close()
               
                f=os.popen("tesseract -l fin "+ss+" stdout")
                rline=f.readlines()[0]
                if rline!="":
                        res=res+rline[0:-1]
                f.close()
                if res=="":
                        #print ("TULI YKKÖSEEN")
                        f=os.popen("tesseract --psm 7 -l fin "+ss+" stdout")
                        rline=f.readlines()[0]
                        if rline!="":
                                res=res+rline[0:-1]
                        #res=res+(f.readlines()[0][0:-1])
                        f.close()
                if res=="":
                        #print ("TULI KAKKOSEEN")
                        f=os.popen("tesseract --psm 7 "+ss+" stdout")
                        rline=f.readlines()[0]
                        if rline!="":
                                res=res+rline[0:-1]
                        #res=res+(f.readlines()[0][0:-1])
                        f.close()
                if res=="":
                        f=open("errors.txt","a")
                        f.write(args[2]+"->"+ss+"\n")
                        f.close()
                        error=True
                else:
                        if args[3]=="rm":
                                   os.remove(ss)
                f=open(ss+"cTags.txt","r")
                for line in f:
                    res=res+(line)
                f.close()
                res=res+" "
                if args[3]=="rm":
                        os.remove(ss+"cTags.txt")
                        os.remove(ss+"oTags.txt")
            else:
                if res!="":
                       print (res);
                break
    if error==False:
            if args[3]=="rm":
                    os.remove(args[1])

kamara

  • Käyttäjä
  • Viestejä: 2944
    • Profiili
Vs: Ylen tekstityksen kuvista srt-tiedosto...
« Vastaus #23 : 28.09.19 - klo:18.07 »
Hei, korjasin yhden bugin purkkakorjauksella.

Ainakin itselläni on nyttemmin näkynyt I-bugi. Eli 'i'-kirjain ei aina (fifty-sixty) tulostu premanipulatessa.

En tiedä, kuinka moni käyttää ohjelmaani, mutta kyseinen bugi on ainakin itselläni hiljattain näkynyt srt-tiedostoissa.

Tein uuden version YLE-premanipulateen. Ei tämä nyt täydellinen korjaus ole, mutta tällä voidaan edetä.


wapsi

  • Käyttäjä
  • Viestejä: 4
    • Profiili
Vs: Ylen tekstityksen kuvista srt-tiedosto...
« Vastaus #24 : 03.12.19 - klo:11.46 »
Kiitokset skripteistä, epäilen olen hyvin lähellä saadakseni homman toimimaan. Edelleen tosin ongelma, että i-kirjaimet puuttuvat todella usein, vaikka käänsin tuon uusimman korjaamasi version (edellisen viestin liite).

Liitin tähän viestiin malliesimerkin, miten i-kirjaimet harvoin toimivat (output.srt). Osaatko kertoa, että mistä tämä johtuu? Lisäksi latasin zipin, mistä löytyy alkuperäiset .png ja .xml yms. tiedostot, joita käytin tuon output.srt:n generoimiseen skripteilläsi (jotka siis olivat pxsup2dast:n generoimat) tänne: http://wapsi.kapsi.fi/output.d.zip
« Viimeksi muokattu: 03.12.19 - klo:11.48 kirjoittanut wapsi »

Jiku

  • Käyttäjä
  • Viestejä: 248
    • Profiili
Vs: Ylen tekstityksen kuvista srt-tiedosto...
« Vastaus #25 : 04.12.19 - klo:12.33 »
En kamara vielä ole sorsiisi ehtinyt perehtyä että miten tuon tunnistuksen teet, mutta itse huomasin että kun noita fontteja eri kanavilla on erilaisia, niin lähes 100% tulokseen pääsee kun muuttaa ne näin:

Eli suurentaa kuvan kolminkertaiseksi ja sitten muuttaa sen niin että teksti on musta. Tällöin tesseract tunnistaa  sen kunnola ilman virheitäl.

Koodia: [Valitse]
#!/bin/bash
tmpdir="/tmp/tekstit"
rm -rf $tmpdir
mkdir -p $tmpdir
ccextractor -dvblang fin -out=spupng -o $tmpdir/subs.xml -noteletext '20191117 1550 - Yle TV1 Häme - Rakennusentisöijät.ts' #puretaan tekstit

cd $tmpdir/subs.d #Täällä on ccextractorin purkamat kuvat
mkdir muunnetut #Tänne tallennetaan convertilla käsitellyt kuvat
for pic in *.png
do
    number=$(echo $pic|tr -dc '0-9')
    echo -ne "$pic\033[0K\r"
    convert $pic -trim -bordercolor black -border 50x5 -resize 300% -negate -alpha remove -background black muunnetut/$pic >/dev/null 2>/dev/null #käsitellyt kuvat alihakemistossa muunnetut
    #tässä kohtaa kannattaa tesseractilla tunnistaa teksti!
done

Itsellä työn alla skripti, joka joko polttaisi tekstit kiinni kuvaan tai sitten tekisi niistä mp4-tiedostoon sisällytetyt tekstit.
Puoliksi suunniteltu on hyvin tehty

kamara

  • Käyttäjä
  • Viestejä: 2944
    • Profiili
Vs: Ylen tekstityksen kuvista srt-tiedosto...
« Vastaus #26 : 04.12.19 - klo:15.07 »
En kamara vielä ole sorsiisi ehtinyt perehtyä että miten tuon tunnistuksen teet, mutta itse huomasin että kun noita fontteja eri kanavilla on erilaisia, niin lähes 100% tulokseen pääsee kun muuttaa ne näin:

Eli suurentaa kuvan kolminkertaiseksi ja sitten muuttaa sen niin että teksti on musta. Tällöin tesseract tunnistaa  sen kunnola ilman virheitäl.

Kiitos ideasta...

Pitäneen testata jossain vaiheessa.

Itseäni on eniten harmittanut (nykyisessä versiossani) se, että Ei:stä tulee Fi (Ylen ohjelmissa).

Joo ja tunnistuksen teen ihan normaalisti ajamalla teeseract:n, mutta ennen tesseract:lle sanan syöttämistä. Splittaan tekstin riveiksi ja sen jälkeen sanoiksi, ja syötän sana kerrallaan tesseract:lle.

Jiku

  • Käyttäjä
  • Viestejä: 248
    • Profiili
Vs: Ylen tekstityksen kuvista srt-tiedosto...
« Vastaus #27 : 04.12.19 - klo:15.29 »
Mulla meni kerran suurin osa ajasta tuohon kun sain tekstin hyvin tunnistettavaan muotoon. Ongelma oli lähinnä DVD-levyissä, joissa teksti on monesti huonolaatuinen.

Eli tollaista kikkailua sille tekstille tuli ennen tunnistamista tehtyä, kun tesseract halusi että siinä tekstin ympärilläkin on vähän tyhjää, mutta taas teksti keskellä riviä ei ollut hyvä sekään..

Onneksi Linuxille on hyvät työkalut tuohon kuvien käpistelyyn skriptistä käsin!
Ja vaikka toi lopputulos (kohta 6) näyttäisi ihmissilmälle ehkä rumalta rosotekstiltä, se tunnistui silti varsin hyvin!
« Viimeksi muokattu: 04.12.19 - klo:17.10 kirjoittanut Jiku »
Puoliksi suunniteltu on hyvin tehty

wapsi

  • Käyttäjä
  • Viestejä: 4
    • Profiili
Vs: Ylen tekstityksen kuvista srt-tiedosto...
« Vastaus #28 : 04.12.19 - klo:17.01 »
Kiitokset @Jiku ja @kamara, tein itseäni varten Bash-skriptin, joka luo .srt teksitystiedoston joko suoraan .ts -tiedostosta tai sitten spu/xml -tiedostosta. Noilla @Jiku:n mainitsemilla convert-parametreilla OCR toimii varsin hyvin.

Laitoin skriptini ja ohjeet Githubiin kaikkien saataville: https://github.com/wapsi/convert-TS-or-SPU-to-SRT

kamara

  • Käyttäjä
  • Viestejä: 2944
    • Profiili
Vs: Ylen tekstityksen kuvista srt-tiedosto...
« Vastaus #29 : 04.12.19 - klo:17.20 »
Ole hyvä vain...

Minusta on hienoa, että joku muukin hyötyy ohjelmaräpellyksestäni. Ohjelmaani vielä sen verran, että pyrin tulkitsemaan sanat s.e. onko se kursivoituna vai normaalina. Se toimii vaihtelevasti, ja sen laskee PNS-luokka.