همهٔ کیوهای زیرنویس را زودتر یا دیرتر ببرید
هر کیو (cue) در فایل زیرنویس SRT یا WebVTT را با یک آفست ثابت و دقیق در حد میلیثانیه جابهجا میکند. خطوط زمانبندی شناختهشده را تغییر میدهد و متن کیوها، شناسهها، تنظیمات، یادداشتها و پایانخطهای باقیمانده را دستنخورده نگه میدارد.
یک فایل SubRip (.srt) یا WebVTT (.vtt) با کدگذاری UTF-۸، تا ۲۰ مگابایت. فایل فقط در همین تب خوانده میشود.
چگونگی کار
این ابزار چه چیزی را محاسبه میکند
فایل زیرنویس جانبی (sidecar) دنبالهای از کیوهای متنی است که روی خط زمانی رسانه گذاشته شدهاند. وقتی همهٔ زیرنویسها به یک اندازه زود یا دیر ظاهر میشوند، نه متن اشتباه است و نه مدت تکتک کیوها — کل خط زمانی یک آفست ثابت دارد.
این ابزار آن آفست را به میلیثانیهٔ صحیح میسنجد و یک فایل .srt یا .vtt اصلاحشده مینویسد. به فایل رسانه نیازی نیست، چون عملیات کاملاً درون خط زمانی زیرنویس است: هر شروع و پایان شناختهشده همان تغییر علامتدار را میگیرد.
روش
محاسبات عمداً کوچک است:
offset_ms = round(offset_seconds × 1,000)
Later: new_time_ms = old_time_ms + offset_ms
Earlier: new_time_ms = old_time_ms - offset_ms
اعمال یک مقدار به هر دو سر، مدت کیو را حفظ میکند. کیویی از 00:00:01,250 تا 00:00:03,500 ۲٫۲۵۰ ثانیه طول میکشد؛ بعد از دو ثانیه تأخیر از 00:00:03,250 تا 00:00:05,500 میشود و همچنان ۲٫۲۵۰ ثانیه طول میکشد. رابطهٔ بین کیوها هم حفظ میشود: اگر دو کیو پیش از جابهجایی نیم ثانیه همپوشانی داشته باشند، بعد از آن هم نیم ثانیه همپوشانی دارند.
آنچه دقت میخواهد، تشخیص جایی است که این حساب باید اعمال شود. جستوجوی کورکورانه برای هر متنی شبیه مُهر زمانی، زمانهایی را که در دیالوگ، یادداشتها یا CSS نوشته شدهاند هم تغییر میداد. بنابراین فایل بهصورت بلوکهای جداشده با خط خالی پیموده میشود. در SRT، خط زمانبندی کیو خط اول یا خط بعد از شمارندهٔ عددی آن است. در WebVTT، خط اول یا خط بعد از شناسهٔ اختیاری کیو است؛ سرآیند WEBVTT و بلوکهای NOTE، STYLE و REGION ساختاریاند و هرگز کیو به حساب نمیآیند.
پیش از هر تغییری، کل خط زمانبندی باید مطابقت داشته باشد. SRT پیش از میلیثانیه کاما میگذارد:
00:01:02,000 --> 00:01:04,250
WebVTT نقطه میگذارد، میتواند ساعتِ صفر را حذف کند، و میتواند بعد از زمان پایان تنظیمات داشته باشد:
01:02.000 --> 01:04.250 position:50% align:middle
گرامر W3C در WebVTT فاصله در دو طرف -->، پایانِ دیرتر از شروع، و مرتب بودن کیوها بر اساس زمان شروع را لازم میداند. این قیدها بررسی میشوند، نه اینکه خطی که فقط شبیه کیو است بیسروصدا بازنویسی شود.
پیش از ادامهٔ مطلب
زیرنویسی در ۰۰:۰۱٫۲۵۰ ظاهر میشود، اما کلمهٔ گفتهشدهاش در ۰۰:۰۳٫۲۵۰ شروع میشود. کدام تغییر آن را هماهنگ میکند؟
دو ثانیه دیرتر ببرید. «دیرتر» ۲٬۰۰۰ میلیثانیه به شروع و پایان با هم اضافه میکند، بنابراین ۰۰:۰۱٫۲۵۰ به ۰۰:۰۳٫۲۵۰ تبدیل میشود بیآنکه مدت نمایش زیرنویس تغییر کند. «زودتر» برای نشانهٔ مخالف است: متنی که بعد از گفتارِ متناظرش ظاهر میشود.
در ابتدای خط زمانی چه میشود
اضافه کردن تأخیر هرگز مُهر زمانی را منفی نمیکند؛ کم کردن آن میتواند. قالب فایل نمایشی برای کیو در منفیِ نیم ثانیه ندارد، بنابراین ابزار بهجای پیچاندن مقدار یا نوشتن علامت منفیِ نامعتبر، آن مرز را آشکار میکند.
- اگر پایانِ جابهجاشده در صفر یا پیش از آن باشد، هیچ بخشی از کیو نمیتواند نمایش داده شود و کیو حذف میشود.
- اگر شروعِ جابهجاشده منفی باشد اما پایان هنوز مثبت، شروع آن را به ۰۰:۰۰ محدود کن بخش قابل مشاهده را نگه میدارد و فقط همان کیو را کوتاه میکند.
- کل کیو را حذف کن در عوض کیوِ گذرنده از صفر را دور میریزد. این وقتی مفید است که کلمات آغازینش متعلق به محتوایی باشد که بریده شده است.
شمارندههای عددی SRT و شناسههای WebVTT پس از حذف دوباره شمارهگذاری نمیشوند. ممکن است بیرون از فایل به آنها ارجاع شده باشد، و یک جای خالی امنتر از تغییر بیصدای آن ارجاعهاست.
یک نمونه کار شده
interview.srt دو کیو دارد:
1
00:00:01,250 --> 00:00:03,500
The first subtitle.
2
00:01:02,000 --> 00:01:04,250
The second subtitle.
با دیرتر و 2 ثانیه، interview-shifted.srt این میشود:
1
00:00:03,250 --> 00:00:05,500
The first subtitle.
2
00:01:04,000 --> 00:01:06,250
The second subtitle.
| خوانش | مقدار |
|---|---|
| کیوهای جابهجاشده | ۲ |
| کیوهای حذفشده | ۰ |
| قالب زیرنویس | SubRip (SRT) |
| آفست اعمالشده | ۲٫۰۰۰ ثانیه |
آزمون فرمول خروجی کامل را بایت به بایت تثبیت میکند، از جمله پایانخطهای CRLF، نام فایل، نوع MIME و هر چهار خوانش. آزمونی جداگانه شناسههای WebVTT، تنظیمات کیو، یادداشتها و بلوکهای استایل را پوشش میدهد، و آزمونهای مرزی محدود کردن، حذف، گذر از یک ساعت، خطاهای کدگذاری، لغو و زمانبندی خراب را.
SRT و WebVTT شبیه هماند، نه جایگزین هم
کتابخانهٔ کنگره SRT را قالب متنی سادهای توصیف میکند که از یک شمارنده، شروع و پایان، متن زیرنویس و یک جداکنندهٔ خالی ساخته شده است. پیادهسازیهای فراوانی دارد اما رسماً استاندارد نشده، و کدگذاری نویسهای قدیمیاش خودش را اعلام نمیکند. به همین دلیل این ابزار گرامر رایج زمانبندی را میپذیرد اما متن غیر UTF-۸ را حدس نمیزند.
WebVTT برای تراکهای متنی HTML مشخص شده است. خط اولش سرآیند WEBVTT است، نوع MIME آن text/vtt، مُهرهای زمانیاش نقطه دارند و کیوها میتوانند شناسه و تنظیمات موقعیت داشته باشند. یادداشتها و بلوکهای استایل یا ناحیه هم بخشی از سند هستند. خروجی در قالب ورودی میماند؛ جابهجایی تبدیل نیست، بنابراین SRT همان SRT و فایل WebVTT همان WebVTT میماند.
کاری که انجام نمیدهد
خط زمانی را نمیکشد و فشرده نمیکند. اگر زیرنویس در ابتدا یک ثانیه و در انتها شش ثانیه دیر است، از روش بازهمگامسازیای استفاده کنید که دو نقطهٔ معلوم را به هم نگاشت میکند و هر مُهر زمانی را بازمقیاس میکند. یک آفست ثابت فقط نقطهٔ شروع خطای فزاینده را جابهجا میکند.
همچنین تراکهای زیرنویس تعبیهشده در فایل ویدیو را تغییر نمیدهد و رسانه را برای پیدا کردن خودکار آفست بررسی نمیکند. ورودی فایل جانبی متنی است. اگر ناهماهنگی از بریدن یک فایل WAV شروع شده، دقیقاً همان مقدار حذفشده را بهعنوان آفست زیرنویس وارد کنید؛ اگر خود متن زیرنویس نیاز به پاکسازی دارد، مرتبسازی خطوط و دیگر عملیات عمومی متن عمداً کار جداگانهای است.
متن کیوهای WebVTT میتواند تگهای مُهر زمانی درونخطی برای زمانبندی کلمهبهکلمهٔ کارائوکهای داشته باشد. آن زمانهای درونی نقاط مطلقی درون کیو بیرونیاند. ابزار چنین کیویی را با توضیح رد میکند: جابهجا کردن فقط جفت بیرونی فایل نامعتبری به جا میگذارد، و تغییر هر ساختار ممکن در متن کیو کار یک ویرایشگر اختصاصی WebVTT است، نه یک جابهجاکنندهٔ آفست ثابت.
مراحل انجام کار
- فایل بهصورت UTF-۸ در همین تب مرورگر خوانده میشود. نشانگر ترتیب بایت UTF-۸ موجود و پایانخط هر خط حفظ میشود؛ UTF-۱۶، UTF-۸ نامعتبر و ورودی باینری رد میشوند، نه اینکه کدگذاری حدس زده شود و متن زیرنویس آسیب ببیند.
- سرآیند WEBVTT بهعنوان WebVTT و فایل پذیرفتهشدهٔ بدون آن بهعنوان SubRip در نظر گرفته میشود. فایلی با نام .vtt که خط اول الزامی WEBVTT را ندارد رد میشود.
- بلوکهای جداشده با خط خالی یکییکی پیموده میشوند. سرآیند WebVTT و بلوکهای NOTE، STYLE و REGION حفظ میشوند؛ یک بلوک فقط وقتی کیو شناخته میشود که یکی از دو خط اولش با گرامر کامل «شروع، پیکان، پایان» آن قالب مطابقت داشته باشد.
- هر شروع و پایان به عدد صحیح میلیثانیه تبدیل میشود و پایان باید دیرتر از شروع باشد. آفست درخواستی به یک میلیثانیه گرد میشود، سپس برای «دیرتر» اضافه و برای «زودتر» کم میشود.
- وقتی جابهجایی به زودتر کل یک کیو را به صفر یا پیش از آن میبرد، کیو حذف میشود چون زمان پخش منفی وجود ندارد. وقتی فقط شروع از صفر میگذرد، دقیقاً مطابق انتخاب شما یا شروع به صفر محدود میشود یا کیو حذف میشود.
- فقط خط زمانبندی شناختهشده در قالب مبدأ بازنویسی میشود. شمارههای کیو، شناسهها، متن، تنظیمات کیو WebVTT، بلوکهای ساختاری، نشانگر UTF-۸ و پایانخط هر خط باقیمانده حفظ میشود، سپس فایل کامل برای دانلود ارائه میشود.
فرضها
- یک آفست ثابت به کل فایل اعمال میشود. اگر زیرنویسها در ابتدا هماهنگ باشند و هرچه جلوتر بروید بیشتر خطا داشته باشند، این رانش یا ناهمخوانی سرعت پخش است و با اضافه کردن یک عدد به همهجا درست نمیشود.
- آفست به ثانیه وارد میشود و یک بار به نزدیکترین میلیثانیه گرد میشود، چون هر دو قالب پشتیبانیشده در عمل سه رقم اعشار ذخیره میکنند. در پنل نتیجه، «دیرتر» مثبت و «زودتر» منفی است.
- زمانبندی SubRip به شکل ساعت:دقیقه:ثانیه,میلیثانیه در دو طرف پیکان --> است. شمارندههای عددی کیو، از جمله شکل فشردهای که شمارنده در همان خط زمانبندی است، حفظ میشوند و با حذف یک کیو در ابتدا دوباره شمارهگذاری نمیشوند.
- WebVTT خط اول WEBVTT را لازم دارد، پیش از میلیثانیه نقطه میگذارد و میتواند بخش ساعت را تا وقتی صفر است حذف کند. نمایش ساعتِ موجود حفظ میشود، و اگر مُهر زمانی جابهجاشده از ۶۰ دقیقه بگذرد، ساعت اضافه میشود.
- بلوکهای NOTE، STYLE و REGION، شناسهها و تنظیمات کیو در WebVTT، جز پایانخطهای باقیمانده، بایت به بایت نگه داشته میشوند. کیویی که تگ مُهر زمانی درونخطی WebVTT دارد رد میشود، چون تغییر فقط زمانهای بیرونی آن زمانبندی داخلیِ کارائوکهای را خراب میکند.
- کیوها ممکن است پیش یا پس از جابهجایی همپوشانی داشته باشند؛ اعمال یک آفست آن رابطه را حفظ میکند. این ابزار نحو و جهت زمانبندی را بررسی میکند، اما دربارهٔ اینکه همپوشانی عمدی بوده یا نه تصمیم نمیگیرد.
- ورودی به ۲۰ مگابایت و ۲۵۰٬۰۰۰ کیو محدود است. ورکر هنگام پیمایش فایل بلند بهطور دورهای نوبت را واگذار میکند تا نوار پیشرفت و دکمهٔ لغو پاسخگو بمانند.
پرسشهای رایج
آیا فایل زیرنویس هنگام تغییر مُهرهای زمانی آپلود میشود؟
نه. فایل درون یک ورکر در همین تب مرورگر رمزگشایی، بررسی و بازنویسی میشود. آزمون مرورگریِ تولیدشده یک فایل زیرنویس واقعی را بارگذاری میکند و اگر استفاده از ابزار درخواستی به بیرون از این سایت بفرستد، شکست میخورد.
جابهجا کردن زیرنویسها به دو ثانیه دیرتر چه میکند؟
دقیقاً ۲٬۰۰۰ میلیثانیه به شروع و پایان هر کیو شناختهشده اضافه میکند. بنابراین کیویی از ۰۰:۰۱٫۲۵۰ تا ۰۰:۰۳٫۵۰۰ به ۰۰:۰۳٫۲۵۰ تا ۰۰:۰۵٫۵۰۰ تبدیل میشود، بیآنکه مدت یا متنش تغییر کند.
چرا یک زیرنویس ابتدای فایل از صفر شروع شد یا ناپدید شد؟
زمان رسانه نمیتواند منفی باشد. کیویی که کاملاً به صفر یا پیش از آن برود حذف میشود؛ اگر فقط شروعش از صفر بگذرد، حالت پیشفرض بخش قابل مشاهده را از ۰۰:۰۰ نگه میدارد، و تنظیم پیشرفته میتواند بهجای آن کل کیو را حذف کند.
آیا موقعیت کیوها، یادداشتها و استایلهای WebVTT حفظ میشوند؟
بله. تنظیمات کیو بعد از زمان پایان و بلوکهای جداگانهٔ NOTE، STYLE و REGION بدون تغییر منتقل میشوند. ابزار خطوط زمانبندی بیرونیِ شناختهشده را تغییر میدهد و تگهای مُهر زمانی درونخطی را رد میکند، نه اینکه فقط بخشی از یک کیو پیچیدهتر را ویرایش کند.
چرا زیرنویسی با کدگذاری متنی قدیمی رد شد؟
SRT در طول سالها با چندین صفحهکد (code page) ذخیره شده و راه مطمئنی برای تشخیص همهٔ آنها فقط از روی بایتها وجود ندارد. حدس زدن میتوانست بیصدا نامها یا دیالوگها را عوض کند، بنابراین این ابزار UTF-۸ را میپذیرد و از شما میخواهد UTF-۱۶ یا کدگذاری دیگر را ابتدا دوباره ذخیره کنید.
آیا آفست ثابت زیرنویس، رانش نرخ فریم را درست میکند؟
نه. آفست همان خطای زود یا دیر را در هر نقطه اصلاح میکند. وقتی اختلاف در طول زمان بزرگ میشود، مُهرهای زمانی باید نسبت به مدت یا نرخ فریم درست بازمقیاس شوند، نه اینکه یک عدد به همهٔ کیوها اضافه شود.