BookTranslator
BookTranslator

शैलियों, स्थितियों या कराओके को बिगाड़े बिना ASS/SSA सबटाइटल का अनुवाद कैसे करें

.ass फ़ाइल में केवल दिखने वाले संवाद का अनुवाद करें, फिर समय, टैग, कराओके और फ़ॉन्ट जाँचें। एक नमूना फ़ाइल, एक मुफ़्त चेकर और 9-रन वाले स्थानीय LLM परीक्षण के साथ।

BookTranslator

BookTranslator Team

14 min read

ASS या SSA सबटाइटल फ़ाइल एक छोटा प्रोग्राम है: एक हेडर, शैलियों की एक तालिका, और समयबद्ध इवेंट्स की एक सूची जिसका अंतिम फ़ील्ड संवाद को फ़ॉर्मेटिंग कोड के साथ मिलाता है। इसका अनुवाद करने के लिए, उस अंतिम फ़ील्ड में केवल पढ़ने योग्य शब्दों को बदलें, बाकी सब कुछ बाइट-दर-बाइट वैसा ही छोड़ दें, और फिर तीन चीज़ें जाँचें जिन्हें कोई भी अनुवाद उपकरण आपके लिए ठीक नहीं करता: फ़ॉन्ट, स्पेसिंग कोड और कराओके पंक्तियाँ।

हमने एक स्थानीय मॉडल का उपयोग करके 14-इवेंट वाले नमूने का नौ बार सरलीकृत चीनी में अनुवाद किया, तीन अलग-अलग प्रॉम्प्ट्स का उपयोग किया, और हर परिणाम को अपने लिखे एक स्क्रिप्ट से जाँचा। समय, स्थितियाँ, रंग, टिप्पणियाँ और चित्र सभी नौ में बचे रहे। जो टूटा वह फ़ाइल के उन हिस्सों में था जो अंग्रेज़ी मानते हैं: सभी नौ में, शैली के फ़ॉन्ट में चीनी अक्षर नहीं थे, इसलिए फ़ाइल फ़ॉन्ट बदलने के लिए प्लेयर पर निर्भर होती, और अंग्रेज़ी पंक्ति का एक हार्ड स्पेस चीनी में एक दिखाई देने वाला अंतराल बन गया। कराओके पंक्ति हर रन में गलत शब्दों पर समय के साथ वापस आई, और चार रन में कुछ अक्षरों ने कुछ भी हाइलाइट नहीं किया।

त्वरित उत्तर: क्या अनुवाद करें और क्या अकेला छोड़ दें

फ़ाइल का भागहमारे नमूने से उदाहरणइसका अनुवाद करें?
[Script Info] हेडरPlayResX: 1920, WrapStyle: 0नहीं। स्थितियाँ इन मानों से गणना की जाती हैं।
[V4+ Styles]Style: Default,Trebuchet MS,64,...नहीं, फ़ॉन्ट नाम के अलावा, जिसे आपको जानबूझकर बदलना पड़ सकता है
इवेंट फ़ील्ड 1–90,0:00:01.00,0:00:03.20,Default,Jun,0,0,0,नहीं। ये लेयर, समय, शैली, वक्ता, मार्जिन और प्रभाव हैं।
ओवरराइड ब्लॉक{\i1}, {\an8\pos(960,120)}, {\k25}नहीं
चित्र{\p1}m 0 0 l 200 0 200 60 0 60{\p0}नहीं। यह एक वेक्टर आकार है, पाठ नहीं।
Comment: इवेंट्सComment: ...,Earlier draft: Try the stacks.वैकल्पिक। टिप्पणियाँ कभी स्क्रीन पर नहीं दिखतीं।
ब्रेस नोट्स{TL note: "stacks" means the closed shelves}वैकल्पिक। प्लेयर इन्हें अनदेखा करते हैं।
दिखने वाला संवादDid you find the second volume?हाँ
लाइन कोड\N, \n, \h\N को वैसे ही रखें। \n और \h के लिए हर मामले में अलग-अलग फैसला लें।

इस गाइड का बाकी हिस्सा बताता है कि हर पंक्ति क्यों मायने रखती है और परिणाम को कैसे जाँचें।

ASS पंक्ति कैसे बनती है

[Events] अनुभाग की हर पंक्ति ठीक उसके ऊपर घोषित प्रारूप का पालन करती है:

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.

केवल दसवाँ फ़ील्ड, Text, में कुछ ऐसा होता है जो दर्शक पढ़ता है। libass परियोजना की ASS फ़ाइल प्रारूप गाइड बताती है कि यह अंतिम फ़ील्ड "अल्पविरामों को शामिल कर सकता है", इसलिए हर अल्पविराम पर लापरवाही से विभाजन करने से Well, if it's there, then, we go now. जैसी पंक्ति टूट जाती है। एक सुरक्षित टूल केवल पहले नौ अल्पविरामों पर विभाजन करता है।

Text के अंदर, घुंघराले ब्रेसिज़ में जो कुछ भी है वह एक ओवरराइड ब्लॉक है। Aegisub का ओवरराइड टैग संदर्भ उन कोडों को परिभाषित करता है जो आपको सबसे अधिक मिलेंगे:

  • \N हर रैप मोड में एक पंक्ति विराम लागू करता है। \n केवल रैप मोड 2 में पंक्ति तोड़ता है और अन्यथा एक स्थान है। \h एक अटूट स्थान है।
  • \an8 संख्यात्मक-कीपैड लेआउट का उपयोग करके संरेखण सेट करता है, इसलिए 8 शीर्ष केंद्र है। \pos(960,120) पंक्ति को स्क्रिप्ट निर्देशांक पर रखता है।
  • \k25 एक कराओके शब्दांश है; अवधि सेंटीसेकंड में होती है, इसलिए 25 का अर्थ एक चौथाई सेकंड है।
  • \p1 के बाद, पाठ "को ड्राइंग निर्देशों के रूप में व्याख्यायित किया जाएगा", इसलिए जो अनुवादक m 0 0 l 200 0 का "अनुवाद" करता है वह एक आकृति को नष्ट कर देता है।
  • ब्रेसिज़ के अंदर अपरिचित पाठ "चुपचाप अनदेखा कर दिया जाता है", इसलिए फैनसब फ़ाइलों में अक्सर ब्रेसिज़ में अनुवादक नोट्स होते हैं।

Comment: से शुरू होने वाली पंक्तियाँ समान फ़ील्ड का उपयोग करती हैं, लेकिन libass गाइड के अनुसार "स्क्रीन पर कुछ भी प्रदर्शित नहीं होगा।"

हमने क्या परखा

हमने sample-source.ass लिखा, जो एक किताबों की दुकान में सेट किया गया 14-इवेंट दृश्य है, जिसमें ऊपर दी गई प्रत्येक सुविधा का एक उदाहरण है: इटैलिक्स, एक हार्ड ब्रेक, संवाद में अल्पविराम, एक ब्रेस नोट, एक टिप्पणी पंक्ति, एक स्थित चिह्न, एक वेक्टर बॉक्स, एक फेड, एक हार्ड स्पेस, \r के साथ रंग परिवर्तन, एक सॉफ्ट ब्रेक, एक स्क्रॉलिंग Banner प्रभाव, और एक छह-शब्दांश कराओके पंक्ति।

फिर हमने एक स्थानीय मॉडल से इसे तीन तरीकों से सरलीकृत चीनी में अनुवाद करने के लिए कहा:

  1. पूरी फ़ाइल। पूरी .ass फ़ाइल पेस्ट करें और अनुवादित फ़ाइल वापस माँगें।
  2. केवल पाठ। प्रत्येक संवाद पंक्ति के केवल Text फ़ील्ड को JSON के रूप में भेजें, टैग इनलाइन रखें, और निर्देश दें कि हर {...} ब्लॉक और हर \N, \n, और \h को बनाए रखें।
  3. संरक्षित। वही, लेकिन पहले हर ब्रेस ब्लॉक और लाइन कोड को एक क्रमांकित प्लेसहोल्डर से बदलें, और बाद में मूल को वापस रखें।

दूसरी और तीसरी स्थितियों में स्क्रिप्ट कभी भी वेक्टर ड्राइंग या टिप्पणी पंक्ति को मॉडल को नहीं भेजती, इसलिए वे पंक्तियाँ केवल पूरी-फ़ाइल स्थिति में ही क्षतिग्रस्त हो सकती थीं।

मॉडल Qwen 3.6 27B (Q4_K_M) था, LM Studio 0.4.8 में, Apple M4 Max पर 64 GB मेमोरी के साथ, सोच बंद और तापमान 0.3 पर। हमने प्रत्येक स्थिति को तीन बार चलाया, कुल नौ रन। तीसरे रन का पहला प्रयास तब समाप्त हुआ जब स्थानीय सर्वर ने कनेक्शन छोड़ दिया, इसलिए हमने इसे पुनः आरंभ किया और तीसरा दौर फिर से चलाया। स्क्रिप्ट run_llm_ass_test.py है, और सभी नौ आउटपुट इसके साथ बिना संपादन के प्रकाशित हैं; README में हर फ़ाइल सूचीबद्ध है। यदि आपने कभी स्थानीय मॉडल सेट नहीं किया है, तो हमारी स्थानीय LLM अनुवाद गाइड सेटिंग्स को कवर करती है।

यह एक मॉडल, एक भाषा युग्म और एक नमूने का छोटा परीक्षण था। यह दिखाता है कि कौन सी समस्याएँ होती हैं और उन्हें कैसे पकड़ा जाए। यह टूल या प्रॉम्प्ट को रैंक नहीं करता।

परिणाम: मशीनरी बच गई; अंग्रेज़ी धारणाएँ नहीं बचीं

हमने हर आउटपुट को check_ass_translation.py से जाँचा। पूरा आउटपुट check-results.txt में है, और results.csv में प्रति रन एक पंक्ति है, जिसमें वे समस्याएँ भी शामिल हैं जो स्क्रिप्ट नहीं देख सकती।

जाँचपूरी फ़ाइलकेवल टेक्स्टसुरक्षित
टाइमिंग, स्टाइल और फ़ील्ड 1–9 अपरिवर्तित3 में से 33 में से 33 में से 3
ओवरराइड टैग अपरिवर्तित3 में से 33 में से 23 में से 3
ड्रॉइंग और कमेंट लाइनें अछूती3 में से 33 में से 33 में से 3
स्टाइल फ़ॉन्ट जो अनुवाद खींच सकें3 में से 03 में से 03 में से 0
चीनी टेक्स्ट में \h और \n अंतराल के रूप में छोड़े गए3 में से 33 में से 33 में से 3
सभी कराओके टैग रखे गए, प्रत्येक में टेक्स्ट3 में से 33 में से 03 में से 1

दो परिणामों ने हमें चौंकाया। पूरी फ़ाइल पेस्ट करने से तीनों रन में संरचना बरकरार रही, हालाँकि उनमें से दो में हेडर की Title पंक्ति का भी अनुवाद हो गया। और केवल-पाठ वाला प्रॉम्प्ट, जो अधिक सुरक्षित लगता है, एकमात्र टूटे हुए टैग उत्पन्न किए। एक रन में छह कराओके टैग वाली पंक्ति के लिए इसने {\k25}翻{\k30}页,{\k45}开{\k60}灯 लौटाया। अंतिम दो टैग और 1.20 सेकंड की हाइलाइट टाइमिंग गायब हो गई, इसलिए हाइलाइट पंक्ति से काफी पहले समाप्त हो जाती। उसी रन ने Room\h12 is upstairs. को 12\h12号房间在楼上。 में बदल दिया, कमरे का नंबर दो बार आ गया।

तो उपयोगी सबक "प्रॉम्प्ट X का उपयोग करें" नहीं है। यह है कि जिस संरचनात्मक क्षति से आप डरते हैं उसे पकड़ना आसान है, और जो क्षति वास्तव में सभी नौ रन में पार हो गई वह तीन जगहों पर है जिन पर ASS अनुवाद के टूल पेज चर्चा नहीं करते।

1. फ़ॉन्ट नई भाषा नहीं खींच सकते

नमूने की शैलियाँ संवाद के लिए Trebuchet MS और साइन के लिए Georgia का उपयोग करती हैं, जो अंग्रेज़ी रिलीज़ के लिए सामान्य है। दोनों फ़ॉन्ट में चीनी अक्षर नहीं हैं। जब हमने चेकर के ग्लिफ़ परीक्षण को दोनों फ़ॉन्ट फ़ाइलों पर लागू किया, तो हर रन में सभी 12 अनुवादित टेक्स्ट इवेंट विफल रहे:

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

एक प्लेयर कुछ अन्य इंस्टॉल किया गया फ़ॉन्ट प्रतिस्थापित कर सकता है, इसलिए सबटाइटल अभी भी दिख सकता है, लेकिन रिलीज़ अब यह नियंत्रित नहीं करती कि यह कैसा दिखता है, और जिस दर्शक के सिस्टम में उपयुक्त फ़ॉन्ट नहीं है उसे खाली बॉक्स दिख सकते हैं। समाधान प्रत्येक शैली के Fontname फ़ील्ड में जानबूझकर संपादन है। जब हमने एक आउटपुट में सभी तीन शैलियों को Hiragino Sans GB में बदला, जो macOS के साथ आने वाला चीनी फ़ॉन्ट है, और उस फ़ॉन्ट के विरुद्ध ग्लिफ़ परीक्षण चलाया, तो ग्लिफ़ त्रुटियाँ शून्य हो गईं।

ऐसा फ़ॉन्ट चुनें जो आपके दर्शकों के पास वास्तव में हो, या इसे वीडियो के साथ भेजें। libass गाइड कहता है कि रिलीज़ को अपने द्वारा उपयोग किए गए प्रत्येक फ़ॉन्ट को संलग्न करना चाहिए, अधिमानतः MKV कंटेनर में। चूँकि लक्ष्य-भाषा फ़ॉन्ट नया है, अब इसे संलग्न करना अनुवाद कार्य का हिस्सा है।

2. स्पेसिंग कोड अंग्रेज़ी आदतें लेकर चलते हैं

Room\h12 "Room" को "12" से जोड़ता है ताकि वे कभी पंक्तियों में न टूटें। चीनी में शब्द स्पेस से अलग नहीं होते, लेकिन हर रन ने \h को कहीं न कहीं रखा: पाँच रन ने इसे 12号房间 और 在楼上 के बीच रखा, तीन ने संख्या से पहले रखा, और एक ने संख्या की दो प्रतियों के बीच रखा। किसी भी तरह, दर्शक को एक अनावश्यक स्पेस दिखता है। Wait\nhere. में भी यही समस्या थी। WrapStyle: 0 के साथ, \n एक स्पेस के रूप में प्रस्तुत होता है, इसलिए 在\n这里等 तीन-शब्द वाले वाक्य के बीच में एक अंतराल दिखाता है।

यहाँ संरचना ठीक है; भाषा नहीं। जिस लक्ष्य भाषा में शब्दों के बीच स्पेस नहीं होते, उसके लिए अनुवादित पाठ से \h और \n हटा दें। \N केवल वहाँ रखें जहाँ आप जबरन ब्रेक चाहते हैं, और इसे लक्ष्य वाक्य में एक स्वाभाविक स्थान पर रखें। चेकर इस कारण से बदले गए \h और \n गणनाओं को त्रुटियों के बजाय चेतावनियों के रूप में रिपोर्ट करता है, और यह चेतावनी देता है जब कोई चीनी, जापानी या कोरियाई पाठ के भीतर बच जाता है।

3. कराओके टाइमिंग मूल शब्दों की है

कराओके पंक्ति {\k25}Turn {\k30}the {\k45}page, {\k60}turn {\k40}the {\k80}light प्रत्येक अंग्रेज़ी शब्दांश को गीत के साथ समयबद्ध करती है। कोई अनुवाद उस टाइमिंग को सार्थक रूप से नहीं रख सकता, क्योंकि चीनी शब्द समान बीट पर नहीं पड़ते। हमारे रन गलत होने के विभिन्न तरीके दिखाते हैं:

  • चार रन में सभी छह टैग रखे गए, प्रत्येक पहले से भिन्न शब्द पर। उनमें से एक {\k40}打{\k80}开, "खोलना", के साथ समाप्त हुआ और पंक्ति से "light" पूरी तरह गायब कर दिया।
  • चार रन में एक शब्दांश ने कुछ भी हाइलाइट नहीं किया, जैसे 打开{\k40}{\k80}灯 (खाली शब्दांश पर 0.40 सेकंड का हाइलाइट)। उनमें से दो में, 0.45-सेकंड के शब्दांश ने केवल एक अल्पविराम हाइलाइट किया।
  • एक रन में दो टैग गायब हो गए, जैसा ऊपर वर्णित है।

चेकर स्थान पर अनुवादित कराओके पंक्ति और बिना पाठ वाले किसी भी शब्दांश को चिह्नित करता है। बेहतर समाधान संपादकीय है: कराओके का स्थान पर अनुवाद न करें। साथ गाने के लिए मूल समयबद्ध पंक्ति रखें, और अनुवाद को एक अलग इवेंट के रूप में जोड़ें: कराओके इवेंट की प्रतिलिपि बनाएँ, उसे अपनी शैली दें (उदाहरण के लिए, छोटा और नीचे रखा गया), \k टैग हटाएँ, और पाठ का अनुवाद करें। इसे शब्दांश-दर-शब्दांश केवल तब पुनः समयबद्ध करें जब आप स्वयं ऑडियो के अनुसार समयबद्ध करने के लिए तैयार हों।

एक वर्कफ़्लो जो टिकता है

  1. पहले स्रोत को पठनीय बनाएँ। यदि फ़ाइल में विकृत अक्षर दिखते हैं, तो कुछ और करने से पहले एन्कोडिंग ठीक करें। हमारी एन्कोडिंग गाइड SRT उदाहरणों का उपयोग करती है, लेकिन वही बाइट-स्तरीय चरण .ass फ़ाइल के लिए भी काम करते हैं और मूल बाइट्स को सुरक्षित रखते हैं। चेकर केवल UTF-8 और UTF-16 पढ़ता है।

  2. दायरा तय करें। शैलियों की सूची बनाएँ और तय करें कि कौन सी संवाद हैं, कौन सी ऑन-स्क्रीन साइन हैं, और कौन सी कराओके हैं। साइन को आमतौर पर अनुवाद की आवश्यकता होती है; कराओके को आमतौर पर एक अलग पंक्ति की आवश्यकता होती है; टिप्पणियाँ और ब्रेस नोट्स आपके निर्णय के लिए हैं।

  3. केवल Text फ़ील्ड का अनुवाद करें। ऐसा टूल उपयोग करें जो ASS को पार्स करता है न कि उसे सादे पाठ के रूप में मानता है, या हमारी तीसरी शर्त की तरह स्वयं टैग की सुरक्षा करें। स्रोत फ़ाइल को आउटपुट के पास रखें।

  4. संरचनात्मक जाँच चलाएँ।

    python3 check_ass_translation.py source.ass translated.ass
    

    यह इवेंट गणना, इवेंट प्रकार, फ़ील्ड 1–9, शैली मान, ओवरराइड ब्लॉक, चित्र, टिप्पणी पंक्तियाँ, \N, कराओके शब्दांश और अवधि, और खाली या अपरिवर्तित लौटी पंक्तियों की तुलना करता है। यह अनुवाद गुणवत्ता का निर्णय नहीं करता।

  5. फ़ॉन्ट्स को जानबूझकर ठीक करें। प्रत्येक स्टाइल में Fontname बदलें जिसमें अब लक्ष्य-भाषा का टेक्स्ट है, फिर उस फ़ॉन्ट फ़ाइल के विरुद्ध ग्लिफ़ परीक्षण चलाएँ जिसे आप शिप करेंगे:

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

    बदला हुआ फ़ॉन्ट नाम चेतावनी के रूप में दिखाई देता है, ताकि आप पुष्टि कर सकें कि प्रत्येक परिवर्तन जानबूझकर किया गया था।

  6. स्पेसिंग कोड और कराओके को साफ़ करें जैसा ऊपर बताया गया है।

  7. इसे वीडियो के साथ देखें। फ़ाइल को Aegisub या अपने प्लेयर में खोलें। जाँचें कि साइन अभी भी उन आकृतियों में फ़िट बैठते हैं जो उनके पीछे बनाई गई हैं, क्योंकि एक \p बॉक्स अपना अंग्रेज़ी आकार बनाए रखता है जबकि अनुवादित साइन बहुत लंबा या छोटा हो सकता है। जाँचें कि पंक्तियाँ स्क्रीन पर अपने समय के लिए बहुत लंबी नहीं हैं। दोनों में से कोई भी समस्या फ़ाइल में ही दिखाई नहीं देती।

BookTranslator कहाँ फ़िट बैठता है

BookTranslator का सबटाइटल ट्रांसलेटर SRT, VTT, ASS, और SSA फ़ाइलें स्वीकार करता है। उत्पाद पृष्ठ के अनुसार, यह टाइमस्टैम्प और क्यू क्रम बनाए रखता है और समर्थित ASS और SSA स्टाइलिंग को प्रत्येक सबटाइटल प्रविष्टि से जोड़े रखता है, ताकि आपको टेक्स्ट को स्वयं निकालकर फिर से डालना न पड़े। यह संवाद का अनुवाद आसपास की पंक्तियों को संदर्भ के रूप में लेकर करता है, जो पूरे एपिसोड में नामों और चल रहे मज़ाकों में मदद करता है।

हमने इस लेख के लिए इस नमूने को BookTranslator के माध्यम से नहीं चलाया। आप जो भी टूल उपयोग करें, परिणाम पर चरण 4 से 7 चलाएँ। जो स्टाइल अपना अंग्रेज़ी फ़ॉन्ट बनाए रखता है, वह अभी भी ऐसा स्टाइल है जो चीनी नहीं खींच सकता, और जगह पर अनुवादित कराओके को अभी भी संपादकीय निर्णय की आवश्यकता होती है। शेष सबटाइटल वर्कफ़्लो के लिए, हमारी AI सबटाइटल अनुवाद गाइड, हमारी सबटाइटल अनुवाद सॉफ़्टवेयर की तुलना, और, यदि आपका अनुवाद YouTube पर जा रहा है, तो YouTube सबटाइटल वर्कफ़्लो देखें।

इसके बजाय SRT में कब कन्वर्ट करें

अनुवाद से पहले ASS को SRT में कन्वर्ट करने से स्टाइल, स्थितियाँ, चित्र और कराओके हट जाते हैं, जिससे ऊपर की अधिकांश समस्याएँ भी हट जाती हैं। यह एक उचित सौदा है यदि आपका गंतव्य केवल सादे सबटाइटल दिखाता है, या यदि स्टाइलिंग रिलीज़ के लिए कभी महत्वपूर्ण नहीं थी। यह एनीमे और संगीत रिलीज़ के लिए गलत सौदा है जहाँ साइन और कराओके काम का हिस्सा हैं। फ़ाइल कहाँ दिखाई जाएगी, इसके आधार पर निर्णय लें, न कि इस आधार पर कि कौन सा प्रारूप अनुवाद करना आसान है।

परीक्षण फ़ाइलें प्राप्त करें

इस परीक्षण की सभी चीज़ें पुन: उपयोग के लिए निःशुल्क हैं:

  • sample-source.ass: 14-इवेंट वाला अंग्रेज़ी नमूना;
  • check_ass_translation.py: चेकर (Python मानक लाइब्रेरी; --font परीक्षण के लिए fontTools आवश्यक है);
  • run_llm_ass_test.py: किसी भी OpenAI-संगत स्थानीय सर्वर के लिए तीन प्रॉम्प्ट शर्तें;
  • results.csv और check-results.txt: प्रति-रन परिणाम;
  • README.txt: फ़ाइल सूची और परीक्षण सेटिंग्स, जिसमें outputs फ़ोल्डर में नौ असंपादित आउटपुट हैं।

संबंधित लेख