Skip to content
Announcements6 min read

Potato 2.7.1: ट्रांसक्रिप्ट तो पहले से मौजूद है

Potato 2.7.1 इक्कीस ट्रांसक्रिप्ट और सबटाइटल प्रारूप सीधे पढ़ता है, उन्हें आपके मीडिया के बग़ल में पड़ी साइडकार फ़ाइलों से लोड करता है, और एक कन्वर्टर देता है जो ASR आउटपुट के पूरे फ़ोल्डर को एनोटेशन के लिए तैयार डेटा फ़ाइल में बदल देता है।

Potato Team

एनोटेशन टूल तक शायद ही कोई सिर्फ़ कच्चा ऑडियो लेकर आता है। लोग ट्रांसक्रिप्ट लेकर आते हैं। किसी ने इंटरव्यू के फ़ोल्डर पर Whisper चला रखा है। किसी ने सौ कॉन्फ़्रेंस टॉक से कैप्शन खींच लिए हैं। किसी को 2019 में ख़त्म हुई किसी फ़ील्डवर्क परियोजना से TextGrid का पूरा संग्रह विरासत में मिला है।

और फिर टूल उनसे कन्वर्ज़न स्क्रिप्ट लिखने को कहता है।

Potato 2.7.1 इसी क़दम को हटाने के बारे में है। यह 21 ट्रांसक्रिप्ट और सबटाइटल प्रारूप सीधे पढ़ता है, सब कुछ किसी डेटा फ़ाइल में चिपकाने की माँग करने के बजाय उन्हें आपके मीडिया के बग़ल में पड़ी फ़ाइलों से लोड करता है, और उस सूरत के लिए एक कन्वर्टर भी देता है जब आपको आख़िर में एक ही डेटा फ़ाइल चाहिए।

Potato 2.7.1: भीतर 21 ट्रांसक्रिप्ट प्रारूप, बाहर एक ही टर्न मॉडलPotato 2.7.1

भीतर 21 प्रारूप, बाहर एक मॉडल

पहले 6 थे। पूरी सूची ट्रांसक्रिप्ट प्रारूप पृष्ठ पर है, पर मोटे तौर पर: नौ तरह के ASR आउटपुट (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 भेज दीजिए।

पहचान फ़ाइल एक्सटेंशन के बजाय डेटा की बनावट से होती है, यानी captions.txt नाम की WebVTT फ़ाइल फिर भी WebVTT की तरह पढ़ी जाती है, और इसका मतलब यह भी है कि वही ट्रांसक्रिप्ट कॉन्फ़िग बदले बिना भीतर लिखा हुआ या डिस्क से पढ़ा हुआ, दोनों तरह चलता है।

जहाँ स्रोत उपलब्ध कराता है, वहाँ शब्द-स्तरीय समय और प्रति-खंड कॉन्फ़िडेंस बचाकर रखे जाते हैं। जो प्रारूप मूल रूप से शब्द-स्तरीय हैं, जैसे CTM, Deepgram और AssemblyAI, उन्हें वक्ता बदलने और एक ठहराव सीमा के आधार पर टर्न में समूहित कर दिया जाता है।

एक ट्रांसक्रिप्ट रंगीन वक्ता बुलबुलों के रूप में, हर टर्न पर अपना प्ले बटन और साथ में एक लेबलिंग प्रश्नभीतर जो भी प्रारूप गया हो, बाहर यही निकलता है

साइडकार फ़ाइलें

आपके ASR टूल ने फ़ाइलें पहले ही समझदार व्यवस्था में लिख दी हैं: मीडिया यहाँ, ट्रांसक्रिप्ट उसके बग़ल में। आपसे उसे किसी डेटा ब्लॉब में चपटा करवाने की कोई अच्छी वजह नहीं थी, इसलिए अब आप सीधे उसी पर इशारा कर सकते हैं:

json
{"id": "int_001", "conversation": {"audio": "media/int_001.mp3",
                                   "transcript": "media/int_001.srt"}}

पथ task_dir के सापेक्ष हल होते हैं और हर दूसरे कॉन्फ़िगर किए गए पथ जैसी ही डायरेक्ट्री-ट्रैवर्सल जाँच से गुज़रते हैं। अगर आपके डेटा में सचमुच एक पंक्ति के ट्रांसक्रिप्ट हैं जो संयोग से फ़ाइल नाम जैसे दिखते हैं, तो transcript_is_path: false इस अनुमान को बंद कर देता है।

व्यावहारिक फ़ायदा यह है कि आपके ट्रांसक्रिप्ट फ़ाइलें ही बने रहते हैं। आप उनका diff ले सकते हैं, उन्हें दोबारा बना सकते हैं, और किसी और को दे सकते हैं, बजाय इसके कि उनकी एक प्रति किसी JSON सरणी के भीतर जीवाश्म बन जाए।

दूसरी सूरत के लिए एक कन्वर्टर

कभी-कभी आपको एक ही डेटा फ़ाइल चाहिए होती है। potato transcripts फ़ोल्डर पर ग्लोब चलाता है, हर ट्रांसक्रिप्ट को मूल नाम से उसके मीडिया के साथ जोड़ता है, फ़ाइल नामों से आइटम आईडी निकालता है, और नतीजा लिख देता है:

bash
potato transcripts ./whisper_out --media-dir ./audio -o data/interviews.json

--dry-run कुछ लिखता नहीं और बता देता है कि उसे क्या मिला, और जब कोई ट्रांसक्रिप्ट एक ही बेतरतीब ब्लॉक की तरह दिखे तो सबसे पहले यही चलाना चाहिए:

text
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 बताती है, वह लगभग हमेशा Whisper की कोई .txt होती है जो .json आउटपुट के बीच घुल-मिल गई है। .txt में समय होते ही नहीं, और मॉडल दोबारा चलाए बिना उन्हें वापस नहीं पाया जा सकता। “मेरा ट्रांसक्रिप्ट ग़लत क्यों दिख रहा है” वाली ज़्यादातर रिपोर्टों के पीछे यही एक बात होती है।

--emit-config डेटा फ़ाइल के साथ-साथ मिलती-जुलती config.yaml भी छाप देता है।

चार स्कीमा, एक शब्दावली

audio_dialogue, speech_transcript, voice_interaction और tiered_annotation, चारों पहले ट्रांसक्रिप्ट डेटा अपने-अपने ढंग से पढ़ते थे और प्रारूपों के अलग-अलग उपसमुच्चय स्वीकार करते थे, और इसकी कोई वजह कोई नहीं बता सकता था। अब वे एक ही नॉर्मलाइज़र साझा करते हैं, इसलिए जो एक स्वीकार करता है वह चारों स्वीकार करते हैं।

मौजूदा कॉन्फ़िग पर कोई असर नहीं पड़ता। हर स्कीमा अपनी पुरानी पार्सिंग को फ़ॉलबैक के रूप में रखता है, और हर वह ट्रांसक्रिप्ट बनावट जो पहले चलती थी, अब भी अक्षरशः चलती है।

tiered_annotation को ट्रांसक्रिप्ट से स्तर पहले से भरने का विकल्प भी मिलता है। transcript_field को अपने ट्रांसक्रिप्ट पर लगाइए और एक स्तर भरा-भराया आ जाता है, ताकि एनोटेटर शून्य से भाषण दोबारा विभाजित करने के बजाय मौजूदा संरेखण सुधारें:

yaml
  - annotation_type: tiered_annotation
    name: tiers
    source_field: audio_url
    media_type: audio
    tiers:
      - name: utterance
        labels:
          - name: speech
            color: "#7c3aed"

पहले से भरे गए अंतराल तब तक सहेजे नहीं जाते जब तक कोई एनोटेटर सचमुच उन्हें बदल न दे, इसलिए बिना छुए रह गया कोई भराव कभी इंसानी काम के खाते में नहीं चढ़ता।

Potato अब भी क्या नहीं करता

यह ट्रांसक्रिप्शन नहीं करता, और डायराइज़ेशन भी नहीं करता। ASR पहले चलता है। Potato वही पढ़ता है जो आपकी पाइपलाइन ने बनाया।

यह बात इसलिए उठती है क्योंकि Potato एक लोकल Whisper मॉडल चलाता है, Think-Aloud मोड के लिए, जो एनोटेटरों को काम करते-करते बोलते हुए रिकॉर्ड करता है। वह आपके एनोटेटरों के लिए बनी रिकॉर्डिंग सुविधा है, आपके संग्रह के लिए नहीं। अलग चीज़, वही शब्द।

जहाँ स्रोत देता है वहाँ शब्द-स्तरीय कॉन्फ़िडेंस पढ़ा जाकर डेटा मॉडल में रखा जाता है, पर उसे देखने के लिए फ़िलहाल कोई इंटरफ़ेस नहीं है।

और कुछ प्रारूपों के लिए कोई पार्सर है ही नहीं: SAMI, MicroDVD, SubViewer, Transcriber .trs, EXMARaLDA, CHAT/CHILDES, अकेली RTTM, और Montreal Forced Aligner या Gentle का मूल आउटपुट। उन्हें पहले बदल लीजिए। हम यह सूची इसलिए छापते हैं क्योंकि जिस समर्थित-प्रारूप सूची से कुछ भी बाहर न हो, उसका मोल ज़्यादा नहीं।

दस्तावेज़ीकरण

अपग्रेड करना

bash
pip install --upgrade potato-annotation==2.7.1

आपको कोई कॉन्फ़िगरेशन बदलने की ज़रूरत नहीं। हर वह ट्रांसक्रिप्ट बनावट जो Potato पहले स्वीकार करता था, वह अब भी स्वीकार करता है।