BookTranslator
BookTranslator

چگونه زیرنویس‌های ASS/SSA را بدون خراب کردن استایل‌ها، موقعیت‌ها یا کارائوکه ترجمه کنیم

فقط دیالوگ‌های قابل مشاهده در یک فایل .ass را ترجمه کنید، سپس زمان‌بندی، تگ‌ها، کارائوکه و فونت‌ها را بررسی کنید. با یک فایل نمونه، یک بررسی‌کننده رایگان و یک آزمون ۹ مرحله‌ای با مدل زبانی محلی.

BookTranslator

BookTranslator Team

14 min read

یک فایل زیرنویس ASS یا SSA یک برنامه کوچک است: یک سرآیند، جدولی از استایل‌ها، و فهرستی از رویدادهای زمان‌بندی‌شده که آخرین فیلد آن‌ها دیالوگ را با کد قالب‌بندی ترکیب می‌کند. برای ترجمه آن، فقط کلمات خوانا در آن آخرین فیلد را تغییر دهید، همه چیز دیگر را بایت به بایت دست‌نخورده بگذارید، و سپس سه چیز را بررسی کنید که هیچ ابزار ترجمه‌ای برای شما درست نمی‌کند: فونت‌ها، کدهای فاصله‌گذاری، و خطوط کارائوکه.

ما یک نمونه ۱۴ رویدادی را نه بار با یک مدل محلی به چینی ساده‌شده ترجمه کردیم، با استفاده از سه پرامپت مختلف، و هر نتیجه را با اسکریپتی که نوشتیم بررسی کردیم. زمان‌بندی، موقعیت‌ها، رنگ‌ها، نظرات و ترسیم‌ها در هر نه بار سالم ماندند. آنچه خراب شد بخش‌هایی از فایل بود که انگلیسی را فرض می‌کنند: در هر نه بار، فونت‌های استایل هیچ کاراکتر چینی نداشتند، بنابراین فایل برای جایگزینی فونت به پخش‌کننده متکی می‌شد، و یک فاصله سخت از خط انگلیسی به یک شکاف قابل مشاهده در چینی تبدیل شد. خط کارائوکه در هر اجرا با زمان‌بندی اشاره‌شده به کلمات اشتباه برگشت، و در چهار اجرا برخی هجاها هیچ چیز را برجسته نکردند.

پاسخ سریع: چه چیزی را ترجمه کنیم و چه چیزی را رها کنیم

بخشی از فایلنمونه‌ای از فایل ماترجمه شود؟
سرآیند [Script Info]PlayResX: 1920, WrapStyle: 0خیر. موقعیت‌ها از این مقادیر محاسبه می‌شوند.
[V4+ Styles]Style: Default,Trebuchet MS,64,...خیر، به جز نام فونت که ممکن است لازم باشد عمداً تغییر دهید
فیلدهای ۱ تا ۹ رویداد0,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 فقط در حالت شکست ۲ خط را می‌شکند و در غیر این صورت یک فاصله است. \h یک فاصله غیرشکستنی است.
  • \an8 تراز را با چیدمان صفحه‌کلید عددی تنظیم می‌کند، بنابراین ۸ بالا-وسط است. \pos(960,120) خط را در مختصات اسکریپت قرار می‌دهد.
  • \k25 یک هجای کارائوکه است؛ مدت‌زمان‌ها بر حسب سانتی‌ثانیه هستند، بنابراین ۲۵ یعنی یک‌چهارم ثانیه.
  • پس از \p1، متن «به‌عنوان دستورالعمل‌های ترسیم تفسیر می‌شود»، بنابراین مترجمی که m 0 0 l 200 0 را «ترجمه» کند یک شکل را نابود می‌کند.
  • متن ناشناخته درون آکولاد «بی‌صدا نادیده گرفته می‌شود»، به همین دلیل فایل‌های فن‌ساب اغلب یادداشت‌های مترجم را در آکولاد دارند.

خطوطی که با Comment: شروع می‌شوند از همان فیلدها استفاده می‌کنند، اما طبق راهنمای libass «چیزی روی صفحه نمایش داده نمی‌شود.»

آنچه آزمایش کردیم

ما sample-source.ass را نوشتیم، صحنه‌ای ۱۴ رویدادی که در یک کتاب‌فروشی می‌گذرد، با یک نمونه از هر ویژگی بالا: ایتالیک، شکست سخت، ویرگول در دیالوگ، یادداشت آکولادی، خط توضیح، تابلوی موقعیت‌دار، جعبه برداری، محو شدن، فاصله سخت، تغییر رنگ با \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 با ۶۴ گیگابایت حافظه بود، با تفکر خاموش و دمای ۰.۳. هر شرایط را سه بار اجرا کردیم، در مجموع نه اجرا. اولین تلاش در اجرای سوم زمانی پایان یافت که سرور محلی اتصال را قطع کرد، بنابراین آن را دوباره راه‌اندازی کردیم و دور سوم را دوباره اجرا کردیم. اسکریپت run_llm_ass_test.py است، و هر نه خروجی ویرایش‌نشده در کنار آن منتشر شده‌اند؛ README همه فایل‌ها را فهرست می‌کند. اگر هرگز مدل محلی راه‌اندازی نکرده‌اید، راهنمای ترجمه با LLM محلی ما تنظیمات را پوشش می‌دهد.

این آزمایش کوچکی از یک مدل، یک جفت زبان و یک نمونه بود. نشان می‌دهد چه مشکلاتی رخ می‌دهد و چگونه آن‌ها را بگیریم. ابزارها یا اعلان‌ها را رتبه‌بندی نمی‌کند.

نتیجه: ماشین‌آلات جان سالم به در بردند؛ فرض‌های انگلیسی نه

هر خروجی را با check_ass_translation.py بررسی کردیم. خروجی کامل در check-results.txt است، و results.csv یک سطر به ازای هر اجرا دارد، شامل مشکلاتی که اسکریپت نمی‌تواند ببیند.

بررسیکل فایلفقط متنمحافظت‌شده
زمان‌بندی، سبک‌ها و فیلدهای ۱–۹ بدون تغییر۳ از ۳۳ از ۳۳ از ۳
تگ‌های بازنویسی بدون تغییر۳ از ۳۲ از ۳۳ از ۳
خطوط ترسیم و توضیح دست‌نخورده۳ از ۳۳ از ۳۳ از ۳
فونت‌های سبک قادر به نمایش ترجمه۰ از ۳۰ از ۳۰ از ۳
\h و \n به‌عنوان فاصله در متن چینی باقی مانده‌اند۳ از ۳۳ از ۳۳ از ۳
همه تگ‌های کارائوکه حفظ شده، هر کدام با متن۳ از ۳۰ از ۳۱ از ۳

دو نتیجه ما را شگفت‌زده کرد. چسباندن کل فایل در هر سه اجرا ساختار را دست‌نخورده نگه داشت، هرچند در دو مورد از آن‌ها خط Title در سربرگ نیز ترجمه شد. و پرامپت فقط-متن، که ایمن‌تر به نظر می‌رسد، تنها تگ‌های خراب را تولید کرد. در یک اجرا برای خطی با شش تگ کارائوکه، {\k25}翻{\k30}页,{\k45}开{\k60}灯 را برگرداند. دو تگ آخر و ۱٫۲۰ ثانیه از زمان‌بندی هایلایت از بین رفتند، بنابراین هایلایت خیلی پیش از خط پایان می‌یافت. همان اجرا Room\h12 is upstairs. را به 12\h12号房间在楼上。 تبدیل کرد، با شماره اتاق دو بار.

پس درس مفید این نیست که «از پرامپت X استفاده کنید.» بلکه این است که آسیب ساختاری که از آن می‌ترسید به‌راحتی قابل تشخیص است، و آسیبی که در واقع در هر نه اجرا نفوذ کرد در سه جایی قرار دارد که صفحات ابزار برای ترجمه ASS به آن‌ها نمی‌پردازند.

۱. فونت‌ها نمی‌توانند زبان جدید را ترسیم کنند

استایل‌های نمونه از Trebuchet MS برای دیالوگ و Georgia برای تابلوها استفاده می‌کنند، که برای یک نسخه انگلیسی عادی است. هیچ‌کدام از این فونت‌ها حاوی نویسه‌های چینی نیستند. وقتی تست گلیف بررسی‌کننده را روی دو فایل فونت نشانه گرفتیم، هر ۱۲ رویداد متن ترجمه‌شده در هر اجرا شکست خوردند:

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. از آنجا که فونت زبان مقصد جدید است، پیوست کردن آن اکنون بخشی از کار ترجمه است.

۲. کدهای فاصله‌گذاری عادت‌های انگلیسی را حمل می‌کنند

Room\h12 واژه «Room» را به «12» می‌چسباند تا هرگز بین خطوط جدا نشوند. در چینی واژه‌ها با فاصله از هم جدا نمی‌شوند، اما هر اجرا \h را جایی نگه داشت: پنج اجرا آن را بین 12号房间 و 在楼上 قرار دادند، سه اجرا پیش از عدد، و یکی بین دو نسخه از عدد. در هر صورت، بیننده یک فاصله ناخواسته می‌بیند. Wait\nhere. همین مشکل را داشت. با WrapStyle: 0، \n به‌صورت یک فاصله رندر می‌شود، بنابراین 在\n这里等 یک شکاف در وسط یک جمله سه‌کلمه‌ای نشان می‌دهد.

ساختار اینجا خوب است؛ زبان نه. برای زبان مقصدی که بین واژه‌ها فاصله ندارد، \h و \n را از متن ترجمه‌شده حذف کنید. \N را فقط جایی نگه دارید که شکست اجباری می‌خواهید، و آن را در نقطه‌ای طبیعی در جمله مقصد قرار دهید. به همین دلیل بررسی‌کننده تغییر تعداد \h و \n را به‌عنوان هشدار و نه خطا گزارش می‌کند، و هنگامی که یکی از آن‌ها درون متن چینی، ژاپنی یا کره‌ای باقی بماند هشدار می‌دهد.

۳. زمان‌بندی کارائوکه متعلق به واژه‌های اصلی است

خط کارائوکه {\k25}Turn {\k30}the {\k45}page, {\k60}turn {\k40}the {\k80}light هر هجای انگلیسی را با آهنگ زمان‌بندی می‌کند. یک ترجمه نمی‌تواند آن زمان‌بندی را به‌طور معنادار حفظ کند، زیرا واژه‌های چینی روی همان ضرب‌ها نمی‌افتند. اجراهای ما راه‌های مختلف اشتباه شدن آن را نشان می‌دهند:

  • در چهار اجرا هر شش تگ حفظ شدند، هر یک روی واژه‌ای متفاوت از قبل. یکی از آن‌ها با {\k40}打{\k80}开، «باز کردن»، پایان یافت و «light» را کاملاً از خط حذف کرد.
  • در چهار اجرا یک هجا چیزی را هایلایت نکرد، مانند 打开{\k40}{\k80}灯 (۰٫۴۰ ثانیه هایلایت روی یک هجای خالی). در دو مورد از آن‌ها، یک هجای ۰٫۴۵ ثانیه‌ای نیز فقط یک ویرگول را هایلایت کرد.
  • در یک اجرا دو تگ ناپدید شدند، همان‌طور که در بالا توضیح داده شد.

بررسی‌کننده خط کارائوکه‌ای را که درجا ترجمه شده و هر هجایی را که بدون متن مانده علامت‌گذاری می‌کند. راه‌حل بهتر ویرایشی است: کارائوکه را درجا ترجمه نکنید. خط زمان‌بندی‌شده اصلی را برای هم‌خوانی نگه دارید و ترجمه را به‌عنوان یک رویداد جداگانه اضافه کنید: رویداد کارائوکه را کپی کنید، به آن استایل خودش بدهید (مثلاً کوچک‌تر و در پایین قرار داده شود)، تگ‌های \k را حذف کنید و متن را ترجمه کنید. فقط اگر آماده هستید خودتان آن را با صدا زمان‌بندی کنید، هجا به هجا دوباره زمان‌بندی کنید.

گردش کاری که دوام می‌آورد

  1. ابتدا منبع را خوانا کنید. اگر فایل نویسه‌های نامفهوم نشان می‌دهد، پیش از هر چیز کدگذاری را درست کنید. راهنمای کدگذاری ما از مثال‌های SRT استفاده می‌کند، اما همان مراحل سطح بایت برای فایل .ass کار می‌کند و بایت‌های اصلی را ایمن نگه می‌دارد. بررسی‌کننده فقط UTF-8 و UTF-16 را می‌خواند.

  2. دامنه را مشخص کنید. استایل‌ها را فهرست کنید و تصمیم بگیرید کدام‌ها دیالوگ هستند، کدام‌ها تابلوهای روی صفحه، و کدام‌ها کارائوکه. تابلوها معمولاً نیاز به ترجمه دارند؛ کارائوکه معمولاً نیاز به یک خط جداگانه دارد؛ کامنت‌ها و یادداشت‌های آکولادی به عهده خودتان است.

  3. فقط فیلد Text را ترجمه کنید. از ابزاری استفاده کنید که ASS را تجزیه می‌کند نه اینکه آن را متن ساده در نظر بگیرد، یا خودتان تگ‌ها را مانند شرط سوم ما محافظت کنید. فایل منبع را کنار خروجی نگه دارید.

  4. بررسی ساختاری را اجرا کنید.

    python3 check_ass_translation.py source.ass translated.ass
    

    این بررسی تعداد رویدادها، انواع رویدادها، فیلدهای ۱–۹، مقادیر استایل، بلوک‌های بازنویسی، ترسیم‌ها، خطوط کامنت، \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 عبور ندادیم. هر ابزاری که استفاده می‌کنید، مراحل ۴ تا ۷ را روی نتیجه اجرا کنید. سبکی که فونت انگلیسی خود را حفظ می‌کند هنوز سبکی است که نمی‌تواند چینی رسم کند، و کارائوکه‌ای که در جای خود ترجمه شده هنوز نیاز به تصمیم تحریری دارد. برای ادامه گردش کار زیرنویس، راهنمای ترجمه زیرنویس با هوش مصنوعی ما، مقایسه نرم‌افزارهای ترجمه زیرنویس ما، و اگر ترجمه‌تان به یوتیوب می‌رود، گردش کار زیرنویس یوتیوب را ببینید.

چه زمانی به جای آن به SRT تبدیل کنیم

تبدیل ASS به SRT قبل از ترجمه، سبک‌ها، موقعیت‌ها، ترسیم‌ها و کارائوکه را حذف می‌کند، که همچنین بیشتر مشکلات بالا را برطرف می‌کند. این معامله معقولی است اگر مقصد شما فقط زیرنویس ساده را نمایش می‌دهد، یا اگر سبک‌دهی هرگز برای انتشار مهم نبوده است. این معامله اشتباهی برای انتشارهای انیمه و موسیقی است که در آن‌ها تابلوها و کارائوکه بخشی از اثر هستند. بر اساس جایی که فایل نمایش داده خواهد شد تصمیم بگیرید، نه بر اساس اینکه کدام قالب ترجمه آسان‌تری دارد.

دریافت فایل‌های آزمایشی

همه چیز از این آزمایش برای استفاده مجدد رایگان است:

  • sample-source.ass: نمونه انگلیسی ۱۴ رویدادی؛
  • check_ass_translation.py: بررسی‌کننده (کتابخانه استاندارد پایتون؛ آزمون --font به fontTools نیاز دارد)؛
  • run_llm_ass_test.py: سه شرط اعلان برای هر سرور محلی سازگار با OpenAI؛
  • results.csv و check-results.txt: نتایج هر اجرا؛
  • README.txt: فهرست فایل‌ها و تنظیمات آزمایش، همراه با نه خروجی ویرایش‌نشده در پوشه outputs.

مطالب مرتبط