← Valitut työt
Manga- ja webtoon-kääntäjä · oma projekti

Fuki

Sivu on japaniksi tai englanniksi. Sovellus löytää puhekuplat, lukee tekstin ja piirtää käännöksen kuplien päälle. Malli pyörii omalla koneella, joten sivu ei lähde kenenkään palvelimelle.

Kehitteillä · työpöytäsovellus ja Chrome-laajennus
[ 01 ]

Neljä vaihetta

01

Kuplien tunnistus

Sivulta etsitään puhekuplat konenäöllä. Pitkä webtoon-nauha ei mahdu tunnistimelle kerralla, joten se leikataan limittäisiin siivuihin ja laatikot siirretään takaisin oikeille paikoilleen. Sauman kohdalla kahtia mennyt kupla yhdistetään.

02

Lukeminen

Jokainen kupla luetaan erikseen sille sopivalla tunnistimella: japanille manga-ocr näytönohjaimella, englannille EasyOCR. Lukujärjestys on joko ylhäältä alas (webtoon) tai kaistoittain oikealta vasemmalle (manga).

03

Kääntäminen

Sivun kaikki repliikit menevät malliin yhtenä pyyntönä, jotta konteksti kulkee kuplasta toiseen. Asetuksiin kirjoitettu kuvaus sarjasta (nimet, sukupuolet, puhetyyli) menee mukaan ja pitää käännöksen johdonmukaisena.

04

Ylipiirto

Käännös piirretään kuplien päälle läpiklikattavana kerroksena, joten sivua voi selata normaalisti. Sama kuva toisen kerran ja tulos tulee välimuistista. Alkuperäiseen tiedostoon ei kosketa.

[ 02 ]

Kaksi asiakasohjelmaa, yksi moottori

                     ┌─ desktop app    screen capture, PyQt
   pipeline  ─────────┼─ local server   ← Chrome extension
 detect → read        └─ cloud worker   ← control plane
        → translate

Käännösketju on kirjoitettu kerran ja kaikki kolme sisääntuloa kutsuvat samaa funktiota. Työpöytäsovellus kaappaa valitun alueen ruudulta, laajennus antaa sivun oman kuvan täydessä tarkkuudessa, ja pilvityöntekijä ottaa työt jonosta.

Ohjaustasossa (tunnistautuminen, kiintiöt, jono) ei ole mallia lainkaan, joten se pyörii halvalla suorittimella. Raskas työ tehdään näytönohjaimella, ja koska työntekijä hakee työt itse, kotiverkkoon ei tarvitse avata porttia eikä tunnelia.

[ 03 ]

Miksi näin

Laajennus ei ota ruutukaappausta, vaan käsittelee sivun oman <img>-kuvan täydessä tarkkuudessa. Tunnistin lukee sen selvästi paremmin, näytön tarkkuus ja vieritys eivät haittaa, ja kuvan osoite on luonnollinen välimuistiavain.

Sivuoikeuksia ei pyydetä asennuksessa vaan vasta kun käyttäjä haluaa ajaa laajennuksen jollakin sivulla. Laajennus ei siis näe sivuja, joilla sitä ei ole pyydetty.

Käännösmalli valittiin mittaamalla, ei vaikutelmasta: 30 oikeaa sivua, 576 repliikkiä, 40 pisteytettynä sokkona. Voittaja oli samalla nopeampi ja lisenssiltään käyttökelpoinen, kun siihenastinen oletusmalli ei ollut. Sama mittaustapa ratkaisi myös kuplatunnistimen.

Käännöksen vieressä on korjausnappi. Käyttäjän korjaukset kirjoitetaan tiedostoon, ja se tiedosto on aineisto, jolla oma malli myöhemmin opetetaan.

[ 04 ]

Mitattu, ei arvattu

malli / model       pisteet / score      aika / time

gemma3:4b                      3.42           103 s
aya-expanse:8b                 3.23           130 s
qwen3:8b                       3.12          2243 s
qwen2.5:7b                     2.62           117 s
mistral:7b                     1.65           145 s

30 sivua · 576 repliikkiä · 40 sokkopisteytystä
30 pages · 576 lines · 40 scored blind

Pisteytys tehtiin mallien nimet piilotettuina, ja päätössääntö kirjattiin ennen ajoa.

[ 05 ]

Kenelle

Lukijalle, joka seuraa sarjaa jota ei ole käännetty hänen kielelleen. Kohdekieli valitaan asetuksista: turkki, suomi tai englanti.

Sama moottori kääntää myös suoran Twitch-chatin: rajaat chat-sarakkeen ruudulta ja viestit ilmestyvät käännettyinä, ilman tiliä tai yhteyttä palveluun. Yksittäisen viestin voi myös napauttaa käännettäväksi.

Kuva ja teksti pysyvät koneella, alkuperäistä teosta ei muuteta eikä jaeta eteenpäin: käännös on kerros lukijan omalla ruudulla.

Teknologiat
PythonPyQtYOLOv8manga-ocr EasyOCROllamaFastAPIChrome MV3

Sama putki omaan sisältöön

Kuvasta teksti, tekstistä käännös, käännös takaisin kuvan päälle, kaikki omalla raudalla ilman että aineisto käy ulkopuolisella palvelimella. Jos tarvitset saman ketjun johonkin muuhun sisältöön, kerro mitä olet rakentamassa.