Potato 2.7.1: النص التفريغي موجود سلفاً
يقرأ Potato 2.7.1 إحدى وعشرين صيغة نص تفريغي وترجمة مباشرة، ويحمّلها من ملفات مرافقة بجوار وسائطك، ويتضمن أداة تحويل تجعل من مجلد مخرجات التعرّف على الكلام ملف بيانات جاهزاً للتعليق التوضيحي.
لا يكاد أحد يأتي إلى أداة تعليق توضيحي ومعه صوت خام ولا شيء غيره. إنهم يأتون ومعهم نص تفريغي. أحدهم شغّل Whisper على مجلد مقابلات. وأحدهم سحب الترجمات من مئة محاضرة مؤتمر. وأحدهم ورث متناً من ملفات TextGrid عن مشروع ميداني انتهى في 2019.
ثم تطلب منهم الأداة أن يكتبوا برنامج تحويل.
وPotato 2.7.1 عن إزالة تلك الخطوة. فهو يقرأ إحدى وعشرين صيغة نص تفريغي وترجمة مباشرة، ويحمّلها من ملفات تجلس بجوار وسائطك بدل أن يشترط لصق كل شيء داخل ملف بيانات، ويتضمن أداة تحويل للحالة التي تريد فيها فعلاً ملف بيانات واحداً في النهاية.
Potato 2.7.1
إحدى وعشرون صيغة تدخل، ونموذج واحد يخرج
بعد أن كانت ستاً. والقائمة الكاملة في صفحة صيغ النصوص التفريغية، لكن على وجه التقريب: تسعة أنواع من مخرجات التعرّف على الكلام (Whisper JSON، وWhisperX وغيره من JSON مفصول المتحدثين، وwhisper.cpp، وWhisper TSV، وAWS Transcribe، وDeepgram، وAssemblyAI، وRev.ai، وSPoRC)، وست صيغ ترجمة وتعليق نصي (SubRip، وWebVTT، وSubStation Alpha، وTTML وDFXP، وYouTube json3، وYouTube srv1/srv2/srv3)، وثلاث من عالم المحاذاة القسرية (NIST CTM، وPraat TextGrid، وELAN EAF)، وثلاثة أشكال عامة لبيانات جاءت من مكان آخر تماماً.
وصيغ المحاذاة هي الإضافة التي نحن أسعد بها. فالتصدير إلى EAF وTextGrid كان موجوداً أصلاً، وبذلك صارت التعليقات الطبقية تكمل دورة كاملة: تُدخل محاذاة موجودة، وتصحّحها في Potato، وتعيدها إلى ELAN أو Praat.
ويعمل الاستنتاج انطلاقاً من شكل البيانات لا من امتداد الملف، ما يعني أن ملف WebVTT اسمه captions.txt يظل يُحلَّل بوصفه WebVTT، ويعني أن النص التفريغي نفسه يعمل مضمّناً أو مقروءاً من القرص دون تغيير في التهيئة.
وتُحفظ توقيتات الكلمات ودرجة الثقة لكل مقطع حيثما وفّرها المصدر. أما الصيغ التي هي أصلاً على مستوى الكلمة، مثل CTM وDeepgram وAssemblyAI، فتُجمَّع في أدوار عند تغيّر المتحدث وعند تجاوز عتبة توقف.
أياً كانت الصيغة التي دخلت، فهذا ما يخرج
الملفات المرافقة
أداة التعرّف على الكلام لديك كتبت الملفات أصلاً في تنظيم معقول: الوسائط هنا، والنص التفريغي بجوارها. ولم يكن ثمة سبب وجيه لإجبارك على تسطيح ذلك داخل كتلة بيانات، فصار بإمكانك الآن أن تشير إليه:
{"id": "int_001", "conversation": {"audio": "media/int_001.mp3",
"transcript": "media/int_001.srt"}}وتُحلّ المسارات نسبةً إلى task_dir وتمرّ بالتحقق نفسه من اجتياز المجلدات الذي يمرّ به أي مسار مُعدّ آخر. وإن كانت بياناتك تحمل فعلاً نصوصاً تفريغية مضمّنة من سطر واحد تصادف أنها تشبه أسماء ملفات، فـtranscript_is_path: false يعطّل هذا الاستنتاج.
والفائدة العملية أن نصوصك التفريغية تبقى ملفات. فيمكنك أن تقارنها وتعيد توليدها وتسلّمها لشخص آخر، بدل أن تكون لديك نسخة متحجّرة داخل مصفوفة JSON.
أداة تحويل للحالة الأخرى
أحياناً تريد فعلاً ملف بيانات واحداً. يمسح potato transcripts مجلداً، ويزاوج كل نص تفريغي مع وسائطه بالاسم الأساسي، ويشتق معرّفات العناصر من أسماء الملفات، ويكتب النتيجة:
potato transcripts ./whisper_out --media-dir ./audio -o data/interviews.jsonولا يكتب --dry-run شيئاً بل يخبرك بما وجده، وهو أيضاً أول ما ينبغي تشغيله حين يُعرَض نص تفريغي ككتلة واحدة غير متمايزة:
Scanned 3 file(s):
interview_01.json Whisper JSON 42 turns 891.4s undiarized
interview_02.json WhisperX JSON 51 turns 1120.8s 2 speaker(s): SPEAKER_00, SPEAKER_01
interview_03.json Whisper JSON 38 turns 754.2s undiarized
3 item(s), 131 turn(s).
والملف الذي يُبلَّغ عنه بأنه plain text هو في الغالب الأعم ملف .txt من Whisper اختلط بمخرجات .json. فملف .txt بلا أي توقيتات إطلاقاً، ولا يمكنك استرجاعها دون إعادة تشغيل النموذج. وتلك الحقيقة وحدها تفسّر معظم بلاغات "لماذا يبدو نصي التفريغي خاطئاً" التي تصلنا.
ويطبع --emit-config ملف config.yaml مطابقاً إلى جانب ملف البيانات.
مفردات واحدة عبر أربعة مخططات
كان كل من audio_dialogue وspeech_transcript وvoice_interaction وtiered_annotation يحلّل بيانات النص التفريغي بطريقته ويقبل مجموعات جزئية مختلفة من الصيغ، دون سبب يستطيع أحد صياغته. وقد صارت الآن تتشارك مُوحِّداً واحداً، فما يقبله أحدها تقبله الأربعة.
ولا تتأثر التهيئات القائمة. فكل مخطط يحتفظ بتحليله القديم بوصفه بديلاً احتياطياً، وكل شكل نص تفريغي كان يعمل من قبل ما زال يعمل بايتاً ببايت.
ويكسب tiered_annotation أيضاً تعبئة مسبقة اختيارية من النص التفريغي. وجّه transcript_field إلى نصك التفريغي فتصل طبقة معبّأة مسبقاً، فيصحّح المعلّقون محاذاة موجودة بدل إعادة تقطيع الكلام من الصفر:
- annotation_type: tiered_annotation
name: tiers
source_field: audio_url
media_type: audio
tiers:
- name: utterance
labels:
- name: speech
color: "#7c3aed"ولا تُحفَظ الفترات المعبّأة مسبقاً حتى يعدّلها معلّق فعلاً، فلا يُنسب أي بذرة لم تُمسّ إلى عمل بشري.
ما لا يزال Potato لا يفعله
لا يفرّغ، ولا يفصل المتحدثين. فالتعرّف على الكلام يجري قبله. وPotato يقرأ ما أنتجه مسارك.
ويُثار هذا لأن Potato يشغّل فعلاً نموذج Whisper محلياً، من أجل وضع Think-Aloud، الذي يسجّل المعلّقين وهم يتحدثون أثناء عملهم. وتلك ميزة تسجيل موجّهة إلى معلّقيك لا إلى متنك. شيء مختلف، وكلمة واحدة.
وتُحلَّل الثقة على مستوى الكلمة وتُحفظ في نموذج البيانات حيثما وفّرها المصدر، لكن لا توجد بعد واجهة لعرضها.
وبعض الصيغ بلا محلّل إطلاقاً: SAMI، وMicroDVD، وSubViewer، وTranscriber .trs، وEXMARaLDA، وCHAT/CHILDES، وRTTM بمفرده، والمخرجات الأصلية لـ Montreal Forced Aligner أو Gentle. حوّل هذه أولاً. ونحن ننشر تلك القائمة لأن قائمة صيغ مدعومة لا يُستثنى منها شيء لا تساوي كثيراً.
الوثائق
- صيغ النصوص التفريغية — كل صيغة مع قاعدة استنتاجها، ونموذج الأدوار الموحّد، وقواعد الملفات المرافقة، ومفاتيح التهيئة، ومعالجة المشكلات مربوطة بأعراض حقيقية
- كيفية شرح نصوص Whisper التفريغية — أي ملف مخرجات تحتفظ به، ولماذا فصل المتحدثين قرار منفصل
- كيفية شرح ترجمات YouTube —
yt-dlp، وما تدعمه الترجمات التلقائية وما لا تدعمه - Transcript Format Ingestion — تصميم قابل للتشغيل بست صيغ جنباً إلى جنب
الترقية
pip install --upgrade potato-annotation==2.7.1لا تحتاج إلى تغيير أي تهيئة. فكل شكل نص تفريغي كان Potato يقبله من قبل ما زال يقبله.