كيفية شرح ترجمات YouTube
كيف تنزّل ملفات الترجمة باستخدام yt-dlp وتشرحها في Potato، وما الذي تسمح به الترجمات التلقائية وما لا تسمح به، وكيف تتعامل مع الفيديو، وما ينبغي التحقق منه قبل إعادة نشر مواد لم تصنعها.
نزّل ملفات الترجمة باستخدام yt-dlp ثم وجّه Potato إلى الملفات. أول ما ينبغي معرفته: الترجمات المولّدة آليًا بلا علامات ترقيم وبلا تسميات متحدثين، ومواضع فواصل الأسطر فيها بلا معنى، وهذا يقيّد ما يمكنك شرحه بشكل معقول. يقرأ Potato كل صيغة ترجمة ينتجها yt-dlp. القائمة الكاملة في صيغ النصوص التفريغية.
منصّات الفيديو مصدر واسع ومريح للكلام الطبيعي. تحوّل الترجمة المصاحبة ذلك الكلام إلى نص، والنص خفيف وسهل النقل وسهل الشرح. المشكلة أن ملفات الترجمة ليست كلها من النوع نفسه، والتعامل معها كأنها كذلك هو المكان الذي تنحرف فيه معظم مشاريع الشرح القائمة على الترجمات.
كيف أنزّل ملفات الترجمة؟
يجلب yt-dlp الترجمات مع الوسائط أو بدونها:
# Human-written subtitles, if the uploader provided any
yt-dlp --write-subs --sub-langs en --skip-download <URL>
# Auto-generated captions
yt-dlp --write-auto-subs --sub-langs en --sub-format vtt --skip-download <URL>يقرأ Potato صيغ vtt وsrt وjson3 وttml وكذلك srv1 وsrv2 وsrv3، فأي --sub-format تختاره سيُحلَّل. اختر بناءً على ما تريد الاحتفاظ به: json3 يحفظ توقيتات كل كلمة، بينما WebVTT وSubRip أسهل في القراءة والتعديل اليدوي.
ما الفرق بين الترجمات البشرية والترجمات التلقائية؟
تبدو متشابهة في محرّر نصوص، لكنها تتصرف بشكل مختلف تمامًا كمادة للشرح:
| ترجمات بشرية | ترجمات تلقائية | |
|---|---|---|
| علامات الترقيم | موجودة | غائبة أو غير موثوقة |
| حدود الجُمَل | ذات معنى | اعتباطية |
| المتحدثون | أحيانًا، عبر وسوم <v Name> | أبدًا |
| توقيتات الكلمات | لا | نعم، في json3 |
| الحرفية | تُختصر غالبًا لتسهيل القراءة | أقرب إلى ما قيل فعلًا |
لا واحدة منهما أفضل على الإطلاق. الترجمات البشرية تُقرأ بسهولة لكنها مُحرَّرة لأجل القراءة، فتُحذف منها الحشوات وتُختصر التكرارات وتُعاد صياغة جمل كاملة أحيانًا. والترجمات التلقائية أقرب إلى الحرفية، وهو ما تريده في أي دراسة لكيفية كلام الناس فعلًا، لكنها تصل كتدفّق بلا ترقيم.
ما الذي يمكن شرحه على الترجمات التلقائية؟
لا تصمّم مخطط شرح على مستوى الجملة فوق ترجمات تلقائية. حدود المقاطع فيها تقع حيث امتلأت نافذة الترجمة، لا حيث انتهت جملة. المقطع في ملف ترجمة تلقائية أثر عرضي للعرض، لا وحدة لغوية. اطلب من المشاركين تقييم «كل جملة» وسيختار كلٌّ منهم بصمت حدودًا مختلفة، فتقيس أرقام الاتفاق ذلك الاختلاف بدل ما كنت تريد قياسه.
هناك خياران عمليان:
- اشرح مقاطع الترجمة كما هي. ضع على كل مقطع ما ينطبق عليه، واقبل أن الوحدة اعتباطية لكنها متسقة. يصلح ذلك للموضوع، أو لوجود ظاهرة ما، أو لأي شيء يمكن الحكم عليه من جزء.
- أعد التقطيع في المرحلة السابقة. مرّر نموذج استعادة ترقيم أو نظام تعرّف على الكلام يضع الترقيم، ثم أعد ضبط التوقيتات. جهد أكبر، لكنك تحصل على وحدات حقيقية.
مع الترجمات البشرية تختفي هذه المشكلة إلى حدّ كبير، لأن الحدود وضعها إنسان يقرأ، فتحترم عادةً حدود الجمل الفرعية.
وماذا عن الفيديو؟
ملفات الترجمة صغيرة وسهلة إعادة النشر. الفيديو عادةً ليس كذلك. هناك ثلاثة خيارات:
# Media hosted somewhere your annotators can reach
potato transcripts ./captions --media-url-prefix https://cdn.example.org/video -o data/talks.json
# Media downloaded locally as audio only
yt-dlp -f 'ba' -x --audio-format mp3 -o './audio/%(id)s.%(ext)s' <URL>
potato transcripts ./captions --media-dir ./audio -o data/talks.jsonالخيار الثالث ألّا تستخدم وسائط إطلاقًا. النصوص التفريغية بلا وسائط تُشرَح دون مشكلة؛ يقرأ المشاركون بدل أن يستمعوا. إن كانت هذه خطتك فاذكرها في التعليمات، وإلا افترض المشاركون أن غياب المشغّل عطل وأبلغوا عنه على هذا الأساس.
Warning: تحقق من حقوقك قبل إعادة نشر أي شيء لم تصنعه بنفسك. تنزيل الترجمات أو الوسائط لبحثك الخاص مسألة مختلفة عن تقديم تلك الوسائط لمجموعة من المشاركين في الشرح، وشروط المنصّة وحقوق النشر وقواعد مؤسستك كلها ذات صلة. احسم هذا قبل بناء المسار لا بعده.
كيف أجهّز المهمة؟
تكتب أداة التحويل ملف بيانات يحتوي النص التفريغي موحّدًا مسبقًا:
potato transcripts ./captions --media-dir ./audio -o data/talks.json{
"id": "talk_01",
"conversation": {
"audio": "audio/talk_01.mp3",
"turns": [
{"turn_id": "t0", "speaker": null, "start": 0.0, "end": 4.2,
"text": "so the thing about caption windows is"}
]
}
}speaker: null هو ما تعطيه الترجمة التلقائية. تظهر هذه الأدوار على أنها Unassigned مع أداة اختيار، فيستطيع المشاركون إسنادها وهم يستمعون.
الترجمات التلقائية لا تحمل متحدثين، فيبقى كل مقطع Unassigned حتى يختار أحد المشاركين
annotation_task_name: "Talk Annotation"
task_dir: .
data_files:
- data/talks.json
item_properties:
id_key: id
text_key: conversation
instance_display:
fields:
- key: conversation
type: audio_dialogue
label: "Captions"
span_target: true
display_options:
show_timestamps: true
allow_speaker_assignment: auto
annotation_schemes:
- annotation_type: radio
name: cue_topic
description: "What is this caption window about?"
labels: [setup, argument, example, aside]
turn_level: true
turn_binding:
field: conversationيربط turn_level: true السؤال بكل مقطع بدل الفيديو ككل، وهي الوحدة الصحيحة حين لا تملك سوى المقاطع. للتشغيل:
python potato/flask_server.py start config.yaml -p 8000يمكنك أيضًا تجاوز أداة التحويل كليًا وتوجيه ملف البيانات إلى ملفات الترجمة على القرص. بقية المسار متطابقة، فانظر كيفية شرح نصوص Whisper التفريغية.
قراءات إضافية
- صيغ النصوص التفريغية، كل صيغ الترجمة والتفريغ المدعومة
- كيفية شرح نصوص Whisper التفريغية، نسخة مخرجات التعرّف على الكلام من هذا المسار
- Transcript Format Ingestion، تصميم قابل للتشغيل يعرض ست صيغ جنبًا إلى جنب
- شرح الفيديو، لشرح الفيديو نفسه بدل ترجماته
- تصميم صيغ البيانات للشرح
- Timed Text Markup Language، معيار ترجمات البث الذي يقرأه Potato أيضًا