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.

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észe | Példa a mintánkból | Lefordítsuk? |
|---|---|---|
[Script Info] fejléc | PlayResX: 1920, WrapStyle: 0 | Nem. 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–9 | 0,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ények | Comment: ...,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éd | Did you find the second volume? | Igen |
| Sorkódok | \N, \n, \h | Tartsd 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
\Nminden tördelési módban kényszerített sortörést okoz. A\ncsak a 2-es tördelési módban tör sort, egyébként szóköz. A\hnem törhető szóköz. - A
\an8a 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
\k25egy karaoke szótag; az időtartamok centiszekundumban vannak, így a 25 negyed másodpercet jelent. - A
\p1után a szöveg „rajzolási utasításként lesz értelmezve”, így az a fordító, aki „lefordítja” azm 0 0 l 200 0kó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:
- Teljes fájl. Illeszd be a teljes
.assfájlt, és kérd vissza a lefordított fájlt. - Csak szöveg. Csak minden párbeszédsor
Textmező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\hkódot. - 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és | Teljes fájl | Csak szöveg | Védett |
|---|---|---|---|
| Időzítés, stílusok és 1–9. mezők változatlanok | 3 / 3 | 3 / 3 | 3 / 3 |
| Felülíró tagek változatlanok | 3 / 3 | 2 / 3 | 3 / 3 |
| Rajz- és megjegyzéssorok érintetlenek | 3 / 3 | 3 / 3 | 3 / 3 |
| A stílusbetűtípusok képesek megjeleníteni a fordítást | 0 / 3 | 0 / 3 | 0 / 3 |
\h és \n hézagként maradnak a kínai szövegben | 3 / 3 | 3 / 3 | 3 / 3 |
| Minden karaoke-tag megmarad, mindegyik szöveggel | 3 / 3 | 0 / 3 | 1 / 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
-
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
.assfájlnál is, és biztonságban tartják az eredeti bájtokat. A checker csak UTF-8-at és UTF-16-ot olvas. -
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.
-
Csak a
Textmező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. -
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. -
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.
-
Tisztítsd meg a térközkódokat és a karaoke-t a fent leírtak szerint.
-
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
\pdoboz 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ó:
- sample-source.ass: a 14 eseményből álló angol minta;
- check_ass_translation.py: az ellenőrző (Python standard könyvtár; a
--fontteszt a fontTools-t igényli); - run_llm_ass_test.py: a három promptfeltétel bármely OpenAI-kompatibilis helyi szerverhez;
- results.csv és check-results.txt: futtatásonkénti eredmények;
- README.txt: a fájllista és a tesztbeállítások, a kilenc szerkesztetlen kimenettel az
outputsmappában.
Kapcsolódó bejegyzések




