BookTranslator
BookTranslator

Cách dịch phụ đề ASS/SSA mà không làm hỏng kiểu dáng, vị trí hay karaoke

Chỉ dịch phần lời thoại hiển thị trong tệp .ass, sau đó kiểm tra thời gian, thẻ, karaoke và phông chữ. Với tệp mẫu, công cụ kiểm tra miễn phí và bài kiểm tra 9 lần chạy mô hình ngôn ngữ lớn cục bộ.

BookTranslator

BookTranslator Team

17 min read

Tệp phụ đề ASS hoặc SSA là một chương trình nhỏ: phần đầu, bảng kiểu dáng và danh sách các sự kiện có thời gian mà trường cuối cùng trộn lẫn lời thoại với mã định dạng. Để dịch nó, chỉ thay đổi những từ có thể đọc được trong trường cuối cùng đó, giữ nguyên mọi thứ khác từng byte một, rồi kiểm tra ba điều mà không công cụ dịch nào tự sửa giúp bạn: phông chữ, mã khoảng cách và các dòng karaoke.

Chúng tôi đã dịch một mẫu gồm 14 sự kiện sang tiếng Trung Giản thể chín lần bằng một mô hình cục bộ, sử dụng ba lời nhắc khác nhau và kiểm tra mọi kết quả bằng một tập lệnh do chúng tôi viết. Thời gian, vị trí, màu sắc, chú thích và hình vẽ đều được giữ nguyên trong cả chín lần. Những gì bị hỏng là các phần của tệp giả định tiếng Anh: trong cả chín lần, phông chữ của kiểu dáng không có ký tự tiếng Trung, nên tệp sẽ phụ thuộc vào trình phát để thay thế phông chữ, và một khoảng trắng cứng từ dòng tiếng Anh trở thành khoảng trống nhìn thấy được trong tiếng Trung. Dòng karaoke trở lại với thời gian trỏ sai từ trong mọi lần chạy, và trong bốn lần chạy, một số âm tiết không làm nổi bật gì cả.

Trả lời nhanh: Dịch gì và để nguyên gì

Phần của tệpVí dụ từ mẫu của chúng tôiDịch nó?
Phần đầu [Script Info]PlayResX: 1920, WrapStyle: 0Không. Vị trí được tính từ các giá trị này.
[V4+ Styles]Style: Default,Trebuchet MS,64,...Không, ngoại trừ tên phông chữ, mà bạn có thể cần thay đổi có chủ đích
Các trường sự kiện 1–90,0:00:01.00,0:00:03.20,Default,Jun,0,0,0,Không. Đây là lớp, thời gian, kiểu dáng, người nói, lề và hiệu ứng.
Khối ghi đè{\i1}, {\an8\pos(960,120)}, {\k25}Không
Hình vẽ{\p1}m 0 0 l 200 0 200 60 0 60{\p0}Không. Đây là hình dạng vector, không phải văn bản.
Sự kiện Comment:Comment: ...,Earlier draft: Try the stacks.Tùy chọn. Chú thích không bao giờ xuất hiện trên màn hình.
Ghi chú trong ngoặc nhọn{TL note: "stacks" means the closed shelves}Tùy chọn. Trình phát bỏ qua chúng.
Lời thoại hiển thịDid you find the second volume?Có
Mã dòng\N, \n, \hGiữ nguyên \N. Quyết định từng trường hợp cho \n và \h.

Phần còn lại của hướng dẫn này giải thích lý do mỗi hàng quan trọng và cách kiểm tra kết quả.

Cách một dòng ASS được xây dựng

Mỗi dòng trong phần [Events] tuân theo định dạng được khai báo ngay phía trên nó:

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.

Chỉ trường thứ mười, Text, chứa nội dung mà người xem đọc được. Hướng dẫn định dạng tệp ASS của dự án libass lưu ý rằng trường cuối cùng này "được phép chứa dấu phẩy", đó là lý do tại sao việc tách ẩu trên mọi dấu phẩy sẽ làm hỏng một dòng như Well, if it's there, then, we go now. Một công cụ an toàn chỉ tách trên chín dấu phẩy đầu tiên.

Bên trong Text, bất cứ thứ gì trong dấu ngoặc nhọn là một khối ghi đè. Tài liệu tham khảo thẻ ghi đè của Aegisub định nghĩa các mã bạn sẽ gặp thường xuyên nhất:

  • \N buộc ngắt dòng trong mọi chế độ ngắt dòng. \n chỉ ngắt dòng trong chế độ ngắt dòng 2 và nếu không thì là một khoảng trắng. \h là khoảng trắng không ngắt.
  • \an8 đặt căn lề bằng bố cục bàn phím số, vì vậy 8 là trên cùng giữa. \pos(960,120) đặt dòng tại tọa độ script.
  • \k25 là một âm tiết karaoke; thời lượng tính bằng centi giây, vì vậy 25 nghĩa là một phần tư giây.
  • Sau \p1, văn bản "sẽ được hiểu là hướng dẫn vẽ", vì vậy một dịch giả "dịch" m 0 0 l 200 0 sẽ phá hủy một hình dạng.
  • Văn bản không được nhận diện bên trong dấu ngoặc nhọn "bị bỏ qua một cách im lặng", đó là lý do tại sao các tệp fansub thường chứa ghi chú của dịch giả trong dấu ngoặc nhọn.

Các dòng bắt đầu bằng Comment: sử dụng cùng các trường, nhưng theo hướng dẫn libass "không có gì sẽ được hiển thị trên màn hình."

Những gì chúng tôi đã kiểm tra

Chúng tôi đã viết sample-source.ass, một cảnh 14 sự kiện lấy bối cảnh trong một hiệu sách, với một ví dụ cho mỗi tính năng ở trên: chữ nghiêng, ngắt cứng, dấu phẩy trong hội thoại, ghi chú trong ngoặc nhọn, dòng chú thích, biển báo được định vị, hộp vector, hiệu ứng mờ dần, khoảng trắng cứng, thay đổi màu với \r, ngắt mềm, hiệu ứng Banner cuộn, và một dòng karaoke sáu âm tiết.

Sau đó chúng tôi yêu cầu một mô hình cục bộ dịch nó sang tiếng Trung giản thể theo ba cách:

  1. Toàn bộ tệp. Dán toàn bộ tệp .ass và yêu cầu trả lại tệp đã dịch.
  2. Chỉ văn bản. Chỉ gửi trường Text của mỗi dòng hội thoại dưới dạng JSON, với các thẻ nội tuyến, và hướng dẫn giữ nguyên mọi khối {...} và mọi \N, \n, và \h.
  3. Được bảo vệ. Tương tự, nhưng thay thế mọi khối ngoặc nhọn và mã dòng bằng một trình giữ chỗ được đánh số trước, và đặt lại bản gốc sau đó.

Trong điều kiện thứ hai và thứ ba, script không bao giờ gửi bản vẽ vector hoặc dòng chú thích đến mô hình, vì vậy những dòng đó chỉ có thể bị hỏng trong điều kiện toàn bộ tệp.

Mô hình là Qwen 3.6 27B (Q4_K_M) trong LM Studio 0.4.8 trên Apple M4 Max với 64 GB bộ nhớ, với chế độ suy nghĩ tắt và nhiệt độ 0.3. Chúng tôi đã chạy mỗi điều kiện ba lần, tổng cộng chín lần chạy. Lần thử đầu tiên ở lần chạy thứ ba kết thúc khi máy chủ cục bộ ngắt kết nối, vì vậy chúng tôi đã khởi động lại nó và chạy lại vòng thứ ba. Script là run_llm_ass_test.py, và tất cả chín đầu ra được xuất bản không chỉnh sửa cùng với nó; README liệt kê mọi tệp. Nếu bạn chưa từng thiết lập một mô hình cục bộ, hướng dẫn dịch bằng LLM cục bộ của chúng tôi bao gồm các cài đặt.

Đây là một thử nghiệm nhỏ với một mô hình, một cặp ngôn ngữ và một mẫu. Nó cho thấy những vấn đề nào xảy ra và cách phát hiện chúng. Nó không xếp hạng công cụ hay lời nhắc.

Kết quả: Cỗ máy sống sót; các giả định tiếng Anh thì không

Chúng tôi đã kiểm tra mọi đầu ra bằng check_ass_translation.py. Đầu ra đầy đủ nằm trong check-results.txt, và results.csv có một hàng cho mỗi lần chạy, bao gồm cả những vấn đề mà script không thể thấy.

Kiểm traToàn bộ tệpChỉ văn bảnĐược bảo vệ
Thời gian, kiểu dáng và trường 1–9 không thay đổi3 trên 33 trên 33 trên 3
Thẻ ghi đè không thay đổi3 trên 32 trên 33 trên 3
Dòng vẽ và dòng chú thích không bị động đến3 trên 33 trên 33 trên 3
Phông chữ kiểu dáng có thể hiển thị bản dịch0 trên 30 trên 30 trên 3
\h và \n được giữ làm khoảng trống trong văn bản tiếng Trung3 trên 33 trên 33 trên 3
Tất cả thẻ karaoke được giữ nguyên, mỗi thẻ đều có văn bản3 trên 30 trên 31 trên 3

Hai kết quả khiến chúng tôi bất ngờ. Dán toàn bộ tệp giữ nguyên cấu trúc trong cả ba lần chạy, mặc dù ở hai trong số đó nó cũng dịch dòng Title trong phần đầu. Và lời nhắc chỉ văn bản, nghe có vẻ an toàn hơn, lại tạo ra thẻ bị hỏng duy nhất. Trong một lần chạy, nó trả về {\k25}翻{\k30}页,{\k45}开{\k60}灯 cho một dòng có sáu thẻ karaoke. Hai thẻ cuối và 1,20 giây thời gian tô sáng đã biến mất, vì vậy phần tô sáng sẽ kết thúc rất lâu trước dòng đó. Lần chạy tương tự đã biến Room\h12 is upstairs. thành 12\h12号房间在楼上。, với số phòng xuất hiện hai lần.

Vì vậy, bài học hữu ích không phải là "dùng lời nhắc X." Mà là tổn hại cấu trúc mà bạn lo sợ rất dễ phát hiện, và tổn hại thực sự lọt qua trong cả chín lần chạy nằm ở ba nơi mà các trang công cụ dịch ASS không đề cập đến.

1. Phông chữ không thể vẽ ngôn ngữ mới

Các kiểu của mẫu sử dụng Trebuchet MS cho lời thoại và Georgia cho biển hiệu, điều này bình thường đối với bản phát hành tiếng Anh. Cả hai phông chữ đều không chứa ký tự Trung Quốc. Khi chúng tôi hướng bài kiểm tra glyph của công cụ kiểm tra vào hai tệp phông chữ, tất cả 12 sự kiện văn bản đã dịch trong mọi lần chạy đều thất bại:

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

Trình phát có thể thay thế một phông chữ khác đã cài đặt, vì vậy phụ đề vẫn có thể xuất hiện, nhưng bản phát hành không còn kiểm soát được hình thức của nó, và người xem có hệ thống thiếu phông chữ phù hợp có thể thấy các ô trống. Cách khắc phục là chỉnh sửa có chủ đích trường Fontname của từng kiểu. Khi chúng tôi thay đổi cả ba kiểu trong một đầu ra thành Hiragino Sans GB, một phông chữ Trung Quốc đi kèm với macOS, và chạy bài kiểm tra glyph với phông chữ đó, lỗi glyph đã về không.

Chọn một phông chữ mà người xem của bạn thực sự có, hoặc đính kèm nó với video. Hướng dẫn libass nói rằng các bản phát hành nên đính kèm mọi phông chữ chúng sử dụng, tốt nhất là vào vùng chứa MKV. Vì phông chữ ngôn ngữ đích là mới, việc đính kèm nó giờ là một phần của công việc dịch.

2. Mã khoảng cách mang thói quen tiếng Anh

Room\h12 gắn "Room" với "12" để chúng không bao giờ tách dòng. Trong tiếng Trung, các từ không được phân tách bằng dấu cách, nhưng mọi lần chạy đều giữ \h ở đâu đó: năm lần đặt nó giữa 12号房间 và 在楼上, ba lần đặt trước số, và một lần đặt giữa hai bản sao của số. Dù thế nào, người xem thấy một khoảng trống thừa. Wait\nhere. cũng gặp vấn đề tương tự. Với WrapStyle: 0, \n hiển thị thành dấu cách, vì vậy 在\n这里等 cho thấy một khoảng trống ở giữa câu ba từ.

Cấu trúc ở đây ổn; ngôn ngữ thì không. Đối với ngôn ngữ đích không có dấu cách giữa các từ, hãy xóa \h và \n khỏi văn bản đã dịch. Chỉ giữ \N ở nơi bạn muốn ngắt dòng cưỡng bức, và đặt nó ở điểm tự nhiên trong câu đích. Công cụ kiểm tra báo cáo số lượng \h và \n thay đổi dưới dạng cảnh báo thay vì lỗi vì lý do này, và nó cảnh báo khi một trong số chúng còn sót lại bên trong văn bản tiếng Trung, tiếng Nhật hoặc tiếng Hàn.

3. Thời gian karaoke thuộc về các từ gốc

Dòng karaoke {\k25}Turn {\k30}the {\k45}page, {\k60}turn {\k40}the {\k80}light định thời từng âm tiết tiếng Anh theo bài hát. Một bản dịch không thể giữ thời gian đó một cách có ý nghĩa, vì các từ tiếng Trung không rơi vào cùng nhịp. Các lần chạy của chúng tôi cho thấy những cách khác nhau mà nó đi sai:

  • Trong bốn lần chạy, tất cả sáu thẻ đều được giữ, mỗi thẻ trên một từ khác với trước. Một trong số đó kết thúc bằng {\k40}打{\k80}开, "mở", và bỏ hoàn toàn "light" khỏi dòng.
  • Trong bốn lần chạy, một âm tiết không tô sáng gì, chẳng hạn như 打开{\k40}{\k80}灯 (0,40 giây tô sáng trên một âm tiết trống). Trong hai trong số đó, một âm tiết 0,45 giây cũng chỉ tô sáng một dấu phẩy.
  • Trong một lần chạy, hai thẻ biến mất, như đã mô tả ở trên.

Công cụ kiểm tra gắn cờ một dòng karaoke được dịch tại chỗ và bất kỳ âm tiết nào không còn văn bản. Cách khắc phục tốt hơn là biên tập: không dịch karaoke tại chỗ. Giữ dòng gốc đã định thời để hát theo, và thêm bản dịch dưới dạng một sự kiện riêng: sao chép sự kiện karaoke, gán cho nó kiểu riêng (ví dụ: nhỏ hơn và đặt ở dưới cùng), xóa các thẻ \k, và dịch văn bản. Chỉ định thời lại từng âm tiết nếu bạn sẵn sàng tự căn thời gian theo âm thanh.

Một quy trình làm việc vững chắc

  1. Trước tiên hãy làm cho nguồn có thể đọc được. Nếu tệp hiển thị ký tự bị lỗi, hãy sửa mã hóa trước bất cứ điều gì khác. Hướng dẫn mã hóa của chúng tôi sử dụng ví dụ SRT, nhưng các bước ở mức byte tương tự cũng hoạt động cho tệp .ass và giữ an toàn các byte gốc. Công cụ kiểm tra chỉ đọc UTF-8 và UTF-16.

  2. Xác định phạm vi. Liệt kê các kiểu và quyết định kiểu nào là lời thoại, kiểu nào là biển hiệu trên màn hình, và kiểu nào là karaoke. Biển hiệu thường cần dịch; karaoke thường cần một dòng riêng; chú thích và ghi chú trong ngoặc là do bạn quyết định.

  3. Chỉ dịch trường Text. Sử dụng một công cụ phân tích cú pháp ASS thay vì coi nó như văn bản thuần, hoặc tự bảo vệ các thẻ như trong điều kiện thứ ba của chúng tôi. Giữ tệp nguồn bên cạnh đầu ra.

  4. Chạy kiểm tra cấu trúc.

    python3 check_ass_translation.py source.ass translated.ass
    

    Nó so sánh số lượng sự kiện, loại sự kiện, trường 1–9, giá trị kiểu, khối ghi đè, hình vẽ, dòng chú thích, \N, âm tiết và thời lượng karaoke, và các dòng trở về trống hoặc không thay đổi. Nó không đánh giá chất lượng bản dịch.

  5. Sửa phông chữ một cách có chủ đích. Thay đổi Fontname trong mỗi kiểu hiện chứa văn bản ngôn ngữ đích, sau đó chạy thử nghiệm glyph với tệp phông chữ bạn sẽ phát hành:

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

    Tên phông chữ bị thay đổi sẽ hiện dưới dạng cảnh báo, để bạn có thể xác nhận mọi thay đổi đều là có chủ đích.

  6. Dọn dẹp các mã khoảng cách và karaoke như mô tả ở trên.

  7. Xem cùng video. Mở tệp trong Aegisub hoặc trình phát của bạn. Kiểm tra xem các biển hiệu vẫn vừa với hình dạng được vẽ phía sau chúng, vì một hộp \p giữ nguyên kích thước tiếng Anh trong khi biển hiệu đã dịch có thể dài hơn hoặc ngắn hơn nhiều. Kiểm tra xem các dòng có quá dài so với thời gian hiển thị trên màn hình không. Cả hai vấn đề đều không hiển thị trong chính tệp.

BookTranslator phù hợp ở đâu

Trình dịch phụ đề của BookTranslator chấp nhận các tệp SRT, VTT, ASS và SSA. Theo trang sản phẩm, nó giữ nguyên dấu thời gian và thứ tự cue, đồng thời giữ kiểu dáng ASS và SSA được hỗ trợ gắn với từng mục phụ đề, nên bạn không phải tự trích xuất và chèn lại văn bản. Nó dịch lời thoại với các dòng xung quanh làm ngữ cảnh, điều này giúp ích với tên riêng và các câu đùa xuyên suốt cả tập phim.

Chúng tôi không chạy mẫu này qua BookTranslator cho bài viết này. Dù bạn dùng công cụ nào, hãy chạy các bước 4 đến 7 trên kết quả. Một kiểu vẫn giữ phông chữ tiếng Anh thì vẫn là kiểu không thể vẽ được chữ Hán, và karaoke được dịch tại chỗ vẫn cần một quyết định biên tập. Để biết phần còn lại của quy trình phụ đề, xem hướng dẫn dịch phụ đề bằng AI của chúng tôi, so sánh các phần mềm dịch phụ đề, và nếu bản dịch của bạn sẽ lên YouTube, hãy xem quy trình phụ đề YouTube.

Khi nào nên chuyển sang SRT thay thế

Chuyển ASS sang SRT trước khi dịch sẽ loại bỏ kiểu dáng, vị trí, hình vẽ và karaoke, đồng thời cũng loại bỏ hầu hết các vấn đề nêu trên. Đó là một đánh đổi hợp lý nếu đích đến của bạn chỉ hiển thị phụ đề thuần, hoặc nếu kiểu dáng chưa bao giờ quan trọng với bản phát hành. Đó là đánh đổi sai lầm với các bản phát hành anime và âm nhạc, nơi biển hiệu và karaoke là một phần của tác phẩm. Hãy quyết định dựa trên nơi tệp sẽ được hiển thị, không phải định dạng nào dễ dịch hơn.

Tải các tệp thử nghiệm

Mọi thứ từ bài thử nghiệm này đều miễn phí để tái sử dụng:

Bài viết liên quan