إزاحة توقيت ترجمات SRT بالمللي ثانية
قد تظهر الترجمة مبكرة أو متأخرة بمقدار ثابت رغم صحة كل مقطع على حدة. تزيح هذه الأداة ملف SRT كاملًا بقيمة واحدة موقعة بوحدة المللي ثانية، من دون إعادة كتابة النص أو تغيير ترتيبه.
شغّل الأداة مجانًا
تؤخر القيم الموجبة ظهور الترجمة، بينما تقدمها القيم السالبة. ويُضبط عند الصفر كل طابع زمني قد يصبح سالبًا. يتحقق المحلل من كل مقطع مرقم، ويبلغ عن الطوابع الزمنية غير الصحيحة بدلًا من إرجاع ملف ترجمة تالف من دون تنبيه.
اختاروا مقدار الإزاحة من نقطة مزامنة موثوقة
ابدؤوا بالبحث عن حدث واضح قرب بداية الفيديو، مثل إغلاق باب أو بدء المتحدث جملة أو ظهور عنوان. قارنوا الحدث بمقطع الترجمة الموافق له، وقيسوا الفرق بالمللي ثانية. إذا ظهرت الترجمة قبل الحدث، فاستخدموا قيمة موجبة لتأخيرها. وإذا ظهرت بعده، فاستخدموا قيمة سالبة لتقديمها. تحققوا كذلك من نقطة قرب نهاية البرنامج قبل اعتماد الإزاحة على الملف كله. إذا ظل الفرق ثابتًا، فالإزاحة الواحدة هي التصحيح المناسب. أما إذا ازداد الفرق مع مرور الوقت، فالسبب على الأرجح انحراف سرعة التشغيل أو تحويل معدل الإطارات، ولا تعالجه إزاحة ثابتة. أرسلوا نص SRT كاملًا والعدد الصحيح الموقع. تحافظ النتيجة على أرقام المقاطع وأسطر النص، وتستبدل كل نطاق زمني صحيح. احفظوا الناتج في ملف `.srt` جديد وقارنوه بالأصل قبل استبدال أي مادة مستخدمة في الإنتاج، حتى يمكنكم الرجوع بسهولة إذا كان القياس الأولي غير دقيق.
افهموا التحقق وضبط الحد الأدنى عند الصفر
يجب أن يحتوي كل مقطع SRT على فهرس رقمي وسطر توقيت وسطر واحد على الأقل من نص الترجمة. تستخدم القيم الزمنية الصيغة القياسية `ساعات:دقائق:ثوان,مللي ثانية`، مع رقمين أو أكثر للساعات، ورقمين للدقائق والثواني، وثلاثة أرقام بالضبط للمللي ثانية. يجب أن تقع الدقائق والثواني بين صفر وتسعة وخمسين. ترفض الأداة المقطع إذا لم يتبع سطره هذه البنية، أو كان أحد طابعيه الزمنيين غير صحيح، أو سبقت النهاية الأصلية البداية. يمنع هذا التحقق الصارم إجراء تحويل جزئي يبدو ناجحًا بينما يخفي مقاطع معطوبة. تُطبق الإزاحة السالبة على حدّي البداية والنهاية كل على حدة. إذا هبطت النتيجة عن الصفر، تصبح تمامًا `00:00:00,000`. لذلك قد يتحول مقطع يقع كاملًا قبل مقدار إزاحة سالبة كبيرة إلى مقطع صفري المدة عند البداية. هذا ضبط مقصود وليس خطأ حسابيًا. راجعوا المقاطع الأولى بعد أي تقديم كبير.
استخدموا الملف المزاح بأمان ضمن سير العمل
احتفظوا بملف الترجمة الأصلي، واحفظوا النتيجة باسم جديد إلى أن تتحققوا منها مع نسخة الفيديو المقصودة. اختبروا الحوار والموسيقى وانتقالات المشاهد في مواضع متعددة بدل الاعتماد على مقطع واحد في البداية. لا تغير العملية إلا الطوابع الزمنية؛ فهي لا تترجم النص، ولا تعيد ترقيم المقاطع، ولا تصحح الإملاء، ولا تستنتج ترجمات مفقودة، ولا تعوض الانحراف المتزايد. تبقى فواصل الأسطر داخل النص كما هي، ولذلك تحتفظ الترجمة متعددة الأسطر بتنسيقها. توحد النتيجة نهايات الأسطر والفواصل بين المقاطع بطريقة تقبلها برامج SRT الشائعة. ولأن الخوارزمية حتمية ولا تستخدم الشبكة أو العشوائية أو النماذج، فإن المدخل نفسه مع الإزاحة نفسها يعطي دائمًا الناتج ذاته. يمكنكم تشغيلها في المتصفح أو أتمتتها عبر API مقابل $0.002 لكل طلب. في المعالجة المجمعة، سجلوا الإزاحة مع إصدار الفيديو المحدد، لأن التصحيح الملائم لمونتاج ما قد لا يناسب نسخة أضيفت إليها مقدمة أو مادة إعلانية.
حالات الاستخدام
تصحيح تأخر صوتي ثابت
أخروا جميع الترجمات عندما يؤدي إعداد الدمج أو التشغيل إلى ظهور النص قبل الكلام المسموع.
تعويض مقدمة محذوفة
قدموا جميع المقاطع بعد حذف شريط افتتاحي أو عد تنازلي أو مشهد عنوان ذي مدة ثابتة من الفيديو.
توحيد ملف التسليم
طبقوا إزاحة تحريرية مقاسة واحصلوا على توقيت SRT متسق قبل تجهيز الترجمة للنشر.
الأسئلة الشائعة
هل نستخدم إزاحة موجبة أم سالبة؟
استخدموا قيمة موجبة لإظهار الترجمة لاحقًا، وقيمة سالبة لإظهارها في وقت أبكر.
ماذا يحدث إذا هبط طابع زمني عن الصفر؟
يُضبط حد البداية أو النهاية المعني عند `00:00:00,000`، ولا تنتج الأداة وقتًا سالبًا مطلقًا.
هل تصلح الأداة انحراف توقيت الترجمة؟
لا. تصلح الإزاحة الثابتة فرقًا ثابتًا فقط. أما الفرق الذي يزداد أثناء الفيديو فيحتاج إلى تصحيح السرعة أو توقيت الإطارات.
هل يتغير نص الترجمة أو ترقيمها؟
لا. تبقى الأرقام وأسطر النص محفوظة، وتُستبدل الأوقات فقط، مع توحيد نهايات الأسطر والفواصل بين المقاطع.
ماذا يحدث إذا احتوى مقطع على وقت غير صالح؟
يفشل الطلب كله بخطأ إدخال يحدد المقطع المتأثر، ولا يُرجع ملفًا مزاحًا جزئيًا.
ما تكلفة طلب API؟
سعر API هو $0.002 لكل طلب. تتوفر العملية الحتمية نفسها في المتصفح أيضًا.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/video/subtitle-srt-shift \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"srt":"1\n00:00:01,250 --> 00:00:03,500\nOpening line.\n\n2\n00:00:05,000 --> 00:00:07,250\nSecond line.","offset_ms":-1500}'const res = await fetch("https://api.kit.forhosting.com/video/subtitle-srt-shift", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"srt": "1\n00:00:01,250 --> 00:00:03,500\nOpening line.\n\n2\n00:00:05,000 --> 00:00:07,250\nSecond line.",
"offset_ms": -1500
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/video/subtitle-srt-shift",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"srt": "1\n00:00:01,250 --> 00:00:03,500\nOpening line.\n\n2\n00:00:05,000 --> 00:00:07,250\nSecond line.",
"offset_ms": -1500
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/video/subtitle-srt-shift", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"srt":"1\\n00:00:01,250 --> 00:00:03,500\\nOpening line.\\n\\n2\\n00:00:05,000 --> 00:00:07,250\\nSecond line.","offset_ms":-1500}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"srt":"1\n00:00:01,250 --> 00:00:03,500\nOpening line.\n\n2\n00:00:05,000 --> 00:00:07,250\nSecond line.","offset_ms":-1500}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/video/subtitle-srt-shift", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"srt": "1\n00:00:01,250 --> 00:00:03,500\nOpening line.\n\n2\n00:00:05,000 --> 00:00:07,250\nSecond line.",
"offset_ms": -1500
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "video.subtitle_srt_shift",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الحدود
max_mb | 500 |
max_minutes | 60 |
max_megapixels | 3.9 |
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |