BookTranslator
BookTranslator

كيفية ترجمة ترجمات ASS/SSA دون إفساد الأنماط أو المواضع أو الكاريوكي

ترجم فقط الحوار المرئي في ملف .ass، ثم تحقق من التوقيت والوسوم والكاريوكي والخطوط. مع ملف نموذجي وأداة فحص مجانية واختبار محلي لنموذج لغوي كبير من 9 جولات.

BookTranslator

BookTranslator Team

11 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، يحتوي على أي شيء يقرأه المشاهد. يشير دليل تنسيق ملف ASS لمشروع libass إلى أن هذا الحقل الأخير "يُسمح له أن يحتوي على فواصل"، ولهذا فإن التقسيم غير الحذر عند كل فاصلة يكسر سطرًا مثل 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. محمي. نفس الشيء، لكن استبدل كل كتلة أقواس معقوفة ورمز سطر بعنصر نائب مرقّم أولًا، ثم أعد الأصل afterwards.

في الشرطين الثاني والثالث، لا يرسل النص البرمجي أبدًا الرسم المتجه أو سطر التعليق إلى النموذج، لذا يمكن أن تتضرر تلك الأسطر فقط في شرط الملف كاملًا.

كان النموذج Qwen 3.6 27B (Q4_K_M) في LM Studio 0.4.8 على Apple M4 Max بذاكرة 64 جيجابايت، مع إيقاف التفكير ودرجة حرارة 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 من 32 من 33 من 3
أسطر الرسم والتعليقات دون مساس3 من 33 من 33 من 3
خطوط الأنماط قادرة على رسم الترجمة0 من 30 من 30 من 3
\h و \n متروكان كفراغات في النص الصيني3 من 33 من 33 من 3
جميع وسوم الكاريوكي محفوظة، كل منها مع نص3 من 30 من 31 من 3

فاجأتنا نتيجتان. لصق الملف كاملاً حافظ على البنية سليمة في التجارب الثلاث، رغم أنه في اثنتين منها ترجم أيضاً سطر 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}开، أي "open"، وأسقطت "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 على النتيجة. النمط الذي يحتفظ بخطه الإنجليزي يظل نمطًا لا يمكنه رسم الأحرف الصينية، والكاريوكي المترجم في مكانه لا يزال يحتاج إلى قرار تحريري. لبقية سير عمل الترجمة الفرعية، راجع دليل ترجمة الترجمة الفرعية بالذكاء الاصطناعي، ومقارنتنا لبرامج ترجمة الترجمة الفرعية، وإذا كانت ترجمتك متجهة إلى 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.

مقالات ذات صلة