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