BookTranslator
BookTranslator

Kako prevesti ASS/SSA titlove bez razbijanja stilova, pozicija ili karaoka

Prevedite samo vidljivi dijalog u .ass datoteci, zatim provjerite tajming, oznake, karaoke i fontove. Uz primjer datoteke, besplatni alat za provjeru i lokalni test LLM-a s 9 pokretanja.

BookTranslator

BookTranslator Team

12 min read

ASS ili SSA datoteka titlova je mali program: zaglavlje, tablica stilova i popis vremenski označenih događaja čije posljednje polje miješa dijalog s kôdom za oblikovanje. Da biste je preveli, promijenite samo čitljive riječi u tom posljednjem polju, ostavite sve ostalo bajt po bajt netaknuto, a zatim provjerite tri stvari koje nijedan alat za prijevod ne rješava umjesto vas: fontove, kodove za razmake i karaoke retke.

Preveli smo primjer s 14 događaja na pojednostavljeni kineski devet puta pomoću lokalnog modela, koristeći tri različita upita, i svaki rezultat provjerili skriptom koju smo napisali. Tajming, pozicije, boje, komentari i crteži preživjeli su u svih devet. Ono što se pokvarilo bili su dijelovi datoteke koji pretpostavljaju engleski: u svih devet, stilovi fontova nisu imali kineske znakove, pa bi se datoteka oslanjala na to da player zamijeni font, a tvrdi razmak iz engleskog retka postao je vidljiv razmak na kineskom. Karaoke redak vratio se s tajmingom usmjerenim na pogrešne riječi u svakom pokretanju, a u četiri pokretanja neki slogovi nisu istaknuli ništa.

Kratki odgovor: što prevesti, a što ostaviti na miru

Dio datotekePrimjer iz našeg uzorkaPrevesti?
Zaglavlje [Script Info]PlayResX: 1920, WrapStyle: 0Ne. Pozicije se izračunavaju iz ovih vrijednosti.
[V4+ Styles]Style: Default,Trebuchet MS,64,...Ne, osim naziva fonta koji ćete možda morati namjerno promijeniti
Polja događaja 1–90,0:00:01.00,0:00:03.20,Default,Jun,0,0,0,Ne. To su sloj, tajming, stil, govornik, margine i efekt.
Blokovi za nadjačavanje{\i1}, {\an8\pos(960,120)}, {\k25}Ne
Crteži{\p1}m 0 0 l 200 0 200 60 0 60{\p0}Ne. Ovo je vektorski oblik, a ne tekst.
Događaji Comment:Comment: ...,Earlier draft: Try the stacks.Neobavezno. Komentari se nikada ne prikazuju na zaslonu.
Bilješke u vitičastim zagradama{TL note: "stacks" means the closed shelves}Neobavezno. Playeri ih ignoriraju.
Vidljivi dijalogDid you find the second volume?Da
Kodovi redaka\N, \n, \hZadržite \N. Odlučite od slučaja do slučaja za \n i \h.

Ostatak ovog vodiča objašnjava zašto je svaki redak važan i kako provjeriti rezultat.

Kako se gradi ASS redak

Svaki redak u odjeljku [Events] slijedi format deklariran neposredno iznad njega:

Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:03.40,0:00:06.10,Default,Mara,0,0,0,,{\i1}I thought it was{\i0} sold out.

Samo deseto polje, Text, sadrži ono što gledatelj čita. Vodič kroz ASS format datoteke projekta libass napominje da ovo posljednje polje "smije sadržavati zareze", zbog čega nemarno dijeljenje na svakom zarezu kvari redak poput Well, if it's there, then, we go now. Siguran alat dijeli samo na prvih devet zareza.

Unutar Text, sve u vitičastim zagradama je blok za nadjačavanje. Referenca za oznake nadjačavanja programa Aegisub definira kodove koje ćete najčešće susretati:

  • \N prisilno prelama redak u svim načinima prelamanja. \n prelama redak samo u načinu prelamanja 2, a inače je razmak. \h je nerazdvojni razmak.
  • \an8 postavlja poravnanje prema rasporedu numeričke tipkovnice, pa je 8 gore sredina. \pos(960,120) postavlja redak na koordinate skripte.
  • \k25 je karaoke slog; trajanja su u centisekundama, pa 25 znači četvrtinu sekunde.
  • Nakon \p1, tekst će se "tada interpretirati kao upute za crtanje", pa prevoditelj koji "prevede" m 0 0 l 200 0 uništava oblik.
  • Neprepoznati tekst unutar vitičastih zagrada "se tiho ignorira", zbog čega fansub datoteke često nose prevoditeljske bilješke u vitičastim zagradama.

Reci koji počinju s Comment: koriste ista polja, ali prema libass vodiču "ništa se neće prikazati na zaslonu."

Što smo testirali

Napisali smo sample-source.ass, scenu od 14 događaja smještenu u knjižaru, s jednim primjerom svake gore navedene značajke: kurziv, tvrdi prijelom, zarezi u dijalogu, bilješka u vitičastim zagradama, komentar, pozicionirani natpis, vektorski okvir, zatamnjenje, tvrdi razmak, promjena boje s \r, meki prijelom, efekt klizećeg Banner i karaoke redak sa šest slogova.

Zatim smo zamolili lokalni model da ga prevede na pojednostavljeni kineski na tri načina:

  1. Cijela datoteka. Zalijepite cijelu .ass datoteku i zatražite prevedenu datoteku natrag.
  2. Samo tekst. Pošaljite samo polje Text svakog retka dijaloga kao JSON, s oznakama unutra, i uputu da zadrži svaki blok {...} i svaki \N, \n i \h.
  3. Zaštićeno. Isto, ali prvo zamijenite svaki blok u vitičastim zagradama i svaki kod retka numeriranim rezerviranim mjestom, a originale vratite nakon toga.

U drugom i trećem uvjetu skripta nikada ne šalje vektorski crtež ni komentar modelu, pa su ti reci mogli biti oštećeni samo u uvjetu s cijelom datotekom.

Model je bio Qwen 3.6 27B (Q4_K_M) u LM Studiju 0.4.8 na Apple M4 Max sa 64 GB memorije, s isključenim razmišljanjem i temperaturom 0,3. Svaki uvjet pokrenuli smo tri puta, ukupno devet pokretanja. Prvi pokušaj trećeg pokretanja završio je kada je lokalni poslužitelj prekinuo vezu, pa smo ga ponovno pokrenuli i treći krug odradili još jednom. Skripta je run_llm_ass_test.py, a svih devet izlaza objavljeno je neuređeno uz nju; README navodi svaku datoteku. Ako nikada niste postavili lokalni model, naš vodič za lokalno LLM prevođenje pokriva postavke.

Ovo je bio mali test jednog modela, jednog jezičnog para i jednog uzorka. Pokazuje koji se problemi događaju i kako ih uhvatiti. Ne rangira alate ni upute.

Rezultat: Mehanizam je preživio; engleske pretpostavke nisu

Svaki izlaz provjerili smo pomoću check_ass_translation.py. Cijeli izlaz nalazi se u check-results.txt, a results.csv ima jedan redak po pokretanju, uključujući probleme koje skripta ne može vidjeti.

ProvjeraCijela datotekaSamo tekstZaštićeno
Vremenski kodovi, stilovi i polja 1–9 nepromijenjeni3 od 33 od 33 od 3
Oznake za nadjačavanje nepromijenjene3 od 32 od 33 od 3
Crteži i komentari netaknuti3 od 33 od 33 od 3
Stilovi fontova mogu prikazati prijevod0 od 30 od 30 od 3
\h i \n ostavljeni kao praznine u kineskom tekstu3 od 33 od 33 od 3
Sve karaoke oznake zadržane, svaka s tekstom3 od 30 od 31 od 3

Dva su nas rezultata iznenadila. Lijepljenje cijele datoteke zadržalo je strukturu netaknutom u sva tri pokretanja, iako je u dva od njih preveden i redak Title u zaglavlju. A prompt samo za tekst, koji zvuči sigurnije, proizveo je jedine pokvarene oznake. U jednom je pokretanju vratio {\k25}翻{\k30}页,{\k45}开{\k60}灯 za redak sa šest karaoke oznaka. Posljednje dvije oznake i 1,20 sekundi vremena isticanja su nestale, pa bi isticanje završilo znatno prije retka. Isto je pokretanje pretvorilo Room\h12 is upstairs. u 12\h12号房间在楼上。, s brojem sobe dvaput.

Dakle, korisna lekcija nije "koristi prompt X." Nego to da je strukturnu štetu koje se bojite lako otkriti, a šteta koja je zapravo prošla u svih devet pokretanja nalazi se na tri mjesta o kojima stranice alata za ASS prijevod ne govore.

1. Fontovi ne mogu nacrtati novi jezik

Stilovi u primjeru koriste Trebuchet MS za dijalog i Georgia za natpise, što je uobičajeno za englesko izdanje. Nijedan font ne sadrži kineske znakove. Kada smo usmjerili test glifova provjerivača na dvije datoteke fontova, svih 12 prevedenih tekstualnih događaja u svakom pokretanju nije prošlo:

ERROR   event 1: font 'Trebuchet MS' has no glyph for 9 characters, e.g. 了二你到卷吗找第?
ERROR   event 7: font 'Georgia' has no glyph for 10 characters, e.g. 书人仅作员工库架闭限

Player može zamijeniti nekim drugim instaliranim fontom, pa se titl možda ipak prikaže, ali izdanje više ne kontrolira kako izgleda, a gledatelj čiji sustav nema odgovarajući font može vidjeti prazne kvadratiće. Rješenje je namjerna izmjena polja Fontname svakog stila. Kada smo sva tri stila u jednom izlazu promijenili u Hiragino Sans GB, kineski font koji dolazi s macOS-om, i pokrenuli test glifova na tom fontu, pogreške glifova pale su na nulu.

Odaberite font koji će vaši gledatelji doista imati ili ga priložite uz video. Vodič za libass kaže da izdanja trebaju priložiti svaki font koji koriste, po mogućnosti u MKV kontejner. Budući da je font ciljnog jezika nov, njegovo prilaganje sada je dio posla prijevoda.

2. Kodovi za razmake nose engleske navike

Room\h12 lijepi "Room" uz "12" tako da se nikada ne razdvoje na prijelomu retka. U kineskom riječi nisu odvojene razmacima, ali svako je pokretanje zadržalo \h negdje: pet pokretanja smjestilo ga je između 12号房间 i 在楼上, tri prije broja, a jedno između dvije kopije broja. U svakom slučaju gledatelj vidi suvišan razmak. Wait\nhere. imao je isti problem. Uz WrapStyle: 0, \n se prikazuje kao razmak, pa 在\n这里等 pokazuje prazninu nasred rečenice od tri riječi.

Struktura je ovdje u redu; jezik nije. Za ciljni jezik bez razmaka među riječima uklonite \h i \n iz prevedenog teksta. Zadržite \N samo tamo gdje želite prisilni prijelom i smjestite ga na prirodno mjesto u ciljnoj rečenici. Provjerivač iz tog razloga prijavljuje promijenjene brojeve \h i \n kao upozorenja, a ne kao pogreške, i upozorava kada neki preostane unutar kineskog, japanskog ili korejskog teksta.

3. Vremenski raspored karaoka pripada izvornim riječima

Karaoke redak {\k25}Turn {\k30}the {\k45}page, {\k60}turn {\k40}the {\k80}light vremenski usklađuje svaki engleski slog s pjesmom. Prijevod ne može smisleno zadržati taj raspored jer kineske riječi ne padaju na iste udarce. Naša pokretanja pokazuju različite načine na koje to pođe po zlu:

  • U četiri pokretanja zadržano je svih šest oznaka, svaka na drugoj riječi nego prije. Jedno je završilo s {\k40}打{\k80}开, "otvoriti", i posve izbacilo "light" iz retka.
  • U četiri pokretanja neki slog nije istaknuo ništa, poput 打开{\k40}{\k80}灯 (0,40 sekundi isticanja na praznom slogu). U dva od njih slog od 0,45 sekundi istaknuo je samo zarez.
  • U jednom pokretanju dvije su oznake nestale, kako je gore opisano.

Provjerivač označava karaoke redak preveden na mjestu i svaki slog koji ostane bez teksta. Bolje je rješenje uredničko: ne prevodite karaoke na mjestu. Zadržite izvorni vremenski usklađeni redak za pjevanje i dodajte prijevod kao zaseban događaj: kopirajte karaoke događaj, dodijelite mu vlastiti stil (na primjer, manji i smješten pri dnu), uklonite oznake \k i prevedite tekst. Ponovno ga vremenski uskladite slog po slog samo ako ste spremni sami ga uskladiti sa zvukom.

Radni postupak koji izdržava provjeru

  1. Najprije učinite izvor čitljivim. Ako datoteka prikazuje iskrivljene znakove, popravite kodiranje prije svega ostalog. Naš vodič za kodiranje koristi SRT primjere, ali isti koraci na razini bajtova rade i za .ass datoteku i čuvaju izvorne bajtove sigurnima. Provjerivač čita samo UTF-8 i UTF-16.

  2. Odredite opseg. Popišite stilove i odlučite koji su dijalog, koji su natpisi na zaslonu, a koji karaoke. Natpisi obično trebaju prijevod; karaoke obično trebaju zaseban redak; komentari i bilješke u vitičastim zagradama vaša su odluka.

  3. Prevedite samo polje Text. Koristite alat koji raščlanjuje ASS umjesto da ga tretira kao običan tekst ili sami zaštitite oznake kao u našem trećem uvjetu. Držite izvornu datoteku uz izlaz.

  4. Pokrenite strukturnu provjeru.

    python3 check_ass_translation.py source.ass translated.ass
    

    Uspoređuje broj događaja, vrste događaja, polja 1–9, vrijednosti stilova, blokove zamjene, crteže, retke komentara, \N, karaoke slogove i trajanja te retke koji su se vratili prazni ili nepromijenjeni. Ne procjenjuje kvalitetu prijevoda.

  5. Namjerno popravite fontove. Promijenite Fontname u svakom stilu koji sada sadrži tekst na ciljnom jeziku, zatim pokrenite test glifova na datoteci fonta koju ćete isporučiti:

    pip install fonttools
    python3 check_ass_translation.py source.ass translated.ass --font "Noto Sans SC=/path/to/NotoSansSC-Regular.otf"
    

    Promijenjeno ime fonta pojavljuje se kao upozorenje, pa možete potvrditi da je svaka promjena bila namjerna.

  6. Očistite kodove za razmake i karaoke kako je gore opisano.

  7. Pogledajte to uz video. Otvorite datoteku u Aegisubu ili svom playeru. Provjerite da natpisi još uvijek pristaju oblicima nacrtanima iza njih, jer \p okvir zadržava englesku veličinu dok prevedeni natpis može biti mnogo dulji ili kraći. Provjerite nisu li reci predugi za svoje vrijeme na ekranu. Nijedan od tih problema nije vidljiv u samoj datoteci.

Gdje se uklapa BookTranslator

BookTranslatorov prevoditelj titlova prihvaća SRT, VTT, ASS i SSA datoteke. Prema stranici proizvoda, zadržava vremenske oznake i redoslijed titlova te zadržava podržano ASS i SSA oblikovanje pridruženo svakom unosu titla, tako da ne morate sami izvlačiti i ponovno umetati tekst. Dijalog prevodi s okolnim recima kao kontekstom, što pomaže s imenima i ponavljajućim šalama kroz cijelu epizodu.

Ovaj uzorak nismo propustili kroz BookTranslator za ovaj članak. Koji god alat koristili, pokrenite korake od 4 do 7 na rezultatu. Stil koji zadržava engleski font još je uvijek stil koji ne može iscrtati kineske znakove, a karaoke prevedene na mjestu još uvijek zahtijevaju uredničku odluku. Za ostatak tijeka rada s titlovima pogledajte naš vodič za AI prevođenje titlova, našu usporedbu softvera za prevođenje titlova i, ako vaš prijevod ide na YouTube, tijek rada za YouTube titlove.

Kada umjesto toga pretvoriti u SRT

Pretvorba ASS-a u SRT prije prevođenja uklanja stilove, položaje, crteže i karaoke, što uklanja i većinu gore navedenih problema. To je razumna zamjena ako vaše odredište prikazuje samo obične titlove ili ako oblikovanje nikada nije bilo važno za izdanje. To je pogrešna zamjena za anime i glazbena izdanja gdje su natpisi i karaoke dio djela. Odlučite na temelju toga gdje će se datoteka prikazivati, a ne koji je format lakše prevesti.

Preuzmite testne datoteke

Sve iz ovog testa slobodno je za ponovnu upotrebu:

Povezane objave