BookTranslator
BookTranslator

Hogyan fordítsunk ASS/SSA feliratokat a stílusok, pozíciók és karaoke tönkretétele nélkül

Csak a látható párbeszédet fordítsd le egy .ass fájlban, majd ellenőrizd az időzítést, a címkéket, a karaokét és a betűtípusokat. Egy mintafájllal, egy ingyenes ellenőrzővel és egy 9 futtatásos helyi LLM-teszttel.

BookTranslator

BookTranslator Team

12 min read

Az ASS vagy SSA feliratfájl egy kis program: fejléc, stílustáblázat és időzített események listája, amelyek utolsó mezője a párbeszédet formázó kóddal keveri. A fordításhoz csak az utolsó mező olvasható szavait változtasd meg, minden mást hagyj bájtra pontosan érintetlenül, majd ellenőrizz három dolgot, amit egyetlen fordítási eszköz sem javít meg helyetted: a betűtípusokat, a térközkódokat és a karaoke sorokat.

Egy 14 eseményből álló mintát fordítottunk le egyszerűsített kínaira kilenc alkalommal egy helyi modellel, három különböző utasítással, és minden eredményt egy általunk írt szkripttel ellenőriztünk. Az időzítés, a pozíciók, a színek, a megjegyzések és a rajzok mind a kilencben megmaradtak. Azok a részek sérültek meg, amelyek angol nyelvet feltételeznek: mind a kilencben a stílusok betűtípusai nem tartalmaztak kínai karaktereket, így a fájl a lejátszóra hagyatkozott volna a betűtípus helyettesítésében, és az angol sorban lévő kemény szóköz látható réssé vált a kínaiban. A karaoke sor minden futtatásban rossz szavakra mutató időzítéssel tért vissza, négy futtatásban pedig egyes szótagok semmit sem emeltek ki.

Gyors válasz: mit fordítsunk és mit hagyjunk érintetlenül

A fájl részePélda a mintánkbólLefordítsuk?
[Script Info] fejlécPlayResX: 1920, WrapStyle: 0Nem. A pozíciók ezekből az értékekből számítódnak.
[V4+ Styles]Style: Default,Trebuchet MS,64,...Nem, kivéve a betűtípus nevét, amelyet szándékosan módosítanod kellhet
Eseménymezők 1–90,0:00:01.00,0:00:03.20,Default,Jun,0,0,0,Nem. Ezek a réteg, az időzítés, a stílus, a beszélő, a margók és az effekt.
Felülíró blokkok{\i1}, {\an8\pos(960,120)}, {\k25}Nem
Rajzok{\p1}m 0 0 l 200 0 200 60 0 60{\p0}Nem. Ez egy vektoros alakzat, nem szöveg.
Comment: eseményekComment: ...,Earlier draft: Try the stacks.Opcionális. A megjegyzések soha nem jelennek meg a képernyőn.
Kapcsos zárójeles jegyzetek{TL note: "stacks" means the closed shelves}Opcionális. A lejátszók figyelmen kívül hagyják őket.
Látható párbeszédDid you find the second volume?Igen
Sorkódok\N, \n, \hTartsd meg a \N-t. A \n és a \h esetében esetenként dönts.

Az útmutató további része elmagyarázza, miért fontos minden sor, és hogyan ellenőrizheted az eredményt.

Hogyan épül fel egy ASS-sor

Az [Events] szakasz minden sora a felette megadott formátumot követi:

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.

Csak a tizedik mező, a Text tartalmaz bármit, amit a néző olvas. A libass projekt ASS fájlformátum-útmutatója megjegyzi, hogy ez az utolsó mező „vesszőket tartalmazhat”, ezért a minden vesszőnél való gondatlan felosztás tönkretesz egy olyan sort, mint a Well, if it's there, then, we go now. Egy biztonságos eszköz csak az első kilenc vesszőnél oszt fel.

A Text belsejében a kapcsos zárójelek közötti bármi felülíró blokk. Az Aegisub felülíró tag referenciája meghatározza a leggyakrabban előforduló kódokat:

  • A \N minden tördelési módban kényszerített sortörést okoz. A \n csak a 2-es tördelési módban tör sort, egyébként szóköz. A \h nem törhető szóköz.
  • A \an8 a numerikus billentyűzet elrendezésével állítja be az igazítást, így a 8 a felső közép. A \pos(960,120) a szkript koordinátáira helyezi a sort.
  • A \k25 egy karaoke szótag; az időtartamok centiszekundumban vannak, így a 25 negyed másodpercet jelent.
  • A \p1 után a szöveg „rajzolási utasításként lesz értelmezve”, így az a fordító, aki „lefordítja” az m 0 0 l 200 0 kódot, tönkretesz egy alakzatot.
  • A kapcsos zárójelek közötti fel nem ismert szöveget „csendben figyelmen kívül hagyják”, ezért a fansub fájlok gyakran tartalmaznak fordítói megjegyzéseket kapcsos zárójelek között.

A Comment:-tel kezdődő sorok ugyanazokat a mezőket használják, de a libass útmutató szerint „semmi sem jelenik meg a képernyőn”.

Mit teszteltünk

Írtunk egy sample-source.ass fájlt, egy 14 eseményből álló jelenetet egy könyvesboltban, a fenti jellemzők mindegyikének egy-egy példájával: dőlt betű, kemény sortörés, vesszők a párbeszédben, kapcsos megjegyzés, megjegyzéssor, pozicionált tábla, vektoros doboz, áttűnés, kemény szóköz, színváltás \r-rel, lágy sortörés, görgető Banner effekt és egy hat szótagos karaoke sor.

Ezután megkértünk egy helyi modellt, hogy fordítsa le egyszerűsített kínaira háromféleképpen:

  1. Teljes fájl. Illeszd be a teljes .ass fájlt, és kérd vissza a lefordított fájlt.
  2. Csak szöveg. Csak minden párbeszédsor Text mezőjét küldd el JSON-ként, a tagekkel együtt, és azzal az utasítással, hogy tartsd meg minden {...} blokkot és minden \N, \n és \h kódot.
  3. Védett. Ugyanaz, de először cserélj ki minden kapcsos blokkot és sorkódot egy számozott helyőrzőre, majd utána tedd vissza az eredetieket.

A második és harmadik feltételben a szkript soha nem küldi el a vektoros rajzot vagy a megjegyzéssort a modellnek, így azokat a sorokat csak a teljes fájl feltételben lehetett károsítani.

A modell Qwen 3.6 27B (Q4_K_M) volt LM Studio 0.4.8-ban egy Apple M4 Max-on 64 GB memóriával, gondolkodás kikapcsolva és 0,3 hőmérséklettel. Minden feltételt háromszor futtattunk, összesen kilenc futást. A harmadik futás első kísérlete akkor ért véget, amikor a helyi szerver megszakította a kapcsolatot, ezért újraindítottuk, és újra lefuttattuk a harmadik kört. A szkript a run_llm_ass_test.py, és mind a kilenc kimenet szerkesztetlenül megjelent mellette; a README felsorolja az összes fájlt. Ha még soha nem állítottál be helyi modellt, a helyi LLM fordítási útmutatónk ismerteti a beállításokat.

Ez egy kis teszt volt egy modellel, egy nyelvpárral és egy mintával. Megmutatja, milyen problémák fordulnak elő, és hogyan lehet elkapni őket. Nem rangsorol eszközöket vagy promptokat.

Eredmény: A gépezet túlélte; az angol feltevések nem

Minden kimenetet a check_ass_translation.py segítségével ellenőriztünk. A teljes kimenet a check-results.txt fájlban van, a results.csv pedig futásonként egy sort tartalmaz, beleértve azokat a problémákat is, amelyeket a szkript nem lát.

EllenőrzésTeljes fájlCsak szövegVédett
Időzítés, stílusok és 1–9. mezők változatlanok3 / 33 / 33 / 3
Felülíró tagek változatlanok3 / 32 / 33 / 3
Rajz- és megjegyzéssorok érintetlenek3 / 33 / 33 / 3
A stílusbetűtípusok képesek megjeleníteni a fordítást0 / 30 / 30 / 3
\h és \n hézagként maradnak a kínai szövegben3 / 33 / 33 / 3
Minden karaoke-tag megmarad, mindegyik szöveggel3 / 30 / 31 / 3

Két eredmény meglepett minket. A teljes fájl beillesztése mindhárom futásban érintetlenül hagyta a szerkezetet, bár kettőben a fejléc Title sorát is lefordította. A csak szöveges utasítás pedig, amely biztonságosabbnak hangzik, az egyetlen hibás tag-eket produkálta. Az egyik futásban {\k25}翻{\k30}页,{\k45}开{\k60}灯 jött vissza egy hat karaoke tag-et tartalmazó sorra. Az utolsó két tag és 1,20 másodpercnyi kiemelési idő eltűnt, így a kiemelés jóval a sor vége előtt befejeződött volna. Ugyanez a futás a Room\h12 is upstairs. sort 12\h12号房间在楼上。-re változtatta, a szobaszámmal kétszer.

A hasznos tanulság tehát nem az, hogy „használd az X utasítást”. Hanem az, hogy a félt szerkezeti károsodás könnyen észlelhető, és a kár, amely mind a kilenc futásban valóban átment, három olyan helyen van, amelyeket az ASS-fordítás eszközoldalai nem tárgyalnak.

1. A betűtípusok nem tudják megrajzolni az új nyelvet

A minta stílusai Trebuchet MS-t használnak a párbeszédhez és Georgia-t a feliratokhoz, ami egy angol kiadásnál megszokott. Egyik betűtípus sem tartalmaz kínai karaktereket. Amikor a checker glyph-tesztjét a két betűtípusfájlra irányítottuk, mind a 12 lefordított szövegesemény minden futásban megbukott:

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. 书人仅作员工库架闭限

A lejátszó helyettesíthet más telepített betűtípust, így a felirat még megjelenhet, de a kiadás már nem szabályozza, hogyan néz ki, és egy olyan néző, akinek a rendszerén nincs megfelelő betűtípus, üres négyzeteket láthat. A megoldás az egyes stílusok Fontname mezőjének szándékos szerkesztése. Amikor egy kimenetben mindhárom stílust Hiragino Sans GB-re, egy macOS-szel szállított kínai betűtípusra változtattuk, és a glyph-tesztet arra a betűtípusra futtattuk, a glyph-hibák száma nullára csökkent.

Válassz olyan betűtípust, amely a nézőidnél valóban megvan, vagy szállítsd a videóval együtt. A libass útmutató szerint a kiadásoknak minden használt betűtípust csatolniuk kell, lehetőleg az MKV konténerhez. Mivel a célnyelvi betűtípus új, a csatolása mostantól a fordítási feladat része.

2. A térközkódok angol szokásokat hordoznak

A Room\h12 összeragasztja a „Room”-ot a „12”-vel, hogy soha ne törjenek el a sorok között. Kínaiul a szavakat nem választják el szóközök, de minden futás megtartotta a \h-t valahol: öt futás a 12号房间 és az 在楼上 közé tette, három a szám elé, egy pedig a szám két példánya közé. Akárhogy is, a néző egy oda nem illő szóközt lát. A Wait\nhere. esetében ugyanez a probléma. WrapStyle: 0 esetén a \n szóközként jelenik meg, így a 在\n这里等 egy hézagot mutat egy három szóból álló mondat közepén.

A szerkezet itt rendben van; a nyelv nem. Egy olyan célnyelv esetében, amelyben nincsenek szóközök a szavak között, távolítsd el a \h és \n kódokat a lefordított szövegből. A \N-t csak ott tartsd meg, ahol kényszerített sortörést szeretnél, és a célmondat természetes pontjára helyezd. A checker ezért jelenti a megváltozott \h és \n darabszámokat figyelmeztetésként, nem hibaként, és figyelmeztet, ha egy ilyen kód kínai, japán vagy koreai szövegen belül marad.

3. A karaoke időzítése az eredeti szavakhoz tartozik

A {\k25}Turn {\k30}the {\k45}page, {\k60}turn {\k40}the {\k80}light karaoke sor minden angol szótagot a dalhoz időzít. Egy fordítás nem tudja ezt az időzítést értelmesen megtartani, mert a kínai szavak nem ugyanazokra az ütemekre esnek. Futásaink megmutatják, milyen különböző módokon romlik el:

  • Négy futásban mind a hat tag megmaradt, mindegyik más szón, mint korábban. Az egyik {\k40}打{\k80}开-val, azaz „kinyit”-tal végződött, és teljesen kihagyta a „light”-ot a sorból.
  • Négy futásban egy szótag semmit sem emelt ki, például 打开{\k40}{\k80}灯 (0,40 másodpercnyi kiemelés egy üres szótagon). Ezek közül kettőben egy 0,45 másodperces szótag csak egy vesszőt emelt ki.
  • Egy futásban két tag eltűnt, ahogy fentebb leírtuk.

A checker jelzi a helyben lefordított karaoke sort és minden olyan szótagot, amely szöveg nélkül maradt. A jobb megoldás szerkesztői jellegű: ne fordítsd le a karaoke-t helyben. Tartsd meg az eredeti időzített sort az együtt énekléshez, és add hozzá a fordítást külön eseményként: másold le a karaoke eseményt, adj neki saját stílust (például kisebbet, alulra helyezve), távolítsd el a \k tag-eket, és fordítsd le a szöveget. Csak akkor időzítsd újra szótagról szótagra, ha hajlandó vagy magad a hanganyaghoz időzíteni.

Egy munkafolyamat, amely kiállja a próbát

  1. Először tedd olvashatóvá a forrást. Ha a fájl zavaros karaktereket mutat, minden más előtt javítsd a kódolást. Kódolási útmutatónk SRT-példákat használ, de ugyanazok a bájtszintű lépések működnek egy .ass fájlnál is, és biztonságban tartják az eredeti bájtokat. A checker csak UTF-8-at és UTF-16-ot olvas.

  2. Határozd meg a hatókört. Listázd a stílusokat, és döntsd el, melyek párbeszédek, melyek képernyőn megjelenő feliratok, és melyek karaoke-ok. A feliratok általában fordítást igényelnek; a karaoke általában külön sort igényel; a megjegyzések és kapcsos jegyzetek eldöntése a te feladatod.

  3. Csak a Text mezőt fordítsd. Használj olyan eszközt, amely ASS-t elemez, ahelyett hogy egyszerű szövegként kezelné, vagy védd meg a tag-eket magad, ahogy a harmadik feltételünkben. Tartsd a forrásfájlt a kimenet mellett.

  4. Futtasd a szerkezeti ellenőrzést.

    python3 check_ass_translation.py source.ass translated.ass
    

    Összehasonlítja az események számát, az eseménytípusokat, az 1–9. mezőket, a stílusértékeket, a felülíró blokkokat, a rajzokat, a megjegyzéssorokat, a \N-t, a karaoke szótagokat és időtartamokat, valamint az üresen vagy változatlanul visszatérő sorokat. Nem ítéli meg a fordítás minőségét.

  5. Javítsd a betűtípusokat szándékosan. Módosítsd a Fontname értékét minden olyan stílusban, amely most már célnyelvi szöveget tartalmaz, majd futtasd a glifatesztet a szállítani kívánt betűtípusfájllal:

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

    A megváltozott betűtípusnév figyelmeztetésként jelenik meg, így megerősítheted, hogy minden változtatás szándékos volt.

  6. Tisztítsd meg a térközkódokat és a karaoke-t a fent leírtak szerint.

  7. Nézd meg a videóval együtt. Nyisd meg a fájlt Aegisubban vagy a lejátszóban. Ellenőrizd, hogy a feliratok továbbra is illeszkednek-e a mögöttük rajzolt formákhoz, mert a \p doboz megtartja az angol méretét, míg a lefordított felirat sokkal hosszabb vagy rövidebb lehet. Ellenőrizd, hogy a sorok nem túl hosszúak-e a képernyőn töltött idejükhöz képest. Egyik probléma sem látható magában a fájlban.

Hol illeszkedik a BookTranslator

A BookTranslator feliratfordítója elfogad SRT, VTT, ASS és SSA fájlokat. A termékoldal szerint megtartja az időbélyegeket és a feliratok sorrendjét, valamint a támogatott ASS- és SSA-stílusokat az egyes feliratbejegyzésekhez rendelve, így nem kell magadnak kinyerned és visszaillesztened a szöveget. A párbeszédeket a környező sorokkal együtt fordítja, ami segít a nevek és a visszatérő poénok esetében egy egész epizódon keresztül.

Ezt a mintát nem futtattuk át a BookTranslatoron ehhez a cikkhez. Bármilyen eszközt is használsz, hajtsd végre a 4–7. lépést az eredményen. Az a stílus, amely megtartja az angol betűtípust, továbbra is olyan stílus, amely nem tud kínai karaktereket megjeleníteni, és a helyben lefordított karaoke továbbra is szerkesztői döntést igényel. A felirat-munkafolyamat többi részéhez lásd az AI-feliratfordítási útmutatónkat, a feliratfordító szoftverek összehasonlítását, és ha a fordításod YouTube-ra kerül, a YouTube-felirat munkafolyamatot.

Mikor érdemes inkább SRT-re konvertálni

Az ASS SRT-re konvertálása fordítás előtt eltávolítja a stílusokat, pozíciókat, rajzokat és karaoke-t, ami egyben a fenti problémák nagy részét is megszünteti. Ez ésszerű kompromisszum, ha a célhely csak sima feliratokat jelenít meg, vagy ha a stílus soha nem volt fontos a kiadvány szempontjából. Rossz kompromisszum azonban anime- és zenei kiadványok esetében, ahol a feliratok és a karaoke a mű részét képezik. Aszerint dönts, hogy hol fogják megjeleníteni a fájlt, nem pedig aszerint, hogy melyik formátumot könnyebb fordítani.

Töltsd le a tesztfájlokat

A teszt minden anyaga szabadon felhasználható:

Kapcsolódó bejegyzések

Hogyan fordítsunk ASS/SSA feliratokat a stílusok, pozíciók és karaoke tönkretétele nélkül