Skip to content

كيفية شرح ترجمات YouTube

كيف تنزّل ملفات الترجمة باستخدام yt-dlp وتشرحها في Potato، وما الذي تسمح به الترجمات التلقائية وما لا تسمح به، وكيف تتعامل مع الفيديو، وما ينبغي التحقق منه قبل إعادة نشر مواد لم تصنعها.

نزّل ملفات الترجمة باستخدام yt-dlp ثم وجّه Potato إلى الملفات. أول ما ينبغي معرفته: الترجمات المولّدة آليًا بلا علامات ترقيم وبلا تسميات متحدثين، ومواضع فواصل الأسطر فيها بلا معنى، وهذا يقيّد ما يمكنك شرحه بشكل معقول. يقرأ Potato كل صيغة ترجمة ينتجها yt-dlp. القائمة الكاملة في صيغ النصوص التفريغية.

منصّات الفيديو مصدر واسع ومريح للكلام الطبيعي. تحوّل الترجمة المصاحبة ذلك الكلام إلى نص، والنص خفيف وسهل النقل وسهل الشرح. المشكلة أن ملفات الترجمة ليست كلها من النوع نفسه، والتعامل معها كأنها كذلك هو المكان الذي تنحرف فيه معظم مشاريع الشرح القائمة على الترجمات.

كيف أنزّل ملفات الترجمة؟

يجلب yt-dlp الترجمات مع الوسائط أو بدونها:

bash
# 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
الحرفيةتُختصر غالبًا لتسهيل القراءةأقرب إلى ما قيل فعلًا

لا واحدة منهما أفضل على الإطلاق. الترجمات البشرية تُقرأ بسهولة لكنها مُحرَّرة لأجل القراءة، فتُحذف منها الحشوات وتُختصر التكرارات وتُعاد صياغة جمل كاملة أحيانًا. والترجمات التلقائية أقرب إلى الحرفية، وهو ما تريده في أي دراسة لكيفية كلام الناس فعلًا، لكنها تصل كتدفّق بلا ترقيم.

ما الذي يمكن شرحه على الترجمات التلقائية؟

لا تصمّم مخطط شرح على مستوى الجملة فوق ترجمات تلقائية. حدود المقاطع فيها تقع حيث امتلأت نافذة الترجمة، لا حيث انتهت جملة. المقطع في ملف ترجمة تلقائية أثر عرضي للعرض، لا وحدة لغوية. اطلب من المشاركين تقييم «كل جملة» وسيختار كلٌّ منهم بصمت حدودًا مختلفة، فتقيس أرقام الاتفاق ذلك الاختلاف بدل ما كنت تريد قياسه.

هناك خياران عمليان:

  • اشرح مقاطع الترجمة كما هي. ضع على كل مقطع ما ينطبق عليه، واقبل أن الوحدة اعتباطية لكنها متسقة. يصلح ذلك للموضوع، أو لوجود ظاهرة ما، أو لأي شيء يمكن الحكم عليه من جزء.
  • أعد التقطيع في المرحلة السابقة. مرّر نموذج استعادة ترقيم أو نظام تعرّف على الكلام يضع الترقيم، ثم أعد ضبط التوقيتات. جهد أكبر، لكنك تحصل على وحدات حقيقية.

مع الترجمات البشرية تختفي هذه المشكلة إلى حدّ كبير، لأن الحدود وضعها إنسان يقرأ، فتحترم عادةً حدود الجمل الفرعية.

وماذا عن الفيديو؟

ملفات الترجمة صغيرة وسهلة إعادة النشر. الفيديو عادةً ليس كذلك. هناك ثلاثة خيارات:

bash
# 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: تحقق من حقوقك قبل إعادة نشر أي شيء لم تصنعه بنفسك. تنزيل الترجمات أو الوسائط لبحثك الخاص مسألة مختلفة عن تقديم تلك الوسائط لمجموعة من المشاركين في الشرح، وشروط المنصّة وحقوق النشر وقواعد مؤسستك كلها ذات صلة. احسم هذا قبل بناء المسار لا بعده.

كيف أجهّز المهمة؟

تكتب أداة التحويل ملف بيانات يحتوي النص التفريغي موحّدًا مسبقًا:

bash
potato transcripts ./captions --media-dir ./audio -o data/talks.json
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 مع سهم قائمة منسدلة وسؤال مرفق بكل دور.الترجمات التلقائية لا تحمل متحدثين، فيبقى كل مقطع Unassigned حتى يختار أحد المشاركين

yaml
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 السؤال بكل مقطع بدل الفيديو ككل، وهي الوحدة الصحيحة حين لا تملك سوى المقاطع. للتشغيل:

bash
python potato/flask_server.py start config.yaml -p 8000

يمكنك أيضًا تجاوز أداة التحويل كليًا وتوجيه ملف البيانات إلى ملفات الترجمة على القرص. بقية المسار متطابقة، فانظر كيفية شرح نصوص Whisper التفريغية.

قراءات إضافية