एक डिनॉइज़िंग मॉडल एक नया चेकपॉइंट भेजता है। एक TTS आवाज़ को अधिक डेटा पर फिर से प्रशिक्षित किया जाता है। एक वॉयस-क्लोनिंग पाइपलाइन अपना वोकोडर बदल देती है। हर मामले में, किसी को जवाब देना होता है: क्या आउटपुट पहले से बेहतर है या बदतर? “मुझे तो बेहतर लगता है” स्केल नहीं करता। यह उसी क्षण टूट जाता है जब भाषा वह नहीं होती जो आप बोलते हैं, जिस क्षण दो के बजाय बीस चेकपॉइंट्स की तुलना करनी हो, या जिस क्षण बदलाव को एक बार हाथ से जाँचने के बजाय हर कमिट पर जाँचना हो।
“क्या यह बेहतर सुनाई देता है” का कठोर उत्तर है एक Mean Opinion Score (MOS): ऑडियो को श्रोताओं के एक पैनल के सामने रखें, हर एक से इसे 1 से 5 तक रेट करने को कहें, और स्कोरों का औसत निकालें। MOS मानक स्पीच-गुणवत्ता मेट्रिक ठीक इसीलिए है क्योंकि यह वही सवाल पूछता है जो मायने रखता है — क्या कोई मानव इसे स्वीकार्य पाएगा — इसके लिए किसी प्रॉक्सी के बजाय। यह महँगा भी है। एक पैनल भर्ती करना, इसे लगातार चलाना, और इसे हर भाषा, हर रिकॉर्डिंग स्थिति और एक छोटी टीम के भेजे जाने वाले हर मॉडल संस्करण के लिए दोहराना ऐसी चीज़ नहीं है जिसके साथ एक सुनने वाला पैनल तालमेल बिठा सके।
speechonnxmetrics बिना किसी पैनल के, हर बिल्ड पर, उस निर्णय का अनुमान लगाने के लिए एक लाइब्रेरी है। यह अपनी मेट्रिक्स को तीन परिवारों में समूहित करती है, और स्थिति के लिए सही परिवार चुनना किसी भी व्यक्तिगत संख्या से अधिक मायने रखता है।
तीन परिवार, तीन सवाल
संदर्भ-रहित MOS अनुमानक न्यूरल नेटवर्क हैं जो केवल ऑडियो से यह पूर्वानुमानित करने के लिए प्रशिक्षित किए जाते हैं कि एक सुनने वाला पैनल क्या कहता। उन्हें किसी साफ़ मूल की ज़रूरत नहीं होती — केवल वही आउटपुट जिसे आप आँकना चाहते हैं। इस परिवार का उपयोग करें जब तुलना करने के लिए कोई ग्राउंड ट्रुथ न हो: एक TTS प्रणाली के आउटपुट को स्कोर करना, या डिनॉइज़िंग के बाद एक असली, पहले से ख़राब रिकॉर्डिंग की जाँच करना।
Intrusive मेट्रिक्स को एक मेल खाता साफ़ संदर्भ चाहिए और वे उसके और ख़राब सिग्नल के बीच की दूरी मापते हैं। इस परिवार का उपयोग करें जब आपने ख़ुद गिरावट पैदा की हो और अब भी साफ़ मूल रखते हों: आपने एक जानी-मानी-अच्छी रिकॉर्डिंग को एक कोडेक, एक बैंडविड्थ-विस्तार मॉडल, या एक वॉयस कन्वर्टर से गुज़ारा, और जानना चाहते हैं कि आउटपुट स्रोत से कितना भटका।
ASR-आधारित टेक्स्ट मेट्रिक्स आउटपुट को एक स्पीच रिकग्नाइज़र से ट्रांसक्राइब करते हैं और ट्रांसक्रिप्ट की अपेक्षित टेक्स्ट से diff करते हैं। यह कुछ ऐसा पकड़ता है जो बाक़ी दोनों परिवार नहीं पकड़ सकते: ऐसा ऑडियो जो सुनने में बिलकुल स्वाभाविक और साफ़ लगता है पर ग़लत शब्द कहता है। एक संदर्भ-रहित MOS अनुमानक स्वाभाविकता को रेट करता है, सटीकता को नहीं — एक धाराप्रवाह ग़लत उच्चारण अच्छा स्कोर करता है। एक intrusive मेट्रिक को एक संदर्भ वेवफ़ॉर्म चाहिए, कोई संदर्भ वाक्य नहीं। केवल टेक्स्ट की तुलना करना ही एक ग़लत शब्द पकड़ती है।
लाइब्रेरी इन्हें एक फ़ंक्शन के ज़रिए उजागर करती है:
import speechonnxmetrics as s
# No-reference: only the output needed, no ground truth exists
s.score("output.wav", ["utmos"])
# Intrusive: needs a clean reference, ref= is required
s.score("degraded.wav", ["stoi", "mcd", "si_sdr"], ref="clean.wav")
टेक्स्ट मेट्रिक्स एक अलग मॉड्यूल, speechonnxmetrics.asr, में रहते हैं, क्योंकि वे स्ट्रिंग्स की तुलना करते हैं, ऑडियो की नहीं — s.score() केवल उन मेट्रिक्स को डिस्पैच करता है जो एक वेवफ़ॉर्म लेते हैं।
संदर्भ-रहित MOS: संख्याओं को पढ़ना
चार MOS अनुमानक भेजे जाते हैं, हर एक 1–5 स्केल पर मान लौटाता है जहाँ ऊँचा बेहतर है — वही स्केल जो एक मानव पैनल उपयोग करता है:
| मेट्रिक | आयाम | जिस पर प्रशिक्षित | व्यावसायिक उपयोग |
|---|---|---|---|
utmos | एक स्वाभाविकता स्कोर | संश्लेषित वाणी (VoiceMOS Challenge) | हाँ |
dnsmos | sig / bak / ovrl (स्पीच गुणवत्ता / पृष्ठभूमि शोर / समग्र) | ITU-T P.835 | हाँ |
dnsmos_p808 | एक क्राउडसोर्स्ड-सुनने वाला MOS | ITU-T P.808 | हाँ |
sigmos | 7 आयाम (col, disc, loud, noise, reverb, sig, ovrl) | ITU-T P.804 | हाँ |
nisqa | mos प्लस noi/dis/col/loud विभाजन | NISQA-v2 | नहीं — CC BY-NC-SA 4.0 |
nisqa पूरी लाइब्रेरी में एकमात्र मेट्रिक है जिसके वेट्स ग़ैर-व्यावसायिक हैं। बाक़ी चार MIT-लाइसेंस प्राप्त हैं। speechonnxmetrics इसे आपके लिए फ़िल्टर नहीं करता; यह लाइसेंस बताता है और चुनाव कॉलर पर छोड़ देता है।
यहाँ है कि असली ऑडियो कैसे स्कोर करता है। लाइब्रेरी की अपनी बंडल की गई फ़िक्स्चर — एक साफ़ रिकॉर्डिंग (source.wav) और उसी क्लिप का एक न्यूरल-कोडेक पुनःसंश्लेषण (facodec_aria.wav) — को UTMOS से चलाते हुए:
>>> s.score("source.wav", ["utmos"])
{'utmos': 4.41}
>>> s.score("facodec_aria.wav", ["utmos"])
{'utmos': 3.21}
साफ़ रिकॉर्डिंग स्केल के शीर्ष के क़रीब उतरती है, जैसा उसे होना चाहिए — यह असली मानव वाणी है, संश्लेषित नहीं। कोडेक पुनःसंश्लेषण एक पूरे बिंदु से अधिक गिर जाता है। वह अंतर, किसी भी अकेली संख्या से अधिक, उपयोगी संकेत है: यह आपको बताता है कि कोडेक श्रव्य गिरावट लाता है, और यह आपको एक ऐसी संख्या देता है जिसे कोडेक ट्यून होते समय ट्रैक किया जा सके।
उसी साफ़ रिकॉर्डिंग पर DNSMOS:
>>> s.score("source.wav", ["dnsmos"])
{'dnsmos.sig': 3.45, 'dnsmos.bak': 3.60, 'dnsmos.ovrl': 2.93}
एक नहीं, तीन संख्याएँ, और वे अलग होती हैं — ovrl sig और bak दोनों से उल्लेखनीय रूप से नीचे बैठता है। वह अंतर एक बग के बजाय सूचनात्मक है: ovrl समग्र सुनने के अनुभव की P.835 की रेटिंग है, और यह किसी भी घटक स्कोर की तुलना में एक रिकॉर्डिंग को अधिक कठोरता से दंडित करता है, ख़ासकर स्टूडियो रिकॉर्डिंग के बजाय वास्तविक-दुनिया की रिकॉर्डिंग के लिए। जब bak कम हो, पृष्ठभूमि शोर देखें। जब sig कम हो, वॉयस-स्तरीय विरूपणों को देखें — clipping, dropouts, रोबोटिक timbre। एक ही क्लिप के लिए एक से अधिक अनुमानक रिपोर्ट करें: वे अलग-अलग डेटा पर प्रशिक्षित हैं और सूचनात्मक ढंग से असहमत होते हैं, और एक ही क्लिप पर दो स्वतंत्र अनुमानकों के बीच एक बड़ा अंतर जाकर सुनने का एक संकेत है।
Intrusive मेट्रिक्स: संख्याओं को पढ़ना
ग्यारह संदर्भ-आधारित मेट्रिक्स एक साफ़ मूल से दूरी मापते हैं। पहले जानने लायक़ वे हैं:
| मेट्रिक | सीमा | दिशा | मापता है |
|---|---|---|---|
stoi / estoi | 0–1 | ऊँचा बेहतर है | short-time objective intelligibility — कितनी सामग्री बचती है, यह कितना स्वाभाविक सुनाई देता है इससे स्वतंत्र |
si_sdr / sdr / snr | dB, असीमित | ऊँचा बेहतर है | signal-to-distortion / signal-to-noise अनुपात |
mcd | dB, असीमित | कम बेहतर है | mel-cepstral distortion — स्पेक्ट्रल-लिफ़ाफ़ा दूरी, एक क्लासिक TTS/VC गुणवत्ता मेट्रिक |
log_f0_rmse | असीमित | कम बेहतर है | पिच-कंटूर त्रुटि |
lsd / msd | dB | कम बेहतर है | log-spectral / mel-spectral दूरी |
ध्यान दें कि दिशा पलट जाती है: STOI और SDR परिवार गुणवत्ता बेहतर होने पर ऊपर जाते हैं; MCD, पिच त्रुटि और स्पेक्ट्रल दूरी नीचे जाती हैं। किसी तालिका को पढ़ते समय इन्हें मिला देना एक आसान ग़लती है।
उसी कोडेक पुनःसंश्लेषण को उसके साफ़ स्रोत के विरुद्ध स्कोर करते हुए:
>>> s.score("facodec_aria.wav", ["stoi", "mcd", "si_sdr"], ref="source.wav")
{'stoi': 0.662, 'mcd': 10.46, 'si_sdr': -26.94}
0–1 के स्केल पर 0.66 का STOI, जहाँ 1.0 एक सटीक मिलान है, कहता है कि सुबोधता को असली धक्का लगा — यह उससे काफ़ी नीचे है जो एक हल्के-प्रोसेस्ड रिकॉर्डिंग को स्कोर करना चाहिए। लगभग −27 dB का SI-SDR इसकी पुष्टि करता है: SI-SDR नकारात्मक होता है जब भी विरूपण ऊर्जा सिग्नल से अधिक हो जाती है, और एक बड़ी नकारात्मक संख्या का मतलब है भारी संरचनात्मक बदलाव, न कि केवल जोड़ा गया शोर। 10.46 dB का MCD ऊँचा है; प्रकाशित TTS प्रणालियाँ जो स्पष्ट रूप से संश्लेषित पर फिर भी स्पीकर-संगत सुनाई देती हैं, आमतौर पर इकाई अंकों में उतरती हैं, इसलिए 10+ पुनःसंश्लेषण और मूल के बीच पर्याप्त स्पेक्ट्रल-लिफ़ाफ़ा बहाव की ओर इशारा करता है।
ASR-आधारित मेट्रिक्स: संख्याओं को पढ़ना
पाँच टेक्स्ट मेट्रिक्स एक संदर्भ ट्रांसक्रिप्ट और एक hypothesis (ऑडियो को असल में क्या ट्रांसक्राइब किया गया) के बीच एक Levenshtein संरेखण से आते हैं:
| मेट्रिक | सीमा | दिशा | अर्थ |
|---|---|---|---|
wer | ≥ 0 (आमतौर पर 0–1, 1 से अधिक हो सकता है) | कम बेहतर है | word error rate: प्रतिस्थापन + हटाव + सम्मिलन, संदर्भ शब्द गिनती से विभाजित |
cer | 0–1 | कम बेहतर है | अक्षर स्तर पर वही विचार — मामूली वर्तनी/टोकनाइज़ेशन बेमेल के प्रति अधिक क्षमाशील |
mer | 0–1 | कम बेहतर है | match error rate |
wil | 0–1 | कम बेहतर है | word information lost |
wip | 0–1 | ऊँचा बेहतर है | word information preserved (1 − wil) |
एक हल किया उदाहरण: संदर्भ “the quick brown fox jumps over the lazy dog” बनाम hypothesis “the quick brown fox jumped over a lazy dog” (एक प्रतिस्थापन, “jumps” → “jumped”, “the” का एक हटाव):
>>> from speechonnxmetrics import asr
>>> from speechonnxmetrics.asr import BASIC
>>> asr.wer(reference, hypothesis, normalizer=BASIC)
0.222
>>> asr.cer(reference, hypothesis, normalizer=BASIC)
0.116
0.22 का WER का मतलब है लगभग हर पाँच में से एक शब्द ग़लत है — ध्यान देने योग्य, सुनने लायक़। CER उसी जोड़े पर कम है क्योंकि अक्षर-स्तरीय स्कोरिंग एक-शब्द के प्रतिस्थापन को एक बहुत लंबी अक्षर स्ट्रिंग के भीतर मुट्ठी भर अक्षर संपादनों की तरह मानती है, एक पूरे लापता टोकन की तरह नहीं; CER और WER अलग-अलग सवालों के जवाब देते हैं और एक-दूसरे से सीधे तुलनीय नहीं हैं। प्राकृतिक वाणी पर लगभग 0.3–0.4 से ऊपर का WER आमतौर पर मतलब है कि ASR प्रणाली, या जो ऑडियो यह ट्रांसक्राइब कर रही है, में एक असली समस्या है, कोई राउंडिंग त्रुटि नहीं।
speechonnxmetrics कभी भी आपकी ओर से टेक्स्ट को सामान्यीकृत नहीं करता — एक कच्ची तुलना case और विराम-चिह्न को त्रुटियाँ मानती है, जो शायद ही कभी वह होता है जो आप चाहते हैं जब सटीक ट्रांसक्रिप्शन फ़ॉर्मैटिंग के बजाय उच्चारण को स्कोर कर रहे हों। स्पष्ट रूप से एक नॉर्मलाइज़र पास करें: BASIC लोअरकेस करता है और व्हाइटस्पेस संक्षिप्त करता है, STRICT संकुचन भी विस्तारित करता है और डायक्रिटिक्स, विराम-चिह्न और फ़िलर शब्द हटाता है।
सबसे मायने रखने वाली चेतावनी
इस लाइब्रेरी में हर संदर्भ-रहित MOS संख्या एक मॉडल से एक पूर्वानुमान है, किसी तथ्य का माप नहीं। UTMOS, DNSMOS, SIGMOS और NISQA हर एक विशिष्ट भाषाओं और रिकॉर्डिंग स्थितियों में सुनने-परीक्षण डेटा के एक विशिष्ट सेट पर प्रशिक्षित थे। ज़्यादातर अंग्रेज़ी स्टूडियो रिकॉर्डिंग पर प्रशिक्षित एक अनुमानक ऐसी भाषा को ग़लत आँक सकता है जिसे उसने प्रशिक्षण में कभी नहीं देखा, एक ऐसा लहजा जिसे उसके प्रशिक्षण पैनल ने कभी रेट नहीं किया, या एक रिकॉर्डिंग स्थिति — टेलीफ़ोन ऑडियो, एक शोर भरा कमरा, एक कम-संसाधन माइक्रोफ़ोन — जो उसके प्रशिक्षण वितरण के बाहर है। मॉडल झूठ नहीं बोल रहा; यह एक्सट्रापोलेट कर रहा है, और अपरिचित इनपुट से एक्सट्रापोलेशन ही वह जगह है जहाँ न्यूरल अनुमानक सबसे कम भरोसेमंद होते हैं।
एक पूर्वानुमानित MOS को प्रमाण मानें, ग्राउंड ट्रुथ नहीं। यह उसके लिए भरोसेमंद है जिसमें यह अच्छा है: बड़ी गिरावटों को पकड़ना, कई उम्मीदवारों को एक-दूसरे के विरुद्ध रैंक करना, और एक ऐसे रन को चिह्नित करना जिसे असल में किसी मानव को सुनने की ज़रूरत है। यह किसी असली सुनने वाले पैनल का विकल्प नहीं है जब कोई निर्णय उच्च-दांव वाला हो, और यह किसी ऐसी भाषा या स्थिति पर अंतिम शब्द नहीं होना चाहिए जिसे आँकने के लिए अंतर्निहित मॉडल प्रशिक्षित नहीं किया गया था। कई अनुमानकों को साथ रिपोर्ट करना, और उनके बीच असहमति को औसत निकालने के लिए शोर मानने के बजाय सुनने का एक संकेत मानना, व्यावहारिक निवारण है।
यह वही चीज़ क्यों है जो एक तुलना को उपयोगी बनाती है
इनमें से कुछ भी अलगाव में उपयोगी नहीं है। यह उस क्षण उपयोगी हो जाता है जब कई इंजनों को एक ही आधार पर तुलना करने की ज़रूरत हो — किस TTS इंजन, किस STT इंजन, किस एन्हांसमेंट मॉडल को डिफ़ॉल्ट बनाना है। शुद्ध-ONNX स्पीच लाइब्रेरियाँ जिन्हें आँकने के लिए speechonnxmetrics बनाया गया था — TTS, ASR, डिनॉइज़िंग, वॉयस क्लोनिंग — ठीक ऊपर वाली मेट्रिक्स के साथ बनाई गई प्रति-इंजन तुलनाएँ प्रकाशित करती हैं: बिना ग्राउंड ट्रुथ वाली प्रणालियों के लिए संदर्भ-रहित MOS, जहाँ एक साफ़ संदर्भ मौजूद है वहाँ intrusive मेट्रिक्स, जहाँ भी ट्रांसक्रिप्ट की सटीकता सवालों में हो वहाँ WER/CER। यही वह चीज़ है जो “हमने यह इंजन चुना” को एक ऐसी संख्या में बदल देती है जिसे कोई और जाँच सके।
अगर आपकी परियोजना को इस तरह आँकी गई एक भाषा, एक इंजन, या एक रिकॉर्डिंग स्थिति की ज़रूरत है और वह अभी कवर नहीं है, तो संपर्क करें या देखें हमारी सेवाएँ।