Jak tłumaczyć napisy ASS/SSA bez psucia stylów, pozycji i karaoke
Tłumacz tylko widoczne dialogi w pliku .ass, a następnie sprawdź synchronizację, znaczniki, karaoke i czcionki. Z plikiem przykładowym, darmowym narzędziem do sprawdzania i testem lokalnego LLM w 9 przebiegach.

Plik napisów ASS lub SSA to mały program: nagłówek, tabela stylów i lista zdarzeń z czasem, których ostatnie pole łączy dialog z kodem formatowania. Aby go przetłumaczyć, zmień tylko czytelne słowa w tym ostatnim polu, pozostaw wszystko inne bajt po bajcie bez zmian, a następnie sprawdź trzy rzeczy, których żadne narzędzie tłumaczeniowe za ciebie nie naprawi: czcionki, kody odstępów i linie karaoke.
Przetłumaczyliśmy 14-zdarzeniowy plik przykładowy na uproszczony chiński dziewięć razy za pomocą lokalnego modelu, używając trzech różnych promptów, i sprawdziliśmy każdy wynik napisanym przez nas skryptem. Synchronizacja, pozycje, kolory, komentarze i rysunki przetrwały we wszystkich dziewięciu. Zepsuły się części pliku, które zakładają angielski: we wszystkich dziewięciu stylach czcionek nie było znaków chińskich, więc plik polegałby na odtwarzaczu w kwestii podstawienia czcionki, a twarda spacja z angielskiej linii stała się widoczną luką w chińskiej. Linia karaoke wróciła z synchronizacją wskazującą na niewłaściwe słowa w każdym przebiegu, a w czterech przebiegach niektóre sylaby nie podświetlały niczego.
Krótka odpowiedź: co tłumaczyć, a co zostawić w spokoju
| Część pliku | Przykład z naszego pliku | Tłumaczyć? |
|---|---|---|
Nagłówek [Script Info] | PlayResX: 1920, WrapStyle: 0 | Nie. Pozycje są obliczane na podstawie tych wartości. |
[V4+ Styles] | Style: Default,Trebuchet MS,64,... | Nie, z wyjątkiem nazwy czcionki, którą możesz świadomie zmienić |
| Pola zdarzeń 1–9 | 0,0:00:01.00,0:00:03.20,Default,Jun,0,0,0, | Nie. To warstwa, synchronizacja, styl, mówca, marginesy i efekt. |
| Bloki nadpisujące | {\i1}, {\an8\pos(960,120)}, {\k25} | Nie |
| Rysunki | {\p1}m 0 0 l 200 0 200 60 0 60{\p0} | Nie. To kształt wektorowy, nie tekst. |
Zdarzenia Comment: | Comment: ...,Earlier draft: Try the stacks. | Opcjonalnie. Komentarze nigdy nie pojawiają się na ekranie. |
| Notatki w nawiasach klamrowych | {TL note: "stacks" means the closed shelves} | Opcjonalnie. Odtwarzacze je ignorują. |
| Widoczne dialogi | Did you find the second volume? | Tak |
| Kody linii | \N, \n, \h | Zachowaj \N. Decyduj indywidualnie dla \n i \h. |
Reszta tego przewodnika wyjaśnia, dlaczego każdy wiersz ma znaczenie i jak sprawdzić wynik.
Jak zbudowana jest linia ASS
Każda linia w sekcji [Events] jest zgodna z formatem zadeklarowanym tuż powyżej:
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.
Tylko dziesiąte pole, Text, zawiera cokolwiek, co czyta widz. Przewodnik po formacie plików ASS projektu libass zauważa, że to ostatnie pole „może zawierać przecinki”, dlatego nieostrożny podział na każdym przecinku psuje linię taką jak Well, if it's there, then, we go now. Bezpieczne narzędzie dzieli tylko na pierwszych dziewięciu przecinkach.
Wewnątrz Text wszystko w nawiasach klamrowych jest blokiem nadpisania. Dokumentacja znaczników nadpisania Aegisub definiuje kody, które spotkasz najczęściej:
\Nwymusza przełamanie linii w każdym trybie zawijania.\nprzełamuje linię tylko w trybie zawijania 2, a poza nim jest spacją.\hto spacja nierozdzielająca.\an8ustawia wyrównanie zgodnie z układem klawiatury numerycznej, więc 8 to góra-środek.\pos(960,120)umieszcza linię na współrzędnych skryptu.\k25to sylaba karaoke; czasy trwania są w centysekundach, więc 25 oznacza ćwierć sekundy.- Po
\p1tekst „będzie następnie interpretowany jako instrukcje rysowania”, więc tłumacz, który „przetłumaczy”m 0 0 l 200 0, zniszczy kształt. - Nierozpoznany tekst w nawiasach klamrowych „jest po cichu ignorowany”, dlatego pliki fansubów często zawierają notatki tłumacza w nawiasach klamrowych.
Linie zaczynające się od Comment: używają tych samych pól, ale według przewodnika libass „nic nie zostanie wyświetlone na ekranie”.
Co testowaliśmy
Napisaliśmy sample-source.ass, scenę z 14 zdarzeniami osadzoną w księgarni, z jednym przykładem każdej z powyższych funkcji: kursywą, twardym przełamaniem, przecinkami w dialogu, notatką w nawiasach klamrowych, linią komentarza, pozycjonowanym znakiem, prostokątem wektorowym, zanikaniem, twardą spacją, zmianą koloru z \r, miękkim przełamaniem, efektem przewijania Banner i sześciosylabową linią karaoke.
Następnie poprosiliśmy lokalny model o przetłumaczenie go na uproszczony chiński na trzy sposoby:
- Cały plik. Wklej cały plik
.assi poproś o zwrot przetłumaczonego pliku. - Tylko tekst. Wyślij tylko pole
Textkażdej linii dialogowej jako JSON, ze znacznikami w treści, oraz instrukcję zachowania każdego bloku{...}i każdego\N,\ni\h. - Chronione. To samo, ale najpierw zastąp każdy blok w nawiasach klamrowych i kod linii numerowanym symbolem zastępczym, a potem przywróć oryginały.
W drugim i trzecim wariancie skrypt nigdy nie wysyła rysunku wektorowego ani linii komentarza do modelu, więc te linie mogły zostać uszkodzone tylko w wariancie z całym plikiem.
Modelem był Qwen 3.6 27B (Q4_K_M) w LM Studio 0.4.8 na Apple M4 Max z 64 GB pamięci, z wyłączonym myśleniem i temperaturą 0,3. Każdy warunek uruchomiliśmy trzy razy, łącznie dziewięć uruchomień. Pierwsza próba trzeciego uruchomienia zakończyła się, gdy lokalny serwer zerwał połączenie, więc zrestartowaliśmy go i ponownie przeprowadziliśmy trzecią rundę. Skrypt to run_llm_ass_test.py, a wszystkie dziewięć wyników opublikowano bez zmian obok niego; README wymienia każdy plik. Jeśli nigdy nie konfigurowałeś lokalnego modelu, nasz przewodnik po tłumaczeniu z lokalnym LLM omawia ustawienia.
To był mały test jednego modelu, jednej pary językowej i jednej próbki. Pokazuje, jakie problemy występują i jak je wychwycić. Nie rankinguje narzędzi ani poleceń.
Wynik: Mechanizm przetrwał; angielskie założenia nie
Sprawdziliśmy każdy wynik za pomocą check_ass_translation.py. Pełny wynik znajduje się w check-results.txt, a results.csv ma jeden wiersz na uruchomienie, w tym problemy, których skrypt nie widzi.
| Sprawdzenie | Cały plik | Tylko tekst | Zabezpieczone |
|---|---|---|---|
| Czas, style i pola 1–9 bez zmian | 3 z 3 | 3 z 3 | 3 z 3 |
| Tagi nadpisujące bez zmian | 3 z 3 | 2 z 3 | 3 z 3 |
| Linie rysunków i komentarzy nietknięte | 3 z 3 | 3 z 3 | 3 z 3 |
| Czcionki stylu umożliwiające wyświetlenie tłumaczenia | 0 z 3 | 0 z 3 | 0 z 3 |
\h i \n pozostawione jako luki w tekście chińskim | 3 z 3 | 3 z 3 | 3 z 3 |
| Wszystkie tagi karaoke zachowane, każdy z tekstem | 3 z 3 | 0 z 3 | 1 z 3 |
Dwa wyniki nas zaskoczyły. Wklejenie całego pliku zachowało strukturę we wszystkich trzech próbach, choć w dwóch z nich przetłumaczyło także wiersz Title w nagłówku. A polecenie tylko-tekstowe, które brzmi bezpieczniej, wygenerowało jedyne uszkodzone znaczniki. W jednej próbie zwróciło {\k25}翻{\k30}页,{\k45}开{\k60}灯 dla wiersza z sześcioma znacznikami karaoke. Ostatnie dwa znaczniki i 1,20 sekundy czasu podświetlenia zniknęły, więc podświetlenie skończyłoby się znacznie przed końcem wiersza. Ta sama próba zamieniła Room\h12 is upstairs. na 12\h12号房间在楼上。, z numerem pokoju podanym dwukrotnie.
Więc użyteczna lekcja nie brzmi „użyj polecenia X”. Chodzi o to, że uszkodzenie struktury, którego się obawiasz, łatwo wykryć, a uszkodzenia, które faktycznie przeszły we wszystkich dziewięciu próbach, tkwią w trzech miejscach, o których strony narzędzi do tłumaczenia ASS nie wspominają.
1. Czcionki nie potrafią oddać nowego języka
Style w próbce używają Trebuchet MS dla dialogów i Georgia dla napisów, co jest normalne dla wydania angielskiego. Żadna z tych czcionek nie zawiera znaków chińskich. Gdy skierowaliśmy test glifów sprawdzarki na oba pliki czcionek, wszystkie 12 przetłumaczonych zdarzeń tekstowych w każdej próbie nie przeszło testu:
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. 书人仅作员工库架闭限
Odtwarzacz może podstawić inną zainstalowaną czcionkę, więc napis może się jeszcze pojawić, ale wydanie przestaje kontrolować jego wygląd, a widz, którego system nie ma odpowiedniej czcionki, może zobaczyć puste prostokąty. Rozwiązaniem jest świadoma zmiana pola Fontname w każdym stylu. Gdy zmieniliśmy wszystkie trzy style w jednym wyniku na Hiragino Sans GB, chińską czcionkę dostarczaną z macOS, i uruchomiliśmy test glifów dla tej czcionki, błędy glifów spadły do zera.
Wybierz czcionkę, którą Twoi widzowie naprawdę będą mieć, albo dołącz ją do wideo. Przewodnik libass mówi, że wydania powinny załączać każdą używaną czcionkę, najlepiej do kontenera MKV. Ponieważ czcionka języka docelowego jest nowa, jej załączenie staje się teraz częścią zadania tłumaczeniowego.
2. Kody odstępów niosą angielskie nawyki
Room\h12 skleja „Room” z „12”, żeby nigdy nie rozdzieliły się między wierszami. W chińskim słowa nie są oddzielane spacjami, ale każda próba gdzieś zachowała \h: pięć prób umieściło go między 12号房间 a 在楼上, trzy przed numerem, a jedna między dwiema kopiami numeru. Tak czy inaczej widz widzi zbłąkaną spację. Wait\nhere. miało ten sam problem. Przy WrapStyle: 0 znak \n renderuje się jako spacja, więc 在\n这里等 pokazuje lukę w środku trzywyrazowego zdania.
Struktura jest tu w porządku; język nie. W języku docelowym, który nie oddziela słów spacjami, usuń \h i \n z przetłumaczonego tekstu. Zachowaj \N tylko tam, gdzie chcesz wymusić złamanie wiersza, i umieść je w naturalnym miejscu zdania docelowego. Sprawdzarka z tego powodu zgłasza zmienione liczby \h i \n jako ostrzeżenia, a nie błędy, i ostrzega, gdy któryś z nich przetrwa w tekście chińskim, japońskim lub koreańskim.
3. Czas karaoke należy do oryginalnych słów
Wiersz karaoke {\k25}Turn {\k30}the {\k45}page, {\k60}turn {\k40}the {\k80}light dopasowuje czas każdej angielskiej sylaby do piosenki. Tłumaczenie nie może sensownie zachować tego timingu, ponieważ chińskie słowa nie wypadają na tych samych taktach. Nasze próby pokazują różne sposoby, w jakie to się psuje:
- W czterech próbach zachowano wszystkie sześć znaczników, każdy na innym słowie niż wcześniej. Jedna z nich kończyła się na
{\k40}打{\k80}开, „otwórz”, i całkowicie pominęła „light” w wierszu. - W czterech próbach sylaba nie podświetlała niczego, np.
打开{\k40}{\k80}灯(0,40 sekundy podświetlenia pustej sylaby). W dwóch z nich sylaba o długości 0,45 sekundy podświetlała tylko przecinek. - W jednej próbie zniknęły dwa znaczniki, jak opisano powyżej.
Sprawdzarka oznacza wiersz karaoke przetłumaczony w miejscu oraz każdą sylabę pozostawioną bez tekstu. Lepszym rozwiązaniem jest podejście redakcyjne: nie tłumacz karaoke w miejscu. Zachowaj oryginalny wiersz z timingiem do śpiewania i dodaj tłumaczenie jako osobne zdarzenie: skopiuj zdarzenie karaoke, nadaj mu własny styl (na przykład mniejszy i umieszczony na dole), usuń znaczniki \k i przetłumacz tekst. Dopasuj timing sylaba po sylabie tylko wtedy, gdy jesteś gotów samodzielnie zsynchronizować go z dźwiękiem.
Proces, który się sprawdza
-
Najpierw zadbaj o czytelność źródła. Jeśli plik pokazuje zniekształcone znaki, napraw kodowanie przed wszystkim innym. Nasz przewodnik po kodowaniu używa przykładów SRT, ale te same kroki na poziomie bajtów działają dla pliku
.assi zachowują oryginalne bajty w bezpieczeństwie. Sprawdzarka odczytuje tylko UTF-8 i UTF-16. -
Ustal zakres. Wypisz style i zdecyduj, które są dialogami, które napisami na ekranie, a które karaoke. Napisy zwykle wymagają tłumaczenia; karaoke zwykle wymaga osobnego wiersza; komentarze i notatki w nawiasach klamrowych pozostają do Twojej decyzji.
-
Tłumacz tylko pole
Text. Użyj narzędzia, które parsuje ASS, zamiast traktować go jak zwykły tekst, albo sam zabezpiecz znaczniki, jak w naszym trzecim warunku. Trzymaj plik źródłowy obok wyniku. -
Uruchom kontrolę strukturalną.
python3 check_ass_translation.py source.ass translated.assPorównuje liczbę zdarzeń, typy zdarzeń, pola 1–9, wartości stylów, bloki nadpisań, rysunki, wiersze komentarzy,
\N, sylaby i czasy karaoke oraz wiersze, które wróciły puste lub niezmienione. Nie ocenia jakości tłumaczenia. -
Popraw czcionki celowo. Zmień
Fontnamew każdym stylu, który teraz zawiera tekst w języku docelowym, a następnie uruchom test glifów na pliku czcionki, który zamierzasz dostarczyć:pip install fonttools python3 check_ass_translation.py source.ass translated.ass --font "Noto Sans SC=/path/to/NotoSansSC-Regular.otf"Zmieniona nazwa czcionki pojawia się jako ostrzeżenie, więc możesz potwierdzić, że każda zmiana była zamierzona.
-
Posprzątaj kody odstępów i karaoke w sposób opisany powyżej.
-
Obejrzyj to z wideo. Otwórz plik w Aegisub lub swoim odtwarzaczu. Sprawdź, czy napisy wciąż pasują do kształtów narysowanych za nimi, ponieważ pole
\pzachowuje swój angielski rozmiar, podczas gdy przetłumaczony napis może być znacznie dłuższy lub krótszy. Sprawdź, czy wiersze nie są zbyt długie jak na swój czas na ekranie. Żaden z tych problemów nie jest widoczny w samym pliku.
Gdzie pasuje BookTranslator
Tłumacz napisów BookTranslator obsługuje pliki SRT, VTT, ASS i SSA. Według strony produktu zachowuje znaczniki czasu i kolejność napisów oraz utrzymuje obsługiwane formatowanie ASS i SSA przypisane do każdego wpisu napisów, więc nie musisz samodzielnie wyodrębniać i wstawiać tekstu. Tłumaczy dialog z uwzględnieniem otaczających wierszy jako kontekstu, co pomaga w przypadku imion i powtarzających się żartów w całym odcinku.
Nie przepuściliśmy tego przykładu przez BookTranslator na potrzeby tego artykułu. Niezależnie od użytego narzędzia, wykonaj kroki od 4 do 7 na wyniku. Styl, który zachowuje angielską czcionkę, to wciąż styl, który nie potrafi wyświetlić chińskich znaków, a karaoke przetłumaczone w miejscu nadal wymaga decyzji redakcyjnej. Aby poznać resztę procesu tłumaczenia napisów, zobacz nasz przewodnik po tłumaczeniu napisów AI, nasze porównanie oprogramowania do tłumaczenia napisów oraz, jeśli Twoje tłumaczenie trafi na YouTube, proces tłumaczenia napisów na YouTube.
Kiedy zamiast tego przekonwertować na SRT
Konwersja ASS na SRT przed tłumaczeniem usuwa style, pozycje, rysunki i karaoke, co usuwa również większość powyższych problemów. To rozsądny kompromis, jeśli miejsce docelowe wyświetla tylko zwykłe napisy lub jeśli formatowanie nigdy nie było ważne dla wydania. To zły kompromis w przypadku wydań anime i muzycznych, gdzie napisy i karaoke są częścią dzieła. Zdecyduj na podstawie tego, gdzie plik będzie wyświetlany, a nie tego, który format jest łatwiejszy do tłumaczenia.
Pobierz pliki testowe
Wszystko z tego testu można swobodnie wykorzystać:
- sample-source.ass: 14-wydarzeniowa próbka w języku angielskim;
- check_ass_translation.py: narzędzie sprawdzające (biblioteka standardowa Pythona; test
--fontwymaga fontTools); - run_llm_ass_test.py: trzy warunki promptu dla dowolnego lokalnego serwera zgodnego z OpenAI;
- results.csv i check-results.txt: wyniki poszczególnych uruchomień;
- README.txt: lista plików i ustawienia testu, z dziewięcioma nieedytowanymi wynikami w folderze
outputs.
Powiązane wpisy




