भारतीय भाषाओं के लिए AIमध्यमपाठ 2377 मिनट का पाठ

भारतीय भाषाओं के लिए स्पीच रिकग्निशन

अलग-अलग लहजों, शोर और मिली-जुली भाषाओं के साथ आवाज़ को टेक्स्ट में बदलना मुश्किल होता है। जानें कि वर्ड एरर रेट (WER) कैसे काम करता है, इसे Python में लिखें, और निष्पक्ष तरीके से टेस्ट करें।

पाठ वीडियो में

60 सेकंड में

भारतीय भाषाओं के लिए स्पीच रिकग्निशन

अलग-अलग लहजों, शोर और मिली-जुली भाषाओं के साथ आवाज़ को टेक्स्ट में बदलना मुश्किल होता है। जानें कि वर्ड एरर रेट (WER) कैसे काम करता है, इसे Python में लिखें, और निष्पक्ष तरीके से…

1/4
आसान शब्दों में
सोचिए कि आप एक भीड़ भरी बस में हैं, हॉर्न बज रहे हैं, और आपकी मौसी आधी तमिल और आधी अंग्रेज़ी में बोल रही हैं, और आप नोट्स ले रहे हैं। आप कुछ शब्द छोड़ देंगे और कुछ गलत सुन लेंगे। स्पीच रिकग्निशन सिस्टम के साथ भी यही समस्या होती है, और उसकी गलतियाँ गिनने के लिए हमें एक निष्पक्ष तरीके की ज़रूरत है।
Automatic speech recognition (ASR) बोली गई आवाज़ को टेक्स्ट में बदलता है। यह वॉइस सर्च, वॉइस नोट्स से टेक्स्ट, कॉल सेंटर टूल्स और हेल्पलाइनों को चलाता है। आवाज़ का इस्तेमाल करने वाले यूज़र्स के लिए, यह अक्सर किसी ऐप का मुख्य दरवाज़ा होता है। अगर यह फेल हो जाता है, तो इसके बाद का सब कुछ भी फेल हो जाता है।

भारत में यह क्यों मुश्किल है

  • लहजे और बोलियाँ (Accents and dialects)। एक ही भाषा अलग-अलग इलाकों और उम्र के लोगों के बीच अलग तरह से बोली जाती है।
  • शोर। ट्रैफिक, पंखे, बाज़ार, भरे हुए घर, और सस्ते फोन के माइक्रोफ़ोन।
  • कोड-मिक्सिंग (Code-mixing)। भारतीय भाषाओं के वाक्यों में अंग्रेज़ी शब्द, और इसका उल्टा भी।
  • नाम और नंबर। लोगों, गाँवों और योजनाओं के नाम; "two ninety nine" या "दो सौ" जैसी राशियाँ।
  • स्पेलिंग के विकल्प। क्या किसी अंग्रेज़ी शब्द को रोमन अक्षरों में लिखा जाए या भारतीय लिपि में? दोनों ही सही हो सकते हैं।

वर्ड एरर रेट (WER)

सबसे आम पैमाना word error rate है। सिस्टम ने जो लिखा (यानी hypothesis), उसकी तुलना ध्यान से लिखे गए इंसानी ट्रांसक्रिप्ट (यानी reference) से करें। एक को दूसरे में बदलने के लिए ज़रूरी शब्दों के कम से कम बदलावों की संख्या गिनें:
  • Substitutions: सही शब्द की जगह कोई गलत शब्द।
  • Deletions: ऐसा शब्द जो बोला गया था लेकिन छूट गया।
  • Insertions: एक अतिरिक्त शब्द जो बोला नहीं गया था।
फिर WER = (S + D + I) / N, जहाँ N रेफ़रेंस में मौजूद कुल शब्दों की संख्या है। यह जितना कम हो, उतना अच्छा है। चूँकि इसमें एक्स्ट्रा जोड़े गए शब्द (insertions) भी गिने जाते हैं, इसलिए WER 1 से ज़्यादा (100% से ज़्यादा) भी हो सकता है।
Word error rate with edit distancepython
def word_error_rate(reference: str, hypothesis: str) -> float:
    """WER = (substitutions + deletions + insertions) / words in reference."""
    ref = reference.split()
    hyp = hypothesis.split()
    if not ref:
        raise ValueError("reference must contain at least one word")
    # d[i][j] = edits to turn the first i reference words into the first j hypothesis words
    d = [[0] * (len(hyp) + 1) for _ in range(len(ref) + 1)]
    for i in range(len(ref) + 1):
        d[i][0] = i                       # delete all i words
    for j in range(len(hyp) + 1):
        d[0][j] = j                       # insert all j words
    for i in range(1, len(ref) + 1):
        for j in range(1, len(hyp) + 1):
            cost = 0 if ref[i - 1] == hyp[j - 1] else 1
            d[i][j] = min(
                d[i - 1][j] + 1,          # deletion
                d[i][j - 1] + 1,          # insertion
                d[i - 1][j - 1] + cost,   # substitution (or match)
            )
    return d[len(ref)][len(hyp)] / len(ref)


pairs = [
    ("mera account balance kitna hai", "mera account balance kitna hai"),
    ("mera account balance kitna hai", "mera acount balance kitna"),
    ("kal subah das baje train hai", "kal subha das bje ki train hai"),
]
for ref, hyp in pairs:
    print(f"WER={word_error_rate(ref, hyp):.2f}  ref='{ref}'  hyp='{hyp}'")
आखिरी उदाहरण को खुद हल करके देखें: "subah" बन गया "subha" (1 substitution), "baje" बन गया "bje" (1 substitution), और "ki" जुड़ गया (1 insertion)। यानी 6 रेफ़रेंस शब्दों पर 3 बदलाव, इसलिए WER 0.50 है। कोड चलाएँ और जाँचें।

ध्यान से चुनें कि आप क्या गिन रहे हैं

समस्यायह क्यों मायने रखता हैक्या करें
स्पेलिंग के अलग-अलग रूपरोमन लिपि में "subah" और "subha" दोनों ठीक हो सकते हैं, लेकिन WER इसे गलती मान लेता हैट्रांसक्रिप्ट के लिए एक स्पेलिंग गाइड तय करें, या दोनों तरफ़ के टेक्स्ट को एक ही तरह से नॉर्मलाइज़ करें
लिपि का चुनाव"OTP" और "ओटीपी" का मतलब एक ही है, लेकिन वे अलग स्ट्रिंग्स हैंट्रांसक्राइब करने से पहले नियम तय करें, और उसे रेफ़रेंस व आउटपुट दोनों पर लागू करें
नंबर"299" और "two ninety nine" दोनों सही हैंनंबरों को नॉर्मलाइज़ करें, या उनकी रिपोर्ट अलग से दें
लंबे शब्दउन भाषाओं में जहाँ कई हिस्सों को जोड़कर एक लंबा शब्द बनता है, एक छोटी सी गलती पूरे शब्द को गलत बना देती हैकैरेक्टर एरर रेट (CER) भी रिपोर्ट करें, जो अक्षरों के बदलावों को गिनता है
सावधान रहें
रेफ़रेंस और सिस्टम आउटपुट को बिल्कुल एक जैसे नियमों से नॉर्मलाइज़ करें, और उन नियमों को लिख कर रखें। अगर आप सिर्फ़ आउटपुट को साफ़ करते हैं, या दो सिस्टम्स के बीच नियम बदलते हैं, तो तुलना निष्पक्ष नहीं होगी।

निष्पक्ष तरीके से टेस्ट करना

  1. 1

    असली ऑडियो इकट्ठा करें

    सहमति के साथ, उन लोगों और जगहों से जिनके लिए आपका ऐप है: फोन, शोर, अलग-अलग क्षेत्र, जेंडर और उम्र।
  2. 2

    ध्यान से ट्रांसक्राइब करें

    प्रशिक्षित नेटिव स्पीकर्स और लिखित स्पेलिंग गाइड का इस्तेमाल करें। किसी दूसरे व्यक्ति से कुछ नमूनों की दोबारा जाँच करवाएँ।
  3. 3

    ग्रुप के अनुसार रिपोर्ट करें

    सिर्फ़ एक औसत नहीं, बल्कि हर भाषा, बोली, शोर के स्तर और स्पीकर ग्रुप के हिसाब से WER निकालें।
  4. 4

    गलतियों को देखें

    असल गलतियों को पढ़ें। क्या वे नाम हैं, नंबर हैं, अंग्रेज़ी शब्द हैं, या पूरी की पूरी बोली है?
  5. 5

    सुधारें और फिर से टेस्ट करें

    सबसे कमज़ोर ग्रुप को पहले बेहतर बनाएँ, फिर सभी ग्रुप्स को दोबारा टेस्ट करें।
नोट
किसी मॉडल के लिए पब्लिश किए गए WER नंबर सिर्फ़ उसी टेस्ट सेट के लिए सही होते हैं जिस पर उन्हें नापा गया था। साफ़-सुथरी पढ़ी गई आवाज़ का WER, शोर-शराबे वाली आम बोलचाल की आवाज़ की तुलना में बहुत कम आता है। हमेशा अपने यूज़र्स के ऑडियो जैसे ऑडियो पर ही टेस्ट करें।
इसे आज़माएँ। एक शांत कमरे में और एक पंखे या सड़क के पास अपना (सिर्फ़ अपना) एक वाक्य बोलते हुए रिकॉर्ड करें। दोनों पर किसी मुफ़्त वॉइस-टाइपिंग टूल का इस्तेमाल करें। रेफ़रेंस लिखें और दोनों के लिए WER निकालें।

और देखें और पढ़ें

लैब

पाँच सैंपल ट्रांसक्रिप्ट्स के लिए नॉर्मलाइज़ेशन के साथ और उसके बिना WER और CER के नतीजे, और एक छोटा एरर एनालिसिस।

~35 min

समस्या

स्टार्टर में रोमन में लिखी हिंग्लिश, अंग्रेज़ी और हिंदी में रेफ़रेंस और ASR आउटपुट के पाँच जोड़े दिए गए हैं।

  1. कोड चलाने से पहले, जोड़े 2 और 4 का रॉ WER खुद कैलकुलेट करें।
  2. कोड चलाएँ। क्या आपके हाथ से निकाले गए नतीजे मैच हुए?
  3. रॉ WER की तुलना नॉर्मलाइज़्ड WER से करें। कौन से जोड़े बदले, और क्यों?
  4. जोड़े 3 को देखें। क्या "299" बनाम "two ninety nine" सच में कोई गलती है? नंबरों के लिए एक नियम लिखें।
  5. अपनी पसंद की भाषा में अपने खुद के दो जोड़े जोड़ें। रेफ़रेंस खुद लिखें; आउटपुट के लिए आप कोई स्वाभाविक गलती बना सकते हैं।

प्रैक्टिस लैब

कोड में बदलाव करें और इसे रन करें। Python आपके ब्राउज़र में चलता है — हमारे सर्वर पर कुछ नहीं भेजा जाता।

आउटपुट

कोई आउटपुट नहीं। वैल्यूज़ देखने के लिए print(...) जोड़ें।

आपका काम तब पूरा होगा जब

कठिन सवाल

उत्तर देखने से पहले ख़ुद जवाब देने की कोशिश करें। अगर आप इनके जवाब दे सकते हैं, तो आप पाठ समझ गए हैं।

Q1कोड हर वाक्य के WER का औसत निकालने के बजाय, कुल बदलावों को कुल शब्दों से भाग देकर कॉर्पस WER क्यों निकालता है?दिखाएं

वाक्य के हिसाब से WER का औसत निकालने से छोटे वाक्य को भी लंबे वाक्य जितना ही महत्व मिल जाता है। दो शब्दों के वाक्य में एक गलती 0.5 का WER दे देगी, जिससे कुल औसत बहुत बढ़ जाएगा। कुल रेफ़रेंस शब्दों पर कुल बदलाव हर शब्द को बराबर महत्व देता है, जो किसी टेस्ट सेट के लिए WER रिपोर्ट करने का मानक तरीका है।

Q2कमेंट में कहा गया है कि भारतीय लिपियों (Indic text) के लिए re के \w का इस्तेमाल न करें। इससे क्या गड़बड़ी होगी?दिखाएं

Python के re मॉड्यूल में, \w भारतीय लिपियों में इस्तेमाल होने वाली कुछ मात्राओं (combining vowel signs) को मैच नहीं करता है। ऐसे में \w+ जैसा पैटर्न "मुझे" जैसे शब्दों को टुकड़ों में तोड़ देगा, और WER उन टूटे हुए हिस्सों पर कैलकुलेट होगा। यूनिकोड कैटेगरी के हिसाब से विराम चिह्नों (punctuation) को हटाने से शब्द पूरे रहते हैं। टेक्स्ट साफ़ करने वाले कोड को हमेशा असली भारतीय भाषाओं के टेक्स्ट पर टेस्ट करें।

जारी रखने के लिए कृपया साइन इन करें।

अक्सर पूछे जाने वाले सवाल

एक अच्छा WER क्या होता है?

यह काम और ऑडियो पर निर्भर करता है। एक सर्च बॉक्स कुछ गलतियों के बावजूद काम कर सकता है; लेकिन कोई मेडिकल नोट या बैंक ट्रांसफर ऐसा नहीं कर सकता। अपने यूज़र्स की ज़रूरतों के हिसाब से एक टारगेट तय करें, असली जैसे ऑडियो पर मापें, और देखें कि कौन सी गलतियाँ सबसे ज़्यादा मायने रखती हैं।

WER और CER में क्या अंतर है?

WER शब्दों के बदलावों को गिनता है। CER अक्षरों के बदलावों को गिनता है और उसे रेफ़रेंस के कुल अक्षरों से भाग देता है। CER अक्सर उन भाषाओं के लिए उपयोगी होता है जो कई हिस्सों को जोड़कर लंबे शब्द बनाती हैं, या जहाँ शब्दों की सीमाएँ और स्पेलिंग बदलती रहती हैं।

नामों और नंबरों के लिए अलग टेस्ट की ज़रूरत क्यों होती है?

वे कई कामों में सबसे ज़रूरी जानकारी रखते हैं: कौन, कहाँ और कितना। एक छोटा सा WER किसी गलत फोन नंबर या गलत गाँव के नाम को छिपा सकता है। उनकी अपनी लिस्ट के साथ उनका टेस्ट करें और एक-एक करके उनकी जाँच करें।

क्या मैं टेस्ट करने के लिए YouTube की रिकॉर्डिंग्स का इस्तेमाल कर सकता हूँ?

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

पाठ का टेस्ट

5 सवाल। पास होने और इस पाठ को पूरा करने के लिए 3 सही होने चाहिए (60%)।

टेस्ट देने और अपनी प्रोग्रेस सेव करने के लिए साइन इन करें