भारतीय भाषाओं के लिए स्पीच रिकग्निशन
अलग-अलग लहजों, शोर और मिली-जुली भाषाओं के साथ आवाज़ को टेक्स्ट में बदलना मुश्किल होता है। जानें कि वर्ड एरर रेट (WER) कैसे काम करता है, इसे Python में लिखें, और निष्पक्ष तरीके से टेस्ट करें।
60 सेकंड में
भारतीय भाषाओं के लिए स्पीच रिकग्निशन
अलग-अलग लहजों, शोर और मिली-जुली भाषाओं के साथ आवाज़ को टेक्स्ट में बदलना मुश्किल होता है। जानें कि वर्ड एरर रेट (WER) कैसे काम करता है, इसे Python में लिखें, और निष्पक्ष तरीके से…
भारत में यह क्यों मुश्किल है
- लहजे और बोलियाँ (Accents and dialects)। एक ही भाषा अलग-अलग इलाकों और उम्र के लोगों के बीच अलग तरह से बोली जाती है।
- शोर। ट्रैफिक, पंखे, बाज़ार, भरे हुए घर, और सस्ते फोन के माइक्रोफ़ोन।
- कोड-मिक्सिंग (Code-mixing)। भारतीय भाषाओं के वाक्यों में अंग्रेज़ी शब्द, और इसका उल्टा भी।
- नाम और नंबर। लोगों, गाँवों और योजनाओं के नाम; "two ninety nine" या "दो सौ" जैसी राशियाँ।
- स्पेलिंग के विकल्प। क्या किसी अंग्रेज़ी शब्द को रोमन अक्षरों में लिखा जाए या भारतीय लिपि में? दोनों ही सही हो सकते हैं।
वर्ड एरर रेट (WER)
- Substitutions: सही शब्द की जगह कोई गलत शब्द।
- Deletions: ऐसा शब्द जो बोला गया था लेकिन छूट गया।
- Insertions: एक अतिरिक्त शब्द जो बोला नहीं गया था।
WER = (S + D + I) / N, जहाँ N रेफ़रेंस में मौजूद कुल शब्दों की संख्या है। यह जितना कम हो, उतना अच्छा है। चूँकि इसमें एक्स्ट्रा जोड़े गए शब्द (insertions) भी गिने जाते हैं, इसलिए WER 1 से ज़्यादा (100% से ज़्यादा) भी हो सकता है।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" दोनों ठीक हो सकते हैं, लेकिन WER इसे गलती मान लेता है | ट्रांसक्रिप्ट के लिए एक स्पेलिंग गाइड तय करें, या दोनों तरफ़ के टेक्स्ट को एक ही तरह से नॉर्मलाइज़ करें |
| लिपि का चुनाव | "OTP" और "ओटीपी" का मतलब एक ही है, लेकिन वे अलग स्ट्रिंग्स हैं | ट्रांसक्राइब करने से पहले नियम तय करें, और उसे रेफ़रेंस व आउटपुट दोनों पर लागू करें |
| नंबर | "299" और "two ninety nine" दोनों सही हैं | नंबरों को नॉर्मलाइज़ करें, या उनकी रिपोर्ट अलग से दें |
| लंबे शब्द | उन भाषाओं में जहाँ कई हिस्सों को जोड़कर एक लंबा शब्द बनता है, एक छोटी सी गलती पूरे शब्द को गलत बना देती है | कैरेक्टर एरर रेट (CER) भी रिपोर्ट करें, जो अक्षरों के बदलावों को गिनता है |
निष्पक्ष तरीके से टेस्ट करना
- 1
असली ऑडियो इकट्ठा करें
सहमति के साथ, उन लोगों और जगहों से जिनके लिए आपका ऐप है: फोन, शोर, अलग-अलग क्षेत्र, जेंडर और उम्र। - 2
ध्यान से ट्रांसक्राइब करें
प्रशिक्षित नेटिव स्पीकर्स और लिखित स्पेलिंग गाइड का इस्तेमाल करें। किसी दूसरे व्यक्ति से कुछ नमूनों की दोबारा जाँच करवाएँ। - 3
ग्रुप के अनुसार रिपोर्ट करें
सिर्फ़ एक औसत नहीं, बल्कि हर भाषा, बोली, शोर के स्तर और स्पीकर ग्रुप के हिसाब से WER निकालें। - 4
गलतियों को देखें
असल गलतियों को पढ़ें। क्या वे नाम हैं, नंबर हैं, अंग्रेज़ी शब्द हैं, या पूरी की पूरी बोली है? - 5
सुधारें और फिर से टेस्ट करें
सबसे कमज़ोर ग्रुप को पहले बेहतर बनाएँ, फिर सभी ग्रुप्स को दोबारा टेस्ट करें।
और देखें और पढ़ें
लैब
पाँच सैंपल ट्रांसक्रिप्ट्स के लिए नॉर्मलाइज़ेशन के साथ और उसके बिना WER और CER के नतीजे, और एक छोटा एरर एनालिसिस।
समस्या
स्टार्टर में रोमन में लिखी हिंग्लिश, अंग्रेज़ी और हिंदी में रेफ़रेंस और ASR आउटपुट के पाँच जोड़े दिए गए हैं।
- कोड चलाने से पहले, जोड़े 2 और 4 का रॉ WER खुद कैलकुलेट करें।
- कोड चलाएँ। क्या आपके हाथ से निकाले गए नतीजे मैच हुए?
- रॉ WER की तुलना नॉर्मलाइज़्ड WER से करें। कौन से जोड़े बदले, और क्यों?
- जोड़े 3 को देखें। क्या "299" बनाम "two ninety nine" सच में कोई गलती है? नंबरों के लिए एक नियम लिखें।
- अपनी पसंद की भाषा में अपने खुद के दो जोड़े जोड़ें। रेफ़रेंस खुद लिखें; आउटपुट के लिए आप कोई स्वाभाविक गलती बना सकते हैं।
प्रैक्टिस लैब
कोड में बदलाव करें और इसे रन करें। 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%)।