BookTranslator
BookTranslator

Cara Menerjemahkan Subtitle ASS/SSA Tanpa Merusak Gaya, Posisi, atau Karaoke

Terjemahkan hanya dialog yang terlihat dalam file .ass, lalu periksa timing, tag, karaoke, dan font. Dengan file contoh, pemeriksa gratis, dan uji LLM lokal 9 kali jalan.

BookTranslator

BookTranslator Team

12 min read

File subtitle ASS atau SSA adalah program kecil: header, tabel gaya, dan daftar event berwaktu yang kolom terakhirnya mencampur dialog dengan kode pemformatan. Untuk menerjemahkannya, ubah hanya kata-kata yang bisa dibaca di kolom terakhir itu, biarkan semua yang lain persis sama byte demi byte, lalu periksa tiga hal yang tidak diperbaiki oleh alat penerjemah mana pun untuk Anda: font, kode spasi, dan baris karaoke.

Kami menerjemahkan sampel berisi 14 event ke bahasa Mandarin Sederhana sembilan kali dengan model lokal, menggunakan tiga prompt berbeda, dan memeriksa setiap hasil dengan skrip yang kami tulis. Timing, posisi, warna, komentar, dan gambar bertahan di kesembilan percobaan. Yang rusak adalah bagian-bagian file yang mengasumsikan bahasa Inggris: di kesembilan percobaan, font gaya tidak memiliki karakter Mandarin, sehingga file akan bergantung pada pemutar untuk mengganti font, dan spasi keras dari baris bahasa Inggris menjadi celah yang terlihat di bahasa Mandarin. Baris karaoke kembali dengan timing yang menunjuk ke kata yang salah di setiap percobaan, dan di empat percobaan beberapa suku kata tidak menyorot apa pun.

Jawaban Singkat: Apa yang Diterjemahkan dan Apa yang Dibiarkan

Bagian fileContoh dari sampel kamiTerjemahkan?
Header [Script Info]PlayResX: 1920, WrapStyle: 0Tidak. Posisi dihitung dari nilai-nilai ini.
[V4+ Styles]Style: Default,Trebuchet MS,64,...Tidak, kecuali nama font, yang mungkin perlu Anda ubah dengan sengaja
Kolom event 1–90,0:00:01.00,0:00:03.20,Default,Jun,0,0,0,Tidak. Ini adalah layer, timing, gaya, pembicara, margin, dan efek.
Blok override{\i1}, {\an8\pos(960,120)}, {\k25}Tidak
Gambar{\p1}m 0 0 l 200 0 200 60 0 60{\p0}Tidak. Ini adalah bentuk vektor, bukan teks.
Event Comment:Comment: ...,Earlier draft: Try the stacks.Opsional. Komentar tidak pernah muncul di layar.
Catatan kurung kurawal{TL note: "stacks" means the closed shelves}Opsional. Pemutar mengabaikannya.
Dialog yang terlihatDid you find the second volume?Ya
Kode baris\N, \n, \hPertahankan \N. Putuskan per kasus untuk \n dan \h.

Sisa panduan ini menjelaskan mengapa setiap baris penting dan cara memeriksa hasilnya.

Cara Baris ASS Dibangun

Setiap baris di bagian [Events] mengikuti format yang dideklarasikan tepat di atasnya:

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.

Hanya kolom kesepuluh, Text, yang berisi sesuatu yang dibaca penonton. Panduan format file ASS dari proyek libass mencatat bahwa kolom terakhir ini "diizinkan berisi koma", itulah sebabnya pemisahan sembarangan pada setiap koma merusak baris seperti Well, if it's there, then, we go now. Alat yang aman hanya memisahkan pada sembilan koma pertama.

Di dalam Text, apa pun yang berada dalam kurung kurawal adalah blok override. Referensi tag override Aegisub mendefinisikan kode-kode yang paling sering Anda temui:

  • \N memaksa jeda baris dalam semua mode pembungkusan. \n memutus baris hanya dalam mode pembungkusan 2 dan selain itu menjadi spasi. \h adalah spasi tak terputus.
  • \an8 mengatur perataan menggunakan tata letak tombol numerik, jadi 8 adalah tengah atas. \pos(960,120) menempatkan baris pada koordinat skrip.
  • \k25 adalah suku kata karaoke; durasi dalam sentidetik, jadi 25 berarti seperempat detik.
  • Setelah \p1, teks "kemudian akan ditafsirkan sebagai instruksi gambar", jadi penerjemah yang "menerjemahkan" m 0 0 l 200 0 merusak sebuah bentuk.
  • Teks yang tidak dikenali di dalam kurung kurawal "diabaikan secara diam-diam", itulah sebabnya file fansub sering membawa catatan penerjemah dalam kurung kurawal.

Baris yang dimulai dengan Comment: menggunakan kolom yang sama, tetapi menurut panduan libass "tidak ada yang akan ditampilkan di layar."

Apa yang Kami Uji

Kami menulis sample-source.ass, sebuah adegan 14-peristiwa yang berlatar di toko buku, dengan satu contoh dari setiap fitur di atas: huruf miring, jeda keras, koma dalam dialog, catatan kurung kurawal, baris komentar, tanda berposisi, kotak vektor, fade, spasi keras, perubahan warna dengan \r, jeda lunak, efek Banner yang bergulir, dan baris karaoke enam suku kata.

Lalu kami meminta model lokal untuk menerjemahkannya ke bahasa Mandarin Sederhana dengan tiga cara:

  1. Seluruh file. Tempel seluruh file .ass dan minta file terjemahan kembali.
  2. Hanya teks. Kirim hanya kolom Text dari setiap baris dialog sebagai JSON, dengan tag di dalamnya, dan instruksi untuk mempertahankan setiap blok {...} dan setiap \N, \n, dan \h.
  3. Terlindungi. Sama, tetapi ganti setiap blok kurung kurawal dan kode baris dengan placeholder bernomor terlebih dahulu, lalu kembalikan yang asli setelahnya.

Dalam kondisi kedua dan ketiga, skrip tidak pernah mengirim gambar vektor atau baris komentar ke model, jadi baris-baris itu hanya bisa rusak dalam kondisi seluruh file.

Modelnya adalah Qwen 3.6 27B (Q4_K_M) di LM Studio 0.4.8 pada Apple M4 Max dengan memori 64 GB, dengan thinking dimatikan dan temperature 0,3. Kami menjalankan setiap kondisi tiga kali, total sembilan kali. Percobaan pertama pada putaran ketiga berakhir ketika server lokal memutus koneksi, jadi kami memulainya ulang dan menjalankan putaran ketiga lagi. Skripnya adalah run_llm_ass_test.py, dan kesembilan output diterbitkan tanpa diedit bersamanya; README mencantumkan setiap file. Jika Anda belum pernah menyiapkan model lokal, panduan terjemahan LLM lokal kami mencakup pengaturannya.

Ini adalah uji kecil dari satu model, satu pasangan bahasa, dan satu sampel. Ini menunjukkan masalah apa yang terjadi dan cara menangkapnya. Ini tidak memberi peringkat pada alat atau prompt.

Hasil: Mesinnya Bertahan; Asumsi Bahasa Inggrisnya Tidak

Kami memeriksa setiap output dengan check_ass_translation.py. Output lengkapnya ada di check-results.txt, dan results.csv memiliki satu baris per eksekusi, termasuk masalah yang tidak dapat dilihat oleh skrip.

PeriksaSeluruh fileHanya teksTerlindungi
Waktu, gaya, dan kolom 1–9 tidak berubah3 dari 33 dari 33 dari 3
Tag override tidak berubah3 dari 32 dari 33 dari 3
Baris gambar dan komentar tidak disentuh3 dari 33 dari 33 dari 3
Font gaya mampu menggambar terjemahan0 dari 30 dari 30 dari 3
\h dan \n dibiarkan sebagai celah dalam teks Tionghoa3 dari 33 dari 33 dari 3
Semua tag karaoke dipertahankan, masing-masing dengan teks3 dari 30 dari 31 dari 3

Dua hasil mengejutkan kami. Menempelkan seluruh file menjaga struktur tetap utuh di ketiga percobaan, meskipun pada dua di antaranya baris Title di header juga ikut diterjemahkan. Dan prompt yang hanya berisi teks, yang terdengar lebih aman, justru menghasilkan satu-satunya tag yang rusak. Dalam satu percobaan, ia mengembalikan {\k25}翻{\k30}页,{\k45}开{\k60}灯 untuk baris dengan enam tag karaoke. Dua tag terakhir dan 1,20 detik waktu sorot hilang, sehingga sorotan akan berakhir jauh sebelum baris selesai. Percobaan yang sama mengubah Room\h12 is upstairs. menjadi 12\h12号房间在楼上。, dengan nomor kamar muncul dua kali.

Jadi pelajaran yang berguna bukanlah "gunakan prompt X." Melainkan bahwa kerusakan struktural yang Anda khawatirkan mudah dideteksi, dan kerusakan yang benar-benar lolos di kesembilan percobaan terletak di tiga tempat yang tidak dibahas oleh halaman alat untuk terjemahan ASS.

1. Font tidak dapat menggambar bahasa baru

Gaya pada sampel menggunakan Trebuchet MS untuk dialog dan Georgia untuk tanda, yang normal untuk rilis berbahasa Inggris. Tidak ada font yang mengandung karakter Tionghoa. Saat kami mengarahkan uji glyph pemeriksa ke dua file font tersebut, semua 12 peristiwa teks yang diterjemahkan di setiap percobaan gagal:

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

Pemutar mungkin mengganti dengan font lain yang terpasang, jadi subtitle mungkin masih muncul, tetapi rilis tidak lagi mengontrol tampilannya, dan penonton yang sistemnya tidak memiliki font yang sesuai mungkin melihat kotak kosong. Perbaikannya adalah mengedit field Fontname pada setiap gaya secara sengaja. Saat kami mengubah ketiga gaya dalam satu keluaran menjadi Hiragino Sans GB, font Tionghoa yang disertakan dengan macOS, dan menjalankan uji glyph terhadap font tersebut, kesalahan glyph menjadi nol.

Pilih font yang benar-benar dimiliki penonton Anda, atau sertakan font tersebut bersama video. Panduan libass menyatakan bahwa rilis harus melampirkan setiap font yang digunakan, sebaiknya ke dalam kontainer MKV. Karena font bahasa target baru, melampirkannya kini menjadi bagian dari pekerjaan terjemahan.

2. Kode spasi membawa kebiasaan bahasa Inggris

Room\h12 merekatkan "Room" ke "12" agar tidak pernah terpisah antar baris. Dalam bahasa Tionghoa, kata-kata tidak dipisahkan oleh spasi, tetapi setiap percobaan tetap menempatkan \h di suatu tempat: lima percobaan menempatkannya di antara 12号房间 dan 在楼上, tiga menempatkannya sebelum angka, dan satu menempatkannya di antara dua salinan angka. Bagaimanapun, penonton melihat spasi yang tidak semestinya. Wait\nhere. memiliki masalah yang sama. Dengan WrapStyle: 0, \n dirender sebagai spasi, sehingga 在\n这里等 menunjukkan celah di tengah kalimat tiga kata.

Strukturnya di sini baik-baik saja; bahasanya tidak. Untuk bahasa target tanpa spasi antar kata, hapus \h dan \n dari teks terjemahan. Pertahankan \N hanya di tempat Anda menginginkan jeda paksa, dan letakkan di titik alami dalam kalimat target. Pemeriksa melaporkan perubahan jumlah \h dan \n sebagai peringatan, bukan kesalahan, karena alasan ini, dan ia memperingatkan ketika salah satunya bertahan di dalam teks Tionghoa, Jepang, atau Korea.

3. Waktu karaoke milik kata-kata asli

Baris karaoke {\k25}Turn {\k30}the {\k45}page, {\k60}turn {\k40}the {\k80}light mengatur waktu setiap suku kata bahasa Inggris sesuai lagu. Terjemahan tidak dapat mempertahankan waktu itu secara bermakna, karena kata-kata Tionghoa tidak jatuh pada ketukan yang sama. Percobaan kami menunjukkan berbagai cara kesalahannya:

  • Dalam empat percobaan, keenam tag dipertahankan, masing-masing pada kata yang berbeda dari sebelumnya. Salah satunya berakhir dengan {\k40}打{\k80}开, "buka", dan menghilangkan "light" dari baris sepenuhnya.
  • Dalam empat percobaan, satu suku kata tidak menyorot apa pun, seperti 打开{\k40}{\k80}灯 (0,40 detik sorotan pada suku kata kosong). Dalam dua di antaranya, suku kata 0,45 detik juga hanya menyorot koma.
  • Dalam satu percobaan, dua tag menghilang, seperti dijelaskan di atas.

Pemeriksa menandai baris karaoke yang diterjemahkan di tempat dan suku kata apa pun yang dibiarkan tanpa teks. Perbaikan yang lebih baik bersifat editorial: jangan terjemahkan karaoke di tempat. Pertahankan baris asli yang sudah diberi waktu untuk bernyanyi bersama, dan tambahkan terjemahan sebagai peristiwa terpisah: salin peristiwa karaoke, beri gaya sendiri (misalnya, lebih kecil dan ditempatkan di bagian bawah), hapus tag \k, dan terjemahkan teksnya. Atur ulang waktunya suku kata demi suku kata hanya jika Anda siap mengatur waktunya sendiri ke audio.

Alur Kerja yang Teruji

  1. Buat sumbernya terbaca terlebih dahulu. Jika file menampilkan karakter rusak, perbaiki pengodean sebelum hal lain. Panduan pengodean kami menggunakan contoh SRT, tetapi langkah-langkah tingkat byte yang sama berfungsi untuk file .ass dan menjaga byte asli tetap aman. Pemeriksa hanya membaca UTF-8 dan UTF-16.

  2. Tentukan cakupannya. Daftar gaya dan tentukan mana yang dialog, mana yang tanda di layar, dan mana yang karaoke. Tanda biasanya perlu diterjemahkan; karaoke biasanya perlu baris terpisah; komentar dan catatan kurung kurawal terserah Anda.

  3. Terjemahkan hanya field Text. Gunakan alat yang mengurai ASS daripada memperlakukannya sebagai teks biasa, atau lindungi tag sendiri seperti pada kondisi ketiga kami. Simpan file sumber di samping keluaran.

  4. Jalankan pemeriksaan struktural.

    python3 check_ass_translation.py source.ass translated.ass
    

    Ini membandingkan jumlah peristiwa, jenis peristiwa, field 1–9, nilai gaya, blok override, gambar, baris komentar, \N, suku kata dan durasi karaoke, serta baris yang kembali kosong atau tidak berubah. Ini tidak menilai kualitas terjemahan.

  5. Perbaiki font secara sengaja. Ubah Fontname di setiap gaya yang kini memuat teks bahasa target, lalu jalankan uji glyph terhadap berkas font yang akan Anda distribusikan:

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

    Nama font yang berubah akan muncul sebagai peringatan, sehingga Anda dapat memastikan setiap perubahan memang disengaja.

  6. Bersihkan kode spasi dan karaoke seperti dijelaskan di atas.

  7. Periksa dengan video. Buka berkas di Aegisub atau pemutar Anda. Pastikan tanda masih pas dengan bentuk yang digambar di belakangnya, karena kotak \p mempertahankan ukuran bahasa Inggrisnya sementara tanda terjemahan bisa jauh lebih panjang atau lebih pendek. Periksa juga apakah baris terlalu panjang untuk durasi tampilnya. Kedua masalah ini tidak terlihat di dalam berkas itu sendiri.

Posisi BookTranslator

Penerjemah Subtitle BookTranslator menerima berkas SRT, VTT, ASS, dan SSA. Menurut halaman produk, ia mempertahankan stempel waktu dan urutan cue serta menjaga gaya ASS dan SSA yang didukung tetap melekat pada setiap entri subtitle, sehingga Anda tidak perlu mengekstrak dan memasukkan kembali teksnya sendiri. Ia menerjemahkan dialog dengan baris di sekitarnya sebagai konteks, yang membantu untuk nama dan lelucon berulang di seluruh episode.

Kami tidak menjalankan sampel ini melalui BookTranslator untuk artikel ini. Apa pun alat yang Anda gunakan, jalankan langkah 4 hingga 7 pada hasilnya. Gaya yang mempertahankan font bahasa Inggrisnya tetap merupakan gaya yang tidak dapat menggambar aksara Tionghoa, dan karaoke yang diterjemahkan di tempat tetap memerlukan keputusan editorial. Untuk sisa alur kerja subtitle, lihat panduan terjemahan subtitle AI kami, perbandingan perangkat lunak terjemahan subtitle kami, dan, jika terjemahan Anda akan diunggah ke YouTube, alur kerja subtitle YouTube.

Kapan Sebaiknya Mengonversi ke SRT

Mengonversi ASS ke SRT sebelum menerjemahkan akan menghilangkan gaya, posisi, gambar, dan karaoke, yang juga menghilangkan sebagian besar masalah di atas. Itu adalah pertukaran yang wajar jika tujuan Anda hanya menampilkan subtitle biasa, atau jika gaya memang tidak pernah penting bagi rilis tersebut. Itu adalah pertukaran yang salah untuk rilis anime dan musik yang tanda dan karaokenya merupakan bagian dari karya. Putuskan berdasarkan di mana berkas akan ditampilkan, bukan berdasarkan format mana yang lebih mudah diterjemahkan.

Dapatkan Berkas Uji

Semua dari uji ini bebas digunakan kembali:

Artikel Terkait