सामग्री पर जाएं

अपने एनोटेशन पर स्पीच और ऑडियो मॉडल प्रशिक्षित करें

सुधारे गए RTTM टर्न पर स्पीकर डायराइज़ेशन प्रशिक्षित करें, सुधारे गए ट्रांसक्रिप्ट पर Whisper फ़ाइन-ट्यून करें, और स्पेक्ट्रोग्राम पर बनाए बॉक्स पर कॉल डिटेक्टर प्रशिक्षित करें।

v2.14.0 में नया

यह ट्यूटोरियल Potato में एनोटेटरों के दिए उत्तरों पर स्पीच और ऑडियो मॉडल प्रशिक्षित करता है और हर मॉडल का आउटपुट एनोटेटरों को प्री-लेबल के रूप में वापस भेजता है। पेज उस अध्ययन स्वामी के लिए लिखा गया है जो Potato में पहले से ट्रांसक्रिप्ट, स्पीकर टर्न या जानवरों की आवाज़ें सुधारता है और ऐसा मॉडल चाहता है जो उन सुधारों से सीखे। मुख्य रास्ता एक स्पीकर डायराइज़ेशन फ़ाइल इम्पोर्ट करता है, एनोटेटरों से स्पीकर टर्न सुधरवाता है, सुधारे गए टर्न पर डायराइज़ेशन मॉडल प्रशिक्षित करता है, और सुधारों को RTTM के रूप में निर्यात करता है। फिर तीन छोटे अनुभाग Whisper को सुधारे गए ट्रांसक्रिप्ट टर्न पर फ़ाइन-ट्यून करते हैं, स्पेक्ट्रोग्राम पर बॉक्स डिटेक्टर प्रशिक्षित करते हैं, और वेवफ़ॉर्म पर ध्वनि घटनाओं का टैगर प्रशिक्षित करते हैं। सामान्य प्रशिक्षण चक्र के लिए पहले मॉडल प्रशिक्षण का अवलोकन पढ़ें, और अगर आपने कभी रन शुरू नहीं किया तो अपना पहला मॉडल प्रशिक्षित करें।

चार ऑडियो ट्रेनर

हर ट्रेनर एक प्रकार की स्कीम से सीखता है, और Training पेज किसी स्कीम के लिए केवल वही ट्रेनर देता है जो उस स्कीम पर बैठते हैं:

ट्रेनरकिससे सीखता हैमॉडलहोल्ड-आउट स्कोरइंस्टॉल
diarizationtiered_annotation स्कीम का स्पीकर टियर, या ऐसी audio_annotation स्कीम जिसके लेबल स्पीकर हैंस्पीच एनकोडर, डिफ़ॉल्ट रूप से WavLMडायराइज़ेशन accuracy (1 − DER)potato-annotation[train-audio]
whisper-asrspeech_transcript स्कीम में एनोटेटरों के सुधारे गए टर्नWhisper, डिफ़ॉल्ट रूप से whisper-smallशब्द accuracy (1 − WER)potato-annotation[train-audio]
torchvision-detect, ultralytics-detectspectrogram_annotation स्कीम के बॉक्सरेंडर किए स्पेक्ट्रोग्राम पर Faster R-CNN या YOLO डिटेक्टरIoU 0.5 पर mAPpotato-annotation[train-vision], या pip install ultralytics (AGPL-3.0)
hf-audio-taggeraudio_annotation स्कीम के लेबल किए सेगमेंटस्पीच एनकोडर, डिफ़ॉल्ट रूप से wav2vec 2.0IoU 0.5 पर सेगमेंट F1potato-annotation[train-audio]

हर ऑडियो ट्रेनर रिकॉर्डिंग सर्वर की डिस्क की उन फ़ाइलों से पढ़ता है जिन्हें soundfile खोलता है, जैसे WAV, FLAC या OGG, और नई libsndfile के साथ MP3। /media/meet000.wav जैसा पथ टास्क डायरेक्टरी के media/ फ़ोल्डर की फ़ाइल का नाम देता है, वही फ़ोल्डर जहाँ से एनोटेशन पेज रिकॉर्डिंग चलाता है। जिस आइटम की रिकॉर्डिंग http(s) URL है, वह चेतावनी के साथ प्रशिक्षण से बाहर रखा जाता है। प्रशिक्षण से पहले रिमोट रिकॉर्डिंग को media/ में डाउनलोड करें। ट्रेनर संदर्भ हर पैरामीटर सूचीबद्ध करता है।

ट्रेनर उस परिवेश में इंस्टॉल करें जो Potato चलाता है:

bash
pip install "potato-annotation[train-audio]"

[train-audio] एक्स्ट्रा PyTorch, transformers और soundfile इंस्टॉल करता है। स्पेक्ट्रोग्राम डिटेक्टरों को इसके बजाय [train-vision] चाहिए, या सभी टेक्स्ट, चित्र, ऑडियो और LLM ट्रेनर एक साथ पाने के लिए pip install "potato-annotation[train]"। जिस ट्रेनर के पैकेज गायब हैं वह Training पेज पर "not installed" के रूप में बना रहता है, साथ में पैकेज इंस्टॉल करने की कमांड।

डायराइज़ेशन को RTTM फ़ाइल के रूप में इम्पोर्ट करना

स्पीकर डायराइज़ेशन रिकॉर्डिंग को इस आधार पर टर्न में बाँटता है कि कौन बोल रहा है। pyannote और NeMo डायराइज़ेशन को RTTM के रूप में लिखते हैं, जो प्रति टर्न एक SPEAKER पंक्ति वाला टेक्स्ट फ़ॉर्मेट है, और dscore तथा md-eval RTTM फ़ाइलों को स्कोर करते हैं। एक पंक्ति रिकॉर्डिंग की फ़ाइल id, चैनल, टर्न की शुरुआत और अवधि सेकंड में, और स्पीकर का नाम देती है:

text
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 फ़ाइलें और रिकॉर्डिंग एक फ़ोल्डर में रखें, हर रिकॉर्डिंग का नाम उसकी फ़ाइल id पर हो (meet000 के लिए meet000.wav), और फ़ोल्डर इम्पोर्ट करें:

bash
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-रिकॉर्डिंग परीक्षण प्रोजेक्ट पर सारांश पंक्ति यह थी:

text
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 speakers नाम की audio_annotation स्कीम बनाता है जिसके लेबल स्पीकर हैं। tiered tiers नाम की tiered_annotation स्कीम बनाता है जिसमें एक speaker टियर है। जिस अध्ययन में बाद में टर्न-दर-टर्न ट्रांसक्रिप्शन होगा, उसके लिए tiered इस्तेमाल करें।
  • --speaker-map स्पीकर का नाम बदलता है, और जिस स्पीकर का नाम मैप में नहीं है वह अपना RTTM नाम रखता है। मैप तभी इस्तेमाल करें जब कोई नाम हर रिकॉर्डिंग में एक ही व्यक्ति का हो। डायराइज़र स्पीकरों को हर फ़ाइल के भीतर क्रमांकित करता है, और एक इंटरव्यू का SPEAKER_00 और अगले का SPEAKER_00 अलग व्यक्ति हो सकते हैं।
  • --media-dir DIR उस फ़ोल्डर का नाम देता है जिसमें रिकॉर्डिंग हैं, जब रिकॉर्डिंग RTTM फ़ाइलों के बगल में नहीं हैं।

इम्पोर्टर केवल SPEAKER पंक्तियाँ पढ़ता है और अन्य पंक्ति प्रकारों को छोड़ी गई गिनता है। शून्य लंबाई वाले टर्न, ऋणात्मक शुरुआत वाले टर्न, बिना स्पीकर नाम (<NA>) के टर्न, और दो बार सूचीबद्ध टर्न भी छोड़ दिए जाते हैं। RTTM फ़ील्ड को स्पेस से अलग करता है, और इम्पोर्टर स्पेस वाला स्पीकर नाम चेतावनी के साथ केवल स्पेस तक पढ़ता है। प्रोजेक्ट इम्पोर्ट करना इम्पोर्ट को पूरा कवर करता है।

डायराइज़ेशन config

बना हुआ config पहले से इम्पोर्ट किए टर्न को प्री-एनोटेशन के रूप में दिखाता है। config.yaml के अंत में एडमिन कुंजी और एक model_training ब्लॉक जोड़ें। नीचे की पूरी फ़ाइल python -m potato.validate_cli config.yaml --strict पास करती है:

yaml
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 ब्लॉक पढ़ता है। जब चालू pre_annotation ब्लॉक writeback.field से अलग फ़ील्ड का नाम देता है तब Potato शुरू होने से मना कर देता है, क्योंकि तब कोई प्रशिक्षण प्री-लेबल दिखेगा ही नहीं। जब तक पहले रन का ऐसा होल्ड-आउट स्कोर न हो जो एनोटेटरों को दिखाने लायक हो, तब तक config से writeback बाहर रखें।

स्पीकर टर्न सुधारना

प्रोजेक्ट फ़ोल्डर से सर्वर शुरू करें:

bash
cd interviews
potato start config.yaml -p 8000

हर रिकॉर्डिंग डायराइज़र के टर्न के साथ खुलती है जो वेवफ़ॉर्म पर बने होते हैं। एनोटेटर टर्न के किनारे हिलाते हैं, टर्न का स्पीकर बदलते हैं, शोर का टर्न हटाते हैं, और डायराइज़र से छूटा कोई भी टर्न बनाते हैं। प्री-एनोटेशन तभी सहेजे जाते हैं जब एनोटेटर आइटम को सेव करता है। जिस आइटम को किसी ने नहीं खोला उसका कोई उत्तर नहीं होता और वह प्रशिक्षित नहीं होता। स्पीकर डायराइज़ेशन एनोटेशन वेवफ़ॉर्म नियंत्रण और कीबोर्ड शॉर्टकट कवर करता है।

diarization ट्रेनर को train स्प्लिट में कम से कम 4 एनोटेट की गई रिकॉर्डिंग चाहिए, और डिफ़ॉल्ट स्प्लिट लेबल की गई रिकॉर्डिंग का लगभग 70% train में रखता है। पहले रन से पहले कम से कम 8 रिकॉर्डिंग सुधारें, और भरोसेमंद होल्ड-आउट स्कोर के लिए और अधिक।

डायराइज़ेशन मॉडल प्रशिक्षित करना

http://localhost:8000/admin खोलें, एडमिन कुंजी डालें, और /admin/training पर जाएँ। ट्रेनर के रूप में diarization और स्कीम के रूप में speakers चुनें। Training पेज उसी स्कीम के लिए hf-audio-tagger भी देता है। hf-audio-tagger उन लेबलों के लिए ठीक है जो स्पीकर के बजाय ध्वनि के प्रकार का नाम देते हैं। दो-व्यक्ति के इंटरव्यू के लिए Parameters फ़ील्ड को यह रखें:

json
{"max_speakers": 2}

Train now पर क्लिक करें। वही रन एडमिन कुंजी के साथ स्क्रिप्ट से शुरू किया जा सकता है:

bash
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 या उसके गेटेड वज़न के बिना, और max_speakers तक स्पीकरों के लिए फ़्रेम क्लासिफ़ायर के साथ WavLM (microsoft/wavlm-base-plus) को फ़ाइन-ट्यून करता है। मॉडल एक बार में chunk_s सेकंड का ऑडियो देखता है, डिफ़ॉल्ट रूप से 10। हर चंक का लॉस मॉडल के स्पीकर आउटपुट के चंक के एनोटेट किए स्पीकरों से सबसे अच्छे मिलान के अंतर्गत गिना जाता है। मिलान इसलिए मायने रखता है कि स्पीकर का नाम अलग-अलग रिकॉर्डिंग में अलग लोगों का होता है, और नामों पर क्लासिफ़ायर के पास कोई एकसमान लक्ष्य नहीं होगा। नीचे के पैरामीटर अनुमानित टर्न को आकार देते हैं:

पैरामीटरडिफ़ॉल्टप्रभाव
max_speakers3एक चंक में सक्रिय स्पीकरों की अधिकतम संख्या, 6 तक
chunk_s10मॉडल एक बार में कितने सेकंड देखता है
threshold0.5वह फ़्रेम प्रायिकता जिस पर स्पीकर बोलता हुआ गिना जाता है
min_gap_s, min_duration_s0.2, 0.2टर्न के भीतर इससे छोटा अंतराल भर दिया जाता है, और इससे छोटा टर्न हटा दिया जाता है
model_namemicrosoft/wavlm-base-plusWavLM या wav2vec 2.0 चेकपॉइंट, या कोई स्थानीय पथ

रिमोट प्रशिक्षण रन को ssh से GPU सर्वर या 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 में जोड़ें और सर्वर पुनः आरंभ करें:

yaml
model_training:
  enabled: true
  writeback:
    schemas: [speakers]
    include_unlabeled: true

include_unlabeled: true उन रिकॉर्डिंग पर भी भविष्यवाणी करता है जिन्हें अभी किसी ने नहीं सुधारा। इस सेटिंग के बिना रन केवल होल्ड-आउट val और test रिकॉर्डिंग पर भविष्यवाणी करता है। पुनः आरंभ के बाद फिर से प्रशिक्षित करें। GET /admin/training/api/status की राइट-बैक रिपोर्ट गिनती देती है। परीक्षण प्रोजेक्ट पर रिपोर्ट में 3 val रिकॉर्डिंग और 4 बिना सुधारी रिकॉर्डिंग के लिए "Published 7 prediction(s) as prelabels." लिखा था, और train स्प्लिट की रिकॉर्डिंग ने इम्पोर्ट किए RTTM टर्न रखे।

मॉडल हर रिकॉर्डिंग के भीतर पहली स्पीच के क्रम में स्पीकरों को नाम देता है, पहले स्कीम के लेबल और फिर SPEAKER_00, SPEAKER_01 और इसी तरह आगे। इसलिए हर रिकॉर्डिंग में सुना गया पहला स्पीकर इस प्रोजेक्ट में Guest है, चाहे वह व्यक्ति गेस्ट हो या नहीं। मॉडल के पास किसी व्यक्ति को पहचानने वाले वॉइस एम्बेडिंग नहीं हैं। जो स्पीकर दो चंक के ओवरलैप में चुप रहता है और बाद में फिर बोलता है, उसे नया नाम मिलता है। एनोटेटरों से कहें कि हर अनुमानित टर्न का स्पीकर नाम जाँचें, केवल टर्न के किनारे नहीं। चक्र में मॉडल प्री-लेबल को सबसे कम विश्वास वाले पहले समीक्षा करने और सुधार आने पर दोबारा प्रशिक्षित करने को कवर करता है।

सुधारे गए टर्न को RTTM के रूप में निर्यात करना

segments निर्यात सुधारे गए टर्न को RTTM के रूप में वापस लिखता है, प्रति एनोटेटर एक फ़ाइल:

bash
python -m potato.export --config config.yaml --format segments --output ./export/

निर्यात export/segments.jsonl, प्रति टर्न एक पंक्ति, और export/rttm/<annotator>.rttm लिखता है। हर RTTM पंक्ति में फ़ाइल id रिकॉर्डिंग का नाम है, एक्सटेंशन के बिना। pyannote.metrics, dscore या md-eval फिर डायराइज़र के मूल आउटपुट को सुधारी गई फ़ाइल के विरुद्ध बिना बदलाव स्कोर कर सकते हैं। परीक्षण प्रोजेक्ट पर export/rttm/ana.rttm की पहली पंक्तियाँ ये थीं:

text
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 के साथ इम्पोर्ट करें:

bash
potato import -f rttm -i diarization/ -o interviews --rttm-scheme tiered

इम्पोर्ट एक speaker टियर वाली tiers नाम की tiered_annotation स्कीम लिखता है। ऊपर की तरह admin_api_key और model_training जोड़ें, writeback के अंतर्गत schemas: [tiers] के साथ, और config validate_cli --strict पास करता है। diarization स्पीकर टियर पर प्रशिक्षित होता है और अनुमानित टर्न उसी टियर पर वापस लिखता है। ट्रेनर speaker या speakers नाम का टियर चुनता है। वह न हो तो ट्रेनर वह एक टियर चुनता है जिसके नाम में "speaker" है, और non-speaker नाम का टियर नहीं गिना जाता। आख़िरी विकल्प वह एकमात्र टियर है जिसमें लेबल हैं। जब दो टियर योग्य हों, या कई टियर में लेबल हों और कोई स्पीकर के नाम पर न हो, तब रन रिकॉर्डिंग को उन टियर के नाम बताने वाली चेतावनी के साथ छोड़ देता है।

सुधारे गए ट्रांसक्रिप्ट पर Whisper फ़ाइन-ट्यून करना

whisper-asr Whisper को एनोटेटरों के सुधारे ट्रांसक्रिप्ट टर्न पर फ़ाइन-ट्यून करता है, फिर उन टर्न पर सुधार सुझाता है जिन्हें किसी ने जाँचा नहीं। अनुभाग बिना ट्रांसक्रिप्ट वाली रिकॉर्डिंग के फ़ोल्डर से शुरू होता है।

रिकॉर्डिंग को ट्रांसक्राइब करना

रिकॉर्डिंग को प्रोजेक्ट के media/ फ़ोल्डर में रखें और उन्हें सर्वर की मशीन पर ट्रांसक्राइब करें:

bash
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 साथ लाता है। जब WhisperX गायब हो, इम्पोर्ट न हो, डिवाइस पर न चल सके, या मॉडल लोड न कर सके, तब Potato faster-whisper पर लौट आता है, और सारांश हर फ़ाइल के लिए इंजन का नाम बताता है। --asr-engine whisperx या --asr-engine faster-whisper बिना फ़ॉलबैक के एक ही इंजन चलाता है। --media-url-prefix /media हर रिकॉर्डिंग का पथ /media/<file> के रूप में लिखता है, यानी वह पता जहाँ से एनोटेशन पेज रिकॉर्डिंग चलाता है।

--asr-word-timestamps हर शब्द का समय forced alignment से तय करता है और WhisperX को वाक्य के अंत पर सेगमेंट बाँटने देता है। परीक्षण रिकॉर्डिंग पर WhisperX ने फ़्लैग के बिना 10-सेकंड की हर रिकॉर्डिंग के लिए एक टर्न दिया और फ़्लैग के साथ हर रिकॉर्डिंग के लिए तीन टर्न। छोटे टर्न whisper-asr को अधिक उदाहरण देते हैं, और Whisper की इनपुट विंडो 30 सेकंड की है। ट्रांसक्रिप्ट फ़ॉर्मेट और Whisper ट्रांसक्रिप्ट कैसे एनोटेट करें ट्रांसक्रिप्शन विकल्प, स्पीकर लेबल और मौजूदा Whisper आउटपुट को कवर करते हैं।

ट्रांसक्रिप्ट config

speech_transcript स्कीम ट्रांसक्रिप्ट का हर टर्न उसकी समय अवधि और सुधार बॉक्स के साथ दिखाती है। नीचे का पूरा config validate_cli --strict पास करता है:

yaml
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 सेकंड से लंबे टर्न चेतावनी के साथ छोड़ दिए जाते हैं। train स्प्लिट में 10 से कम सुधारे गए टर्न होने पर ट्रेनर चलने से मना कर देता है।

जिन रिकॉर्डिंग को आप खोलें उनका हर गलत टर्न सुधारें, क्योंकि होल्ड-आउट स्कोर सुधारे गए टर्न पर गिना जाता है। 12 परीक्षण रिकॉर्डिंग पर tiny.en के साथ WhisperX के 36 में से 11 टर्न गलत थे, जिनमें Ypsilanti के लिए "Epsilanti", Kerrytown के लिए "Cary Town", और टर्न की शुरुआत में छूटा "I" जैसी त्रुटियाँ थीं।

प्रशिक्षण और ट्रांसक्रिप्ट से तुलना

Training पेज पर whisper-asr और transcript स्कीम चुनें और Train now पर क्लिक करें। मुख्य स्कोर word_accuracy है, जो सुधारे गए टर्न पर 1 घटा शब्द त्रुटि दर (WER) है। रन wer_asr भी रिपोर्ट करता है, यानी उन्हीं टर्न पर मूल ट्रांसक्रिप्ट का WER, और जिस टर्न को मॉडल ने छुआ नहीं वह ट्रांसक्रिप्ट के टेक्स्ट के रूप में स्कोर होता है। कुछ भी प्रकाशित करने से पहले दोनों संख्याओं की तुलना करें। फ़ाइन-ट्यून किया मॉडल एनोटेटरों को तभी दिखाने लायक है जब मॉडल का WER wer_asr से कम हो।

इस पेज के पीछे का परीक्षण रन दिखाता है कि तुलना क्यों मायने रखती है। train में 8 सुधारे गए टर्न, min_instances घटाकर 4, और 3 epoch प्रशिक्षित openai/whisper-tiny के साथ रन ने test WER 0.31 स्कोर किया, जबकि मूल ट्रांसक्रिप्ट का 0.19 था। उस स्तर का मॉडल सही टेक्स्ट को गलत टेक्स्ट से बदल देता। अधिक सुधार इकट्ठा करें, या बड़े चेकपॉइंट से शुरू करें, और writeback जोड़ने से पहले फिर से प्रशिक्षित करें।

सुझाए गए सुधार प्रकाशित करना

जब मॉडल ट्रांसक्रिप्ट से बेहतर हो जाए, तब स्कीम को writeback में जोड़ें, पुनः आरंभ करें और फिर से प्रशिक्षित करें:

yaml
model_training:
  enabled: true
  trainer_params:
    whisper-asr:
      model_name: openai/whisper-small
      language: en
  writeback:
    schemas: [transcript]
    include_unlabeled: true

भविष्यवाणी हर होल्ड-आउट और बिना लेबल वाली रिकॉर्डिंग के हर टर्न को ट्रांसक्राइब करती है। जिस टर्न का नया टेक्स्ट ट्रांसक्रिप्ट से अलग हो वह asr_error से फ़्लैग किया सुझाया गया सुधार बन जाता है, और सुझाव का विश्वास मॉडल की औसत टोकन प्रायिकता है। सुझाव सुधार बॉक्स भर देते हैं, और एनोटेटर हर सुझाव को रखता, संपादित करता या मिटाता है।

फ़ाइन-ट्यून किए मॉडल से नई रिकॉर्डिंग ट्रांसक्राइब करना

डिफ़ॉल्ट रूप से रन रन के आर्टिफ़ैक्ट में ct2/ भी लिखता है, जो मॉडल की int8 CTranslate2 प्रति है। प्रति को ctranslate2 पैकेज चाहिए, जिसे [transcribe] एक्स्ट्रा faster-whisper के साथ इंस्टॉल करता है। रिकॉर्डिंग के अगले बैच को फ़ाइन-ट्यून किए मॉडल से ट्रांसक्राइब करने के लिए प्रति का पथ potato transcripts को दें:

bash
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 दोनों प्रति को लोड करते हैं। रन का पेज हर रन का id दिखाता है, और कॉन्फ़िगरेशन रन फ़ोल्डर समझाता है।

स्पेक्ट्रोग्राम पर कॉल पहचानना

spectrogram_annotation स्कीम में एनोटेटर कॉल के चारों ओर समय-आवृत्ति के बॉक्स बनाते हैं। torchvision-detect और ultralytics-detect उन बॉक्स पर प्रशिक्षित होते हैं, हर रिकॉर्डिंग को वैसे ही स्पेक्ट्रोग्राम चित्र के रूप में रेंडर करके जैसे विजेट स्पेक्ट्रोग्राम बनाता है। रेंडरिंग आवृत्ति को स्कीम के min_freq से max_freq तक, या max_freq सेट न होने पर नमूना दर के आधे तक, रैखिक अक्ष पर रखती है, 256 पिक्सेल ऊँचाई और प्रति सेकंड 100 पिक्सेल पर। हर बॉक्स चित्र का बॉक्स बन जाता है। समय और आवृत्ति रैखिक रूप से पिक्सेल पर मैप होते हैं। इसलिए चित्र पर बॉक्स का IoU सेकंड गुणा हर्ट्ज़ में बॉक्स के IoU के बराबर है। जिस बॉक्स में आवृत्ति सीमा नहीं है, जैसा Audacity लेबल या BirdNET पंक्ति देती है, वह पूरा बैंड कवर करता है। 41 सेकंड या अधिक की रिकॉर्डिंग कम से कम 4,096 पिक्सेल चौड़ी रेंडर होती है और विंडो में काटकर वापस जोड़ी जाती है।

बॉक्स आमतौर पर इम्पोर्ट से आते हैं। potato import Raven सिलेक्शन तालिकाएँ, Audacity लेबल ट्रैक और BirdNET-Analyzer आउटपुट को spectrogram_annotation प्रोजेक्ट में पढ़ता है, जैसा Potato में बायोएकॉस्टिक्स और स्पेक्ट्रोग्राम पर BirdNET डिटेक्शन सत्यापित करें बताते हैं। ट्रेनर उन बॉक्स से सीखते हैं जिन्हें एनोटेटरों ने बनाया या सुधारा, और डिटेक्टर BirdNET या Perch एम्बेडिंग के बजाय स्पेक्ट्रोग्राम पिक्सेल पढ़ते हैं।

नीचे का config validate_cli --strict पास करता है और डिटेक्टर का score_threshold 0.5 सेट करता है:

yaml
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 ने test रिकॉर्डिंग के 10 एनोटेट किए कॉल के लिए 34 बॉक्स का अनुमान लगाया, और हर अतिरिक्त बॉक्स एनोटेटर के हटाने के लिए एक और बॉक्स है।

हर डेटा पंक्ति अपनी रिकॉर्डिंग का नाम देती है, जैसे {"id": "site_00", "audio_url": "/media/site_00.wav"}। डिटेक्टर केवल उन रिकॉर्डिंग पर प्रशिक्षित होता है जिनमें कम से कम एक बॉक्स है, क्योंकि बिना बॉक्स की रिकॉर्डिंग उस रिकॉर्डिंग जैसी दिखती है जिसे किसी ने जाँचा नहीं। डिटेक्टरों को डिफ़ॉल्ट रूप से train स्प्लिट में 20 एनोटेट की गई रिकॉर्डिंग चाहिए (min_instances)।

torchvision-detect torchvision के COCO वज़न से Faster R-CNN को फ़ाइन-ट्यून करता है, और ultralytics-detect YOLO डिटेक्टर प्रशिक्षित करता है। YOLO डिटेक्टर प्रशिक्षित करने और चलाने में तेज़ है। Ultralytics AGPL-3.0 के अंतर्गत लाइसेंस प्राप्त है, और Ultralytics से प्रशिक्षित और वितरित मॉडल AGPL की शर्तों के अधीन है। Training पेज ultralytics-detect रन से पहले आपसे लाइसेंस की पुष्टि माँगता है, और API रन को "accept_licence": true चाहिए। दोनों डिटेक्टर रेंडर किए स्पेक्ट्रोग्राम पर IoU 0.5 के mAP से स्कोर होते हैं, और दोनों अनुमानित बॉक्स start_s, end_s, low_hz और high_hz में, मॉडल आउटपुट के रूप में चिह्नित करके, विजेट को पहले से भरने के लिए वापस लिखते हैं। विज़न मॉडल डिटेक्टरों के पैरामीटर और टाइलिंग कवर करता है।

hf-audio-tagger से ध्वनि घटनाओं को टैग करना

hf-audio-tagger audio_annotation स्कीम के लेबल किए समय सेगमेंट सीखता है, जैसे स्पीच, संगीत, कॉल या खाँसी। ट्रेनर स्पीच एनकोडर को, डिफ़ॉल्ट रूप से facebook/wav2vec2-base, यह बताने के लिए फ़ाइन-ट्यून करता है कि लगभग 20 ms के हर फ़्रेम में कौन-से लेबल सक्रिय हैं। हर लेबल अलग से स्कोर होता है। इसलिए अलग लेबल वाले ओवरलैप करते सेगमेंट वैसे ही सीखे जाते हैं जैसे एनोटेट किए गए। अनुमानित सेगमेंट वेवफ़ॉर्म पर संपादन योग्य क्षेत्रों के रूप में वापस जाते हैं। नीचे का config validate_cli --strict पास करता है:

yaml
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 है, जहाँ अनुमानित सेगमेंट उसी लेबल वाले एनोटेट सेगमेंट से कम से कम 0.5 के IoU पर मेल खाता है, और रन मेल खाए सेगमेंट का औसत IoU भी रिपोर्ट करता है। ट्रेनर को डिफ़ॉल्ट रूप से train स्प्लिट में 10 एनोटेट की गई रिकॉर्डिंग चाहिए।

पैरामीटरडिफ़ॉल्टप्रभाव
window_s10प्रति प्रशिक्षण और भविष्यवाणी विंडो ऑडियो के सेकंड
threshold0.5वह फ़्रेम प्रायिकता जिस पर लेबल सक्रिय होता है
min_gap_s, min_duration_s0.1, 0.1सेगमेंट के भीतर इससे छोटा अंतराल भर दिया जाता है, और इससे छोटा सेगमेंट हटा दिया जाता है
freeze_feature_encodertrueएनकोडर की कन्वोल्यूशनल फ़ीचर परतों को स्थिर रखता है

Training पेज audio_annotation स्कीम के लिए hf-audio-tagger और diarization दोनों देता है। जब लेबल किसी ध्वनि के प्रकार का नाम देता है और हर रिकॉर्डिंग में एक ही अर्थ रखता है, तब hf-audio-tagger चुनें। जब लेबल ऐसे स्पीकर हैं जिनके नाम हर रिकॉर्डिंग के लिए स्थानीय हैं, तब diarization चुनें।

इस पेज के पीछे के रन

इस पेज की कमांड और config Potato 2.14.0 पर लैपटॉप पर, नीचे नामित छोटे मॉडल के साथ चलाए गए। डायराइज़ेशन का रास्ता शुरू से अंत तक चला, जिसमें 20% टर्न को गलत स्पीकर देकर बनाई गई 16 कृत्रिम दो-स्पीकर रिकॉर्डिंग का RTTM इम्पोर्ट, 12 रिकॉर्डिंग पर सुधार, diarization रन और राइट-बैक, और segments निर्यात तक सब शामिल था। रन ने WavLM की जगह एक-परत वाला परीक्षण एनकोडर इस्तेमाल किया। इसलिए रन का स्कोर असली स्पीच के बारे में कुछ नहीं बताता। Whisper अनुभाग में संश्लेषित स्पीच की 12 रिकॉर्डिंग इस्तेमाल हुईं, जिन्हें tiny.en के साथ WhisperX ने ट्रांसक्राइब किया और openai/whisper-tiny से फ़ाइन-ट्यून किया गया। स्पेक्ट्रोग्राम और टैगर अनुभागों ने 3 kHz और 6 kHz के टोन की 24 कृत्रिम रिकॉर्डिंग इस्तेमाल कीं। हर config ब्लॉक python -m potato.validate_cli --strict पास करता है।

आगे पढ़ें

संदर्भ

  • 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