درّب نماذج الكلام والصوت على تعليقاتك التوضيحية
درّب تمييز المتحدثين على مقاطع RTTM المصحّحة، واضبط Whisper ضبطاً دقيقاً على النصوص المصحّحة، ودرّب كاشفات النداءات على المربعات المرسومة على المخططات الطيفية.
جديد في v2.14.0
يدرّب هذا الدرس نماذج للكلام والصوت على الإجابات التي يعطيها المعلّقون في Potato، ويعيد مخرجات كل نموذج إلى المعلّقين بوصفها تصنيفات مسبقة. الصفحة موجّهة إلى صاحب دراسة يصحّح بالفعل نصوصاً أو مقاطع متحدثين أو نداءات حيوانات في Potato ويريد نموذجاً يتعلّم من هذه التصحيحات. يستورد المسار الرئيسي ملف تمييز متحدثين، ويجعل المعلّقين يصحّحون مقاطع المتحدثين، ويدرّب نموذج تمييز على المقاطع المصحّحة، ويصدّر التصحيحات بصيغة RTTM. ثم تضبط ثلاثة أقسام أقصر نموذج Whisper ضبطاً دقيقاً على مقاطع النصوص المصحّحة، وتدرّب كاشف مربعات على المخططات الطيفية، وتدرّب واسماً لأحداث الصوت على الشكل الموجي. وللاطلاع على حلقة التدريب عموماً، اقرأ أولاً نظرة عامة على تدريب النماذج، ثم درّب نموذجك الأول إن لم تبدأ تشغيلة من قبل.
مُدرِّبات الصوت الأربعة
يتعلّم كل مُدرِّب من نوع واحد من المخططات، وتعرض صفحة التدريب للمخطط المُدرِّبات التي تناسبه فقط:
| المُدرِّب | يتعلّم من | النموذج | درجة العناصر المحجوزة | التثبيت |
|---|---|---|---|---|
diarization | طبقة المتحدثين في مخطط tiered_annotation، أو مخطط audio_annotation تكون تصنيفاته متحدثين | مرمِّز كلام، وهو WavLM افتراضياً | دقة التمييز (1 − DER) | potato-annotation[train-audio] |
whisper-asr | المقاطع التي صحّحها المعلّقون في مخطط speech_transcript | Whisper، وهو whisper-small افتراضياً | دقة الكلمات (1 − WER) | potato-annotation[train-audio] |
torchvision-detect، ultralytics-detect | مربعات مخطط spectrogram_annotation | كاشف Faster R-CNN أو YOLO على مخططات طيفية معروضة | mAP عند IoU بقيمة 0.5 | potato-annotation[train-vision]، أو pip install ultralytics (AGPL-3.0) |
hf-audio-tagger | المقاطع المصنّفة في مخطط audio_annotation | مرمِّز كلام، وهو wav2vec 2.0 افتراضياً | F1 للمقاطع عند IoU بقيمة 0.5 | potato-annotation[train-audio] |
يقرأ كل مُدرِّب صوت التسجيلات من ملفات على قرص الخادم يفتحها soundfile، مثل WAV وFLAC وOGG، وMP3 مع libsndfile حديثة. يسمّي مسار مثل /media/meet000.wav ملفاً في مجلد media/ ضمن مجلد المهمة، وهو المجلد الذي تشغّل منه صفحة التعليق التسجيلات. العنصر الذي تسجيله عنوان http(s) يُستبعد من التدريب مع تحذير. نزّل التسجيلات البعيدة إلى media/ قبل التدريب. ويسرد مرجع المُدرِّبات كل معامل.
ثبّت المُدرِّبات في البيئة التي تشغّل Potato:
pip install "potato-annotation[train-audio]"تثبّت إضافة [train-audio] كلاً من PyTorch وtransformers وsoundfile. تحتاج كاشفات المخططات الطيفية إلى [train-vision] بدلاً منها، أو إلى pip install "potato-annotation[train]" لكل مُدرِّبات النص والصور والصوت والنماذج اللغوية الكبيرة دفعة واحدة. يبقى المُدرِّب الذي تنقصه حِزمه في صفحة التدريب بعبارة "not installed" مع الأمر الذي يثبّت الحِزم.
استيراد تمييز المتحدثين بصيغة ملف RTTM
يقسّم تمييز المتحدثين التسجيل إلى مقاطع بحسب من يتكلم. يكتب pyannote وNeMo نتائج التمييز بصيغة RTTM، وهي صيغة نصية بسطر SPEAKER واحد لكل مقطع، ويقيّم dscore وmd-eval ملفات RTTM. يسمّي السطر معرّف ملف التسجيل والقناة وبداية المقطع ومدته بالثواني والمتحدث:
SPEAKER meet000 1 0.200 1.055 <NA> <NA> SPEAKER_01 <NA> <NA>
SPEAKER meet000 1 1.539 0.755 <NA> <NA> SPEAKER_00 <NA> <NA>ضع ملفات RTTM والتسجيلات في مجلد واحد، مع تسمية كل تسجيل باسم معرّف ملفه (meet000.wav لـ meet000)، واستورد المجلد:
potato import -f rttm -i diarization/ -o interviews \
--speaker-map "SPEAKER_00=Interviewer,SPEAKER_01=Guest"يصنع المستورِد عنصراً واحداً لكل تسجيل، وينسخ التسجيل إلى interviews/media/، ويكتب config.yaml وdata/diarization.jsonl وملف README. في مشروع الاختبار المكوّن من 16 تسجيلاً الذي بُنيت عليه هذه الصفحة، كان سطر الملخص:
Imported 16 item(s), 1 question(s), 0 answer(s) from 0 annotator(s), and 16 model suggestion(s) on 16 item(s) from RTTM speaker diarization.يقبل المستورِد ثلاث رايات خاصة به:
--rttm-scheme audio|tieredيختار المخطط الذي تقع عليه المقاطع. الخيار الافتراضيaudioيصنع مخططaudio_annotationاسمهspeakersتصنيفاته هي المتحدثون. ويصنعtieredمخططtiered_annotationاسمهtiersبطبقةspeakerواحدة. استخدمtieredلدراسة تنسخ لاحقاً مقطعاً بعد مقطع.--speaker-mapيعيد تسمية المتحدثين، ويحتفظ المتحدث الذي لا تسمّيه الخريطة باسمه في RTTM. استخدم الخريطة فقط حين يعني الاسم الشخص نفسه في كل التسجيلات. تعطي أداة التمييز أرقام المتحدثين داخل كل ملف، وقد يكونSPEAKER_00في مقابلة وSPEAKER_00في التي تليها شخصين مختلفين.--media-dir DIRيسمّي المجلد الذي يضم التسجيلات حين لا تكون التسجيلات بجانب ملفات RTTM.
لا يقرأ المستورِد إلا أسطر SPEAKER ويحصي أنواع الأسطر الأخرى متخطّاة. وتُتخطى كذلك المقاطع ذات الطول الصفري، والمقاطع ذات البداية السالبة، والمقاطع التي لا اسم متحدث لها (<NA>)، والمقطع المذكور مرتين. يفصل RTTM بين الحقول بمسافات، ويقرأ المستورِد اسم المتحدث الذي يحتوي مسافة حتى المسافة فقط، مع تحذير. ويغطي استيراد مشروع الاستيراد بالكامل.
تهيئة التمييز
تعرض التهيئة المولَّدة المقاطع المستوردة بوصفها تعليقات مسبقة بالفعل. أضف مفتاح مسؤول وكتلة model_training إلى نهاية config.yaml. يجتاز الملف الكامل أدناه python -m potato.validate_cli config.yaml --strict:
port: 8000
annotation_task_name: diarization (imported)
task_dir: .
output_annotation_dir: annotation_output/
data_files:
- data/diarization.jsonl
item_properties:
id_key: id
text_key: text
user_config:
allow_all_users: true
users: []
site_dir: default
pre_annotation:
enabled: true
field: predictions
allow_modification: true
annotation_schemes:
- annotation_type: audio_annotation
name: speakers
description: Check and correct who speaks when.
source_field: audio_url
mode: label
labels:
- name: Guest
- name: Interviewer
admin_api_key: "change-me"
model_training:
enabled: trueيرتّب المستورِد تصنيفات المتحدثين أبجدياً، وتأتي Guest قبل Interviewer. وتذهب الكتابة الراجعة للنموذج إلى حقل العنصر predictions افتراضياً، وهو الحقل نفسه الذي تقرؤه كتلة pre_annotation في الاستيراد. يرفض Potato أن يبدأ حين تسمّي كتلة pre_annotation مفعّلة حقلاً يختلف عن writeback.field، لأنه لن يظهر عندئذ أي تصنيف مسبق ناتج عن التدريب. اترك writeback خارج التهيئة إلى أن تكون لدى التشغيلة الأولى درجة عناصر محجوزة تستحق العرض على المعلّقين.
تصحيح مقاطع المتحدثين
شغّل الخادم من مجلد المشروع:
cd interviews
potato start config.yaml -p 8000يُفتح كل تسجيل ومقاطع أداة التمييز مرسومة على الشكل الموجي. يحرّك المعلّقون حواف المقطع، ويغيّرون متحدثه، ويحذفون مقطع ضوضاء، ويرسمون أي مقطع فاتته أداة التمييز. لا تُخزَّن التعليقات المسبقة إلا بعد أن يحفظ المعلّق العنصر. والعنصر الذي لم يفتحه أحد لا إجابة له ولا يدخل التدريب. ويغطي تعليق تمييز المتحدثين عناصر التحكم في الشكل الموجي واختصارات لوحة المفاتيح.
يحتاج مُدرِّب diarization إلى 4 تسجيلات معلّقة على الأقل في قسم train، ويضع التقسيم الافتراضي نحو 70% من التسجيلات المصنّفة في train. صحّح 8 تسجيلات على الأقل قبل التشغيلة الأولى، وأكثر للحصول على درجة عناصر محجوزة يمكن الوثوق بها.
تدريب نموذج التمييز
افتح http://localhost:8000/admin، وأدخل مفتاح المسؤول، وانتقل إلى /admin/training. اختر diarization مُدرِّباً وspeakers مخططاً. وتعرض صفحة التدريب أيضاً hf-audio-tagger للمخطط نفسه. يناسب hf-audio-tagger التصنيفات التي تسمّي أنواعاً من الأصوات لا متحدثين. لمقابلات الشخصين، اضبط حقل Parameters على:
{"max_speakers": 2}انقر Train now. ويمكن بدء التشغيلة نفسها من سكربت بمفتاح المسؤول:
curl -X POST -H "X-API-Key: change-me" -H "Content-Type: application/json" \
http://localhost:8000/admin/training/api/runs \
-d '{"trainer": "diarization", "schemas": ["speakers"], "params": {"max_speakers": 2}}'يتبع diarization وصفة نموذج التجزئة في pyannote (Bredin and Laurent, 2021) من دون pyannote ومن دون أوزانها المقيَّدة، ويضبط WavLM (microsoft/wavlm-base-plus) ضبطاً دقيقاً بمصنِّف إطارات لما يصل إلى max_speakers من المتحدثين. يرى النموذج chunk_s ثانية من الصوت في كل مرة، وهي 10 افتراضياً. تُحسب خسارة كل جزء بأفضل مطابقة بين مخرجات النموذج للمتحدثين والمتحدثين المعلّقين في الجزء. المطابقة مهمة لأن اسم المتحدث يشير إلى أشخاص مختلفين في تسجيلات مختلفة، ولن يكون لمصنِّف على الأسماء هدف متسق. وتحدّد المعاملات أدناه شكل المقاطع المتنبَّأ بها:
| المعامل | القيمة الافتراضية | الأثر |
|---|---|---|
max_speakers | 3 | أكثر المتحدثين نشاطاً داخل جزء واحد، حتى 6 |
chunk_s | 10 | عدد الثواني التي يراها النموذج دفعة واحدة |
threshold | 0.5 | احتمال الإطار الذي يُعدّ عنده المتحدث متكلماً |
min_gap_s، min_duration_s | 0.2، 0.2 | تُغلق الفجوة الأقصر داخل المقطع، ويُسقط المقطع الأقصر |
model_name | microsoft/wavlm-base-plus | نقطة حفظ WavLM أو wav2vec 2.0، أو مسار محلي |
يرسل التدريب عن بُعد التشغيلة إلى خادم GPU عبر ssh أو إلى عنقود SLURM.
قراءة درجة التمييز
تذكر صفحة التشغيلة وGET /admin/training/api/status درجة التشغيلة على التسجيلات المحجوزة. بالنسبة إلى diarization، الدرجة الرئيسية هي diarization_accuracy، وتُعرَّف بأنها 1 ناقص معدل خطأ التمييز (DER) مع حدّ أدنى 0. يجمع DER الكلام الفائت والإنذار الكاذب والخلط بين المتحدثين ويقسم المجموع على الكلام المعلّق. يقيس Potato قيمة DER على شبكة 10 ms من دون هامش، بأفضل تقابل واحد لواحد بين المتحدثين المتنبَّأ بهم والمعلّقين. وتذكر التشغيلة أنواع الأخطاء الثلاثة كلاً على حدة أيضاً. اقرأ الأرقام الثلاثة لتعرف هل يفوّت النموذج كلاماً أم يخترع كلاماً أم يخلط بين المتحدثين. لا يهتم DER بكون المقطع اسمه Interviewer أو SPEAKER_01، ويحسب هل يتغير المتحدث في الأوقات الصحيحة.
يتضمن اسم المقياس القسم، كما في val_der أو test_diarization_accuracy. والتسجيل الذي له مقاطع معلّقة ولا تنبؤ له يُحتسب خاطئاً. فلا يستطيع النموذج إذن رفع الدرجة بتخطي التسجيلات الصعبة.
نشر المقاطع المتنبَّأ بها
حين تسوّغ درجة العناصر المحجوزة عرض مقاطع النموذج على المعلّقين، أضف المخطط إلى writeback وأعد تشغيل الخادم:
model_training:
enabled: true
writeback:
schemas: [speakers]
include_unlabeled: trueيتنبأ include_unlabeled: true أيضاً على التسجيلات التي لم يصحّحها أحد بعد. ومن دون هذا الإعداد، تتنبأ التشغيلة على تسجيلات val وtest المحجوزة فقط. درّب مرة أخرى بعد إعادة التشغيل. ويعطي تقرير الكتابة الراجعة في GET /admin/training/api/status العدد. في مشروع الاختبار، قال التقرير "Published 7 prediction(s) as prelabels." لـ 3 تسجيلات في val و4 تسجيلات غير مصحّحة، واحتفظت التسجيلات في قسم train بمقاطع RTTM المستوردة.
يسمّي النموذج المتحدثين بحسب ترتيب أول كلام داخل كل تسجيل، مستخدماً تصنيفات المخطط أولاً ثم SPEAKER_00 وSPEAKER_01 وهكذا. فأول متحدث يُسمع في كل تسجيل هو Guest في هذا المشروع، سواء كان ذلك الشخص هو الضيف أم لا. ليس لدى النموذج بصمات صوتية يتعرّف بها على شخص. والمتحدث الذي يصمت خلال التداخل بين جزأين ثم يتكلم لاحقاً مرة أخرى يحصل على اسم جديد. أخبر المعلّقين أن يفحصوا اسم المتحدث في كل مقطع متنبَّأ به، لا حواف المقطع فقط. ويغطي النموذج في الحلقة مراجعة التصنيفات المسبقة بادئاً بأقلها ثقة وإعادة التدريب مع وصول التصحيحات.
تصدير المقاطع المصحّحة بصيغة RTTM
يكتب تصدير segments المقاطع المصحّحة من جديد بصيغة RTTM، ملفاً لكل معلّق:
python -m potato.export --config config.yaml --format segments --output ./export/يكتب التصدير export/segments.jsonl، بصف لكل مقطع، وexport/rttm/<annotator>.rttm. معرّف الملف في كل سطر RTTM هو اسم التسجيل من دون امتداده. ثم يستطيع pyannote.metrics أو dscore أو md-eval تقييم مخرجات أداة التمييز الأصلية مقابل الملف المصحّح من دون تعديل. في مشروع الاختبار، كانت الأسطر الأولى من export/rttm/ana.rttm:
SPEAKER meet000 1 0.200 1.055 <NA> <NA> Guest <NA> <NA>
SPEAKER meet000 1 1.539 0.755 <NA> <NA> Interviewer <NA> <NA>التمييز على طبقة متحدثين
استورد مع --rttm-scheme tiered حين سيضيف المعلّقون طبقات أخرى، مثل طبقة نسخ، إلى الخط الزمني نفسه:
potato import -f rttm -i diarization/ -o interviews --rttm-scheme tieredيكتب الاستيراد مخطط tiered_annotation اسمه tiers بطبقة speaker واحدة. أضف admin_api_key وmodel_training كما سبق، مع schemas: [tiers] تحت writeback، فتجتاز التهيئة validate_cli --strict. يتدرّب diarization على طبقة المتحدثين ويكتب المقاطع المتنبَّأ بها على الطبقة نفسها. يختار المُدرِّب الطبقة المسمّاة speaker أو speakers. وإن لم توجد، يختار الطبقة الوحيدة التي يحتوي اسمها "speaker"، ولا تُحتسب طبقة اسمها non-speaker. والملاذ الأخير هو الطبقة الوحيدة التي لها تصنيفات. وحين تتأهل طبقتان، أو يكون لعدة طبقات تصنيفات ولا تُسمّى أي منها باسم المتحدثين، تستبعد التشغيلة التسجيلات مع تحذير يسمّي الطبقات.
ضبط Whisper ضبطاً دقيقاً على النصوص المصحّحة
يضبط whisper-asr نموذج Whisper ضبطاً دقيقاً على مقاطع النص التي صحّحها المعلّقون، ثم يقترح تصحيحات على المقاطع التي لم يفحصها أحد. يبدأ القسم من مجلد تسجيلات بلا نص.
تفريغ التسجيلات نصياً
ضع التسجيلات في مجلد media/ في المشروع وفرّغها نصياً على جهاز الخادم:
pip install "potato-annotation[transcribe]"
potato transcripts media --transcribe --asr-model small.en --asr-word-timestamps \
--media-url-prefix /media -o data/interviews.jsonيشغّل potato transcripts --transcribe أداة WhisperX حين تكون WhisperX مثبّتة وتعمل على الجهاز، وfaster-whisper بخلاف ذلك. تثبّت إضافة [transcribe] الأداة faster-whisper، أما WhisperX فتثبيت منفصل (pip install whisperx) يجلب PyTorch خاصتها. يعود Potato إلى faster-whisper حين تكون WhisperX مفقودة، أو لا تُستورد، أو لا تعمل على الجهاز، أو لا تحمّل النموذج، ويسمّي الملخص المحرّك لكل ملف. ويشغّل --asr-engine whisperx أو --asr-engine faster-whisper محركاً واحداً من دون ملاذ احتياطي. ويكتب --media-url-prefix /media مسار كل تسجيل بصيغة /media/<file>، وهو العنوان الذي تشغّل منه صفحة التعليق التسجيل.
يؤقّت --asr-word-timestamps كل كلمة بمحاذاة قسرية ويتيح لـ WhisperX تقسيم المقطع عند نهاية الجملة. في تسجيلات الاختبار، أعادت WhisperX مقطعاً واحداً لكل تسجيل مدته 10 ثوانٍ من دون الراية وثلاثة مقاطع لكل تسجيل معها. تعطي المقاطع الأقصر whisper-asr أمثلة أكثر، ونافذة إدخال Whisper 30 ثانية. ويغطي صيغ النصوص وكيف تعلّق نصوص Whisper خيارات التفريغ وتسميات المتحدثين ومخرجات Whisper الموجودة.
تهيئة النص
يعرض مخطط speech_transcript كل مقطع من النص مع مدته الزمنية وصندوق تصحيح. تجتاز التهيئة الكاملة أدناه validate_cli --strict:
annotation_task_name: "Interview transcript correction"
task_dir: .
output_annotation_dir: annotation_output/
data_files:
- data/interviews.json
item_properties:
id_key: id
text_key: conversation
admin_api_key: "change-me"
annotation_schemes:
- annotation_type: speech_transcript
name: transcript
description: "Play each turn and type the right text wherever the transcript is wrong."
segments_key: conversation
error_types: [asr_error]
model_training:
enabled: true
trainer_params:
whisper-asr:
model_name: openai/whisper-small
language: enيسمّي segments_key: conversation الحقل الذي يكتب potato transcripts النص تحته. ويترك error_types: [asr_error] علامة خطأ واحدة، لأن الدراسة تغطي أخطاء التفريغ فقط. ويثبّت language: en اللغة للتدريب والتنبؤ. وإذا تُركت من دون ضبط، يكتشف Whisper متعدد اللغات اللغة مرة واحدة من حتى 16 مقطع تدريب، ويحذّر سجل التشغيلة حين يتفق أقل من ثلاثة من كل أربعة من المقاطع المأخوذة.
المقاطع المصحّحة أمثلةَ تدريب
كل مقطع مصحّح مثال واحد، يتكوّن من صوت المقطع المقتطع من التسجيل ببداية المقطع ونهايته، مع النص المصحّح. المقطع الذي لم يصحّحه أحد ليس مثالاً، لأن المخطط لا يحفظ إلا المقاطع التي لمسها معلّق، وقد يكون المقطع الذي لم يُلمس صحيحاً وقد يكون غير مقروء. والمقطع الموسوم من دون تصحيح ليس مثالاً أيضاً. وتُستبعد المقاطع الأطول من 30 ثانية مع تحذير. يرفض المُدرِّب أن يعمل بأقل من 10 مقاطع مصحّحة في قسم train.
صحّح كل مقطع خاطئ في التسجيلات التي تفتحها، لأن درجة العناصر المحجوزة تُحسب على المقاطع المصحّحة. في تسجيلات الاختبار الـ 12، أخطأت WhisperX مع tiny.en في 11 مقطعاً من 36، بأخطاء مثل "Epsilanti" بدل Ypsilanti و"Cary Town" بدل Kerrytown وإسقاط "I" في أول مقطع.
التدريب والمقارنة بالنص
اختر whisper-asr والمخطط transcript في صفحة التدريب وانقر Train now. الدرجة الرئيسية هي word_accuracy، أي 1 ناقص معدل خطأ الكلمات (WER) على المقاطع المصحّحة. وتذكر التشغيلة أيضاً wer_asr، وهو WER للنص الأصلي على المقاطع نفسها، ويُقيَّم المقطع الذي تركه النموذج على حاله بنص التفريغ. قارن الرقمين قبل نشر أي شيء. لا يستحق النموذج المضبوط ضبطاً دقيقاً العرض على المعلّقين إلا حين يقل WER الخاص به عن wer_asr.
تبيّن تشغيلة الاختبار التي بُنيت عليها هذه الصفحة سبب أهمية المقارنة. مع 8 مقاطع مصحّحة في train، وخفض min_instances إلى 4، وتدريب openai/whisper-tiny لـ 3 حقب، سجّلت التشغيلة WER على test بقيمة 0.31 مقابل 0.19 للنص الأصلي. نموذج بهذا المستوى سيستبدل نصاً صحيحاً بنص خاطئ. اجمع مزيداً من التصحيحات، أو ابدأ من نقطة حفظ أكبر، ودرّب مرة أخرى قبل إضافة writeback.
نشر التصحيحات المقترحة
حين يتفوق النموذج على النص، أضف المخطط إلى writeback، وأعد التشغيل، ودرّب مرة أخرى:
model_training:
enabled: true
trainer_params:
whisper-asr:
model_name: openai/whisper-small
language: en
writeback:
schemas: [transcript]
include_unlabeled: trueيفرّغ التنبؤ كل مقطع في كل تسجيل محجوز وغير مصنّف. والمقطع الذي يختلف نصه الجديد عن النص الأصلي يصبح تصحيحاً مقترحاً، موسوماً asr_error، ومتوسط احتمال رموز النموذج هو ثقة الاقتراح. تملأ الاقتراحات صناديق التصحيح، ويُبقي المعلّق كل اقتراح أو يحرّره أو يمحوه.
تفريغ تسجيلات جديدة بالنموذج المضبوط ضبطاً دقيقاً
تكتب التشغيلة افتراضياً أيضاً ct2/، وهي نسخة CTranslate2 بدقة int8 من النموذج، ضمن نواتج التشغيلة. تحتاج النسخة إلى حزمة ctranslate2، التي تثبّتها إضافة [transcribe] مع faster-whisper. مرّر مسار النسخة إلى potato transcripts لتفرّغ الدفعة التالية من التسجيلات بالنموذج المضبوط ضبطاً دقيقاً:
potato transcripts media/batch2 --transcribe \
--asr-model annotation_output/training/runs/<run_id>/artifacts/ct2 \
--media-url-prefix /media/batch2 -o data/batch2.jsonتحمّل WhisperX وfaster-whisper كلتاهما النسخة. وتعرض صفحة التشغيلة معرّف كل تشغيلة، ويصف التهيئة مجلدات التشغيلات.
كشف النداءات على المخططات الطيفية
في مخطط spectrogram_annotation يرسم المعلّقون مربعات زمنية-ترددية حول النداءات. يتدرّب torchvision-detect وultralytics-detect على هذه المربعات بعرض كل تسجيل صورةَ مخطط طيفي بالطريقة التي ترسم بها الأداة المخطط الطيفي. يضع العرض التردد على محور خطي من min_freq في المخطط إلى max_freq، أو نصف معدل العيّنة حين لا يُضبط max_freq، بارتفاع 256 بكسلاً و100 بكسل لكل ثانية. يصبح كل مربع مربعاً على الصورة. يرتبط الزمن والتردد بالبكسلات خطياً. فيساوي IoU للمربع على الصورة قيمة IoU للمربع بالثواني في الهرتز. والمربع الذي لا نطاق تردد له، كما يعطي وسم Audacity أو صف BirdNET، يغطي النطاق كله. ويُعرض التسجيل البالغ 41 ثانية أو أكثر بعرض 4096 بكسلاً على الأقل ويُقطَّع إلى نوافذ ثم يُعاد وصله.
تأتي المربعات عادةً من استيراد. يقرأ potato import جداول اختيار Raven ومسارات وسوم Audacity ومخرجات BirdNET-Analyzer إلى مشروع spectrogram_annotation، كما يصف الصوتيات الحيوية في Potato وتحقّق من كشوف BirdNET على مخطط طيفي. وتتعلّم المُدرِّبات من المربعات التي رسمها المعلّقون أو صحّحوها، وتقرأ الكاشفات بكسلات المخطط الطيفي لا تضمينات BirdNET أو Perch.
تجتاز التهيئة أدناه validate_cli --strict وتضبط score_threshold للكاشف على 0.5:
annotation_task_name: "Dawn chorus calls"
task_dir: .
output_annotation_dir: annotation_output/
data_files:
- data/recordings.jsonl
item_properties:
id_key: id
text_key: id
admin_api_key: "change-me"
annotation_schemes:
- annotation_type: spectrogram_annotation
name: calls
description: "Draw a box around each call and pick its type."
source_field: audio_url
max_freq: 8000
labels:
- name: whistle
- name: chirp
model_training:
enabled: true
trainer_params:
torchvision-detect:
score_threshold: 0.5
writeback:
schemas: [calls]
include_unlabeled: trueيمتد طيف تسجيل بتردد 16 kHz حتى 8 kHz، ويعرض max_freq: 8000 النطاق كله. ويُبقي score_threshold الافتراضي 0.25 مزيداً من تخمينات الكاشف. في مشروع الاختبار المكوّن من 24 تسجيلاً، تنبأ torchvision-detect عند العتبة الافتراضية بـ 34 مربعاً لـ 10 نداءات معلّقة في تسجيلات test، وكل مربع زائد هو مربع آخر يحذفه المعلّق.
يسمّي كل صف بيانات تسجيله، كما في {"id": "site_00", "audio_url": "/media/site_00.wav"}. لا يتدرّب الكاشف إلا على التسجيلات التي فيها مربع واحد على الأقل، لأن التسجيل الذي لا مربعات فيه يبدو كالتسجيل الذي لم يفحصه أحد. وتحتاج الكاشفات إلى 20 تسجيلاً معلّقاً في قسم train افتراضياً (min_instances).
يضبط torchvision-detect نموذج Faster R-CNN من أوزان COCO في torchvision ضبطاً دقيقاً، ويدرّب ultralytics-detect كاشف YOLO. كاشف YOLO أسرع في التدريب وفي التشغيل. Ultralytics مرخّصة بـ AGPL-3.0، والنموذج المدرَّب والموزَّع باستخدام Ultralytics خاضع لشروط AGPL. وتطلب صفحة التدريب منك تأكيد الترخيص قبل تشغيلة ultralytics-detect، وتحتاج تشغيلة الـ API إلى "accept_licence": true. وتُقيَّم الكاشفان كلاهما بـ mAP عند IoU بقيمة 0.5 على المخطط الطيفي المعروض، ويكتب كلاهما المربعات المتنبَّأ بها راجعةً في start_s وend_s وlow_hz وhigh_hz، موسومة بأنها مخرجات نموذج، لتملأ الأداة مسبقاً. ويغطي نماذج الرؤية معاملات الكاشفات والتبليط.
وسم أحداث الصوت بـ hf-audio-tagger
يتعلّم hf-audio-tagger المقاطع الزمنية المصنّفة في مخطط audio_annotation، مثل الكلام أو الموسيقى أو النداءات أو السعال. يضبط المُدرِّب مرمِّز كلام، وهو facebook/wav2vec2-base افتراضياً، ضبطاً دقيقاً ليقول أي التصنيفات نشطة في كل إطار مدته نحو 20 ms. يُقيَّم كل تصنيف على حدة. فتُتعلَّم المقاطع المتداخلة ذات التصنيفات المختلفة كما عُلّقت. وتعود المقاطع المتنبَّأ بها مناطق قابلة للتحرير على الشكل الموجي. تجتاز التهيئة أدناه validate_cli --strict:
annotation_task_name: "Dawn chorus events"
task_dir: .
output_annotation_dir: annotation_output/
data_files:
- data/recordings.jsonl
item_properties:
id_key: id
text_key: id
admin_api_key: "change-me"
annotation_schemes:
- annotation_type: audio_annotation
name: events
description: "Mark every call on the waveform and pick its type."
source_field: audio_url
mode: label
labels:
- name: whistle
- name: chirp
model_training:
enabled: true
writeback:
schemas: [events]
include_unlabeled: trueيعامل الواسم أي امتداد من التسجيل لم يعلّمه أي معلّق على أنه "لا تصنيف هنا". يناسب هذا الافتراض دراسة يعلّم فيها المعلّقون كل حدث، ويطلب وصف المخطط أعلاه "every call". وحيث يعلّم المعلّقون بعض الأحداث فقط، يتعلّم النموذج أن يفوّت الباقي. الدرجة الرئيسية هي F1 للمقاطع، حيث يطابق المقطع المتنبَّأ به مقطعاً معلّقاً بالتصنيف نفسه عند IoU بقيمة 0.5 على الأقل، وتذكر التشغيلة أيضاً متوسط IoU للمقاطع المتطابقة. يحتاج المُدرِّب إلى 10 تسجيلات معلّقة في قسم train افتراضياً.
| المعامل | القيمة الافتراضية | الأثر |
|---|---|---|
window_s | 10 | ثواني الصوت في كل نافذة تدريب وتنبؤ |
threshold | 0.5 | احتمال الإطار الذي يكون عنده التصنيف نشطاً |
min_gap_s، min_duration_s | 0.1، 0.1 | تُغلق الفجوة الأقصر داخل المقطع، ويُسقط المقطع الأقصر |
freeze_feature_encoder | true | يُبقي طبقات الميزات الالتفافية في المرمِّز ثابتة |
تعرض صفحة التدريب hf-audio-tagger وdiarization كليهما لمخطط audio_annotation. اختر hf-audio-tagger حين يسمّي التصنيف نوعاً من الصوت ويعني الشيء نفسه في كل تسجيل. واختر diarization حين تكون التصنيفات متحدثين تكون أسماؤهم محلية لكل تسجيل.
التشغيلات التي بُنيت عليها هذه الصفحة
شُغّلت الأوامر والتهيئات في هذه الصفحة على Potato 2.14.0 في حاسوب محمول، بالنماذج الأصغر المسمّاة أدناه. جرى مسار التمييز من البداية إلى النهاية، من استيراد RTTM لـ 16 تسجيلاً اصطناعياً بمتحدثين اثنين أُعطي 20% من مقاطعها متحدثاً خاطئاً، مروراً بتصحيحات على 12 تسجيلاً، وتشغيلة diarization، والكتابة الراجعة، وصولاً إلى تصدير segments. واستخدمت التشغيلة مرمِّز اختبار بطبقة واحدة بدل WavLM. فلا تدل درجة التشغيلة إذن على شيء بشأن الكلام الحقيقي. واستخدم قسم Whisper 12 تسجيلاً لكلام مولَّد صناعياً، فرّغته WhisperX نصياً بـ tiny.en وضُبط ضبطاً دقيقاً من openai/whisper-tiny. واستخدم قسما المخطط الطيفي والواسم 24 تسجيلاً اصطناعياً لنغمات عند 3 kHz و6 kHz. وتجتاز كل كتلة تهيئة python -m potato.validate_cli --strict.
قراءات إضافية
- نظرة عامة على تدريب النماذج تشرح حلقة التدريب وصفحة التدريب ودرجات العناصر المحجوزة.
- المُدرِّبات تسرد كل مُدرِّب مع مخططاته وتثبيته ومعاملاته.
- التهيئة توثّق كل مفتاح في
model_trainingوالكتابة الراجعة والمسارات. - النموذج في الحلقة تغطي مراجعة التصنيفات المسبقة وإعادة التدريب آلياً.
- تعليق الصوت تجهّز مهام التصنيف والأحداث والتفريغ والتمييز.
- صيغ النصوص تسرد كل صيغة نصوص يقرؤها Potato.
- يوثّق المرجع في المستودع الأصلي
diarizationوwhisper-asrوhf-audio-taggerوالمخططات الطيفية معاملاً معاملاً.
المراجع
- Bain, M., Huh, J., Han, T., and Zisserman, A. (2023). WhisperX: Time-Accurate Speech Transcription of Long-Form Audio. Interspeech 2023, 4489–4493. doi:10.21437/Interspeech.2023-78
- Bredin, H., and Laurent, A. (2021). End-To-End Speaker Segmentation for Overlap-Aware Resegmentation. Interspeech 2021, 3111–3115. doi:10.21437/Interspeech.2021-560
- Chen, S., Wang, C., Chen, Z., Wu, Y., Liu, S., Chen, Z., Li, J., Kanda, N., Yoshioka, T., Xiao, X., Wu, J., Zhou, L., Ren, S., Qian, Y., Qian, Y., Wu, J., Zeng, M., Yu, X., and Wei, F. (2022). WavLM: Large-Scale Self-Supervised Pre-Training for Full Stack Speech Processing. IEEE Journal of Selected Topics in Signal Processing. doi:10.1109/JSTSP.2022.3188113
- Radford, A., Kim, J. W., Xu, T., Brockman, G., McLeavey, C., and Sutskever, I. (2023). Robust Speech Recognition via Large-Scale Weak Supervision. Proceedings of the 40th International Conference on Machine Learning, PMLR 202, 28492–28518. proceedings.mlr.press