orthography2ipa एक शुद्ध-डेटा Python पैकेज है — घोषणात्मक JSON, पतला प्लगेबल लॉजिक, कोई प्रशिक्षित वेट्स नहीं — जो वर्तनी को IPA में मैप करता है और मॉडल करता है कि वे फ़ोनीम संदर्भ में कैसे सतह पर आते हैं। यह 820 भाषाओं को कवर करते हुए 909 भाषा स्पेक्स (साथ ही 89 केवल-वर्गीकरण क्लेड नोड्स) 20+ भाषा परिवारों में भेजता है। इसे इंस्टॉल करें, डेटा पढ़ें, डेटा फ़ोर्क करें। किसी चेकपॉइंट में कुछ भी छिपा नहीं है।
यह डाउनस्ट्रीम हर चीज़ के नीचे की ध्वनिविज्ञान परत है: जो उम्मीदवार लैटिस यह उत्पन्न करता है उसका उपभोग अरबी TTS फ्रंटएंड arbtok, पुर्तगाली TugaPhone और silabificador स्टैक्स (देखें पुर्तगाली अक्षरों और फ़ोनीम्स के लिए क्लासिकल NLP), बारांकेन्यो फ़ोनीमाइज़र, मिरांडीज़ फ़ोनीमाइज़र, और TTS जो आलू पर चलता है के लिए फ़ोनीम ग्राउंडिंग द्वारा किया जाता है।
दो मैप, एक नहीं
महत्वपूर्ण भेद: एक ग्रैफ़ीम मैप आपको बताता है कि एक वर्तनी किन फ़ोनीम्स का प्रतिनिधित्व कर सकती है। एक एलोफ़ोन मैप आपको बताता है कि एक फ़ोनीम संदर्भ में कैसे सतह पर आता है। इन्हें मिला देना G2P प्रणालियों में सबसे आम विफलता मोड है।
import orthography2ipa
en = orthography2ipa.get("en-GB")
en.graphemes["th"] # ['θ', 'ð'] — one spelling, two possible phonemes
en.allophones["t"] # ['t', 'tʰ', 'ʔ', 'ɾ'] — one phoneme, four realisations
अंग्रेज़ी ⟨th⟩ वास्तव में /θ/ और /ð/ के बीच अस्पष्ट है — यह एक वर्तनी-से-फ़ोनीम तथ्य है। अंग्रेज़ी /t/ एक सादे स्टॉप, एक aspirated स्टॉप, एक ग्लॉटल स्टॉप, या एक फ़्लैप के रूप में दिखाई देता है, यह इस पर निर्भर करता है कि यह कहाँ पड़ता है — यह एक फ़ोनीम-से-सतह तथ्य है। इन दोनों को अलग रखने का अर्थ है कि आप ट्रांसक्रिप्शन के लिए टेक्स्ट → फ़ोनीम उम्मीदवार और उच्चारण मॉडलिंग के लिए फ़ोनीम → सतह वास्तविकीकरण पर बिना एक को दूसरे को दूषित किए जा सकते हैं। TTS के लिए यही एक विश्वसनीय उच्चारण और एक रोबोटिक उच्चारण के बीच का अंतर है; ASR के लिए यही एक ऐसे शब्दकोश और उस शब्दकोश के बीच का अंतर है जो लोग वास्तव में जो कहते हैं उससे मेल खाता है।
प्रत्येक भाषा क्या रखती है
प्रत्येक भाषा एक फ़्रोज़न LanguageSpec डेटाक्लास है, और यह एक फ़ोनीम सूची से कहीं अधिक रखती है: ग्रैफ़ीम्स (डाइग्राफ़ और ट्राइग्राफ़ सहित), एक एलोफ़ोन मैप, संदर्भ-संवेदनशील ओवरराइड्स के लिए positional graphemes (शब्द-आरंभ, स्वर-मध्य, /i/ से पहले), भारित बहु-पूर्वज ancestry, अंतर-शब्द sandhi rules, एक वैकल्पिक tone inventory, और उद्गम — एक QualityTier जो stub → skeleton → research → production चलता है, एक ScriptType (alphabet, abjad, abugida, …), और पृष्ठ पिन के साथ ग्रंथसूची स्रोत।
समावेशन नियम कठोर है और इसे स्पष्ट रूप से कहना उचित है: केवल आधिकारिक वर्तनी और प्रलेखित व्याकरण पर आधारित मैपिंग ही शामिल होती हैं। मनमाने सबस्ट्रिंग नियम बाहर रखे जाते हैं। पुर्तगाली ⟨lh⟩, जर्मन ⟨sch⟩, और अंग्रेज़ी ⟨th⟩ शामिल हैं क्योंकि वे मानक वर्तनी इकाइयाँ हैं। सुविधाजनक-किंतु-आविष्कृत अनुमान नहीं हैं। जब एक स्पेक ग्रैफ़ीम्स घोषित करता है लेकिन कोई स्पष्ट एलोफ़ोन मैप नहीं, तो एक बेसलाइन पहचान मैप व्युत्पन्न होता है — प्रत्येक फ़ोनीम कम से कम अपना ही सतह वास्तविकीकरण होता है — ताकि कुछ भी चुपचाप गायब न हो।
क्षेत्रीय विभिन्नताओं को किसी मूल पर एक फ़्लैग के बजाय अपने स्वयं के स्पेक्स मिलते हैं। ब्राज़ीलियाई और यूरोपीय पुर्तगाली व्यवस्थित रूप से भिन्न होती हैं, इसलिए वे वंशावली द्वारा जुड़े हुए अलग-अलग LanguageSpec ऑब्जेक्ट हैं:
pt_br = orthography2ipa.get("pt-BR")
pt_br.graphemes["t"] # ['t', 't͡ʃ'] — palatalisation before /i/
बोली वृक्ष रखरखाव योग्य रहते हैं क्योंकि JSON फ़ाइलें graphemes_base / allophones_base इनहेरिटेंस का समर्थन करती हैं: एक वेरिएंट केवल वही घोषित करता है जो अपने मूल से भिन्न होता है। वंशावली भारित और बहु-पूर्वज है — parent, substrate, superstrate, adstrate — जो उन भाषाओं को मॉडल करने का ईमानदार तरीका है जो साफ़ वंशज होने के बजाय संपर्क उत्पाद हैं।
केवल चौड़ी नहीं, ज़मीन पर गहरी
820 का आँकड़ा चौड़ाई है; गहराई वहाँ है जहाँ काम है। स्पेक्स लेक्ट-दर-लेक्ट चलते हैं जहाँ बोलीविज्ञान साहित्य चलता है, और प्रत्येक को एक फ़ोनीम चार्ट से पैटर्न-मिलान करने के बजाय पृष्ठ पिन के साथ उस साहित्य से उद्धृत किया जाता है।
इबेरियन कवरेज सबसे स्पष्ट उदाहरण है: प्रायद्वीप की भाषाओं के लिए 100+ स्पेक्स। स्पेन की हर रोमांस भाषा — कैस्टिलियन, कातालान/वालेंसियाई, गैलिशियाई (RAG और पुनःएकीकरणवादी दोनों मानक), आस्तुरियाई, अरागोनी और इसकी घाटी विभिन्नताएँ (Ansotano, Chistabín, Benasqués…), एक्स्ट्रेमादुराई — साथ ही बास्क, इबेरो-रोमांस क्रियोल, और वे ऐतिहासिक परतें जिन्हें अधिकांश संसाधन पूरी तरह छोड़ देते हैं: अंदालुसी अरबी और मोज़ारबिक। अरबी पक्ष 34 बोली लेक्ट रखता है (नज्दी और हेजाज़ी से लेकर लेवंटाइन, माग्रेबी और प्रायद्वीपीय विभिन्नताओं तक), और लुसोफ़ोन पक्ष 46 पुर्तगाली-और-पुर्तगाल-भाषा लेक्ट, Rionorese, Guadramilese, और मिरांडीज़ उप-बोलियों तक।
हमारी जानकारी में, इनमें से कई किसी विभिन्नता के लिए अब तक प्रकाशित पहली मशीन-पठनीय ध्वनिविज्ञान हैं — यानी एक संरचित, स्कीमा-प्रमाणित ग्रैफ़ीम/एलोफ़ोन स्पेक जिसे कोई प्रोग्राम क्वेरी कर सकता है, न कि केवल बोलीविज्ञान साहित्य में गद्य में वर्णित एक फ़ोनीम सूची — Rionorese और Guadramilese उनमें से हैं। डाउनस्ट्रीम काम बारांकेन्यो और मिरांडीज़ के लिए पहले IPA शब्दकोश भेजता है।
एक उम्मीदवार लैटिस, एक अकेला अनुमान नहीं
वर्तनी एक साफ़ खंडन समस्या नहीं है, इसलिए प्रमुख आर्किटेक्चर एक उम्मीदवार लैटिस है। PhonetokTokenizer maximal-munch ग्रैफ़ीम टोकनाइज़ेशन करता है — लालचपूर्वक सबसे लंबी मिलान वाली वर्तनी इकाई को प्राथमिकता देते हुए — और, स्पेक की ग्रैफ़ीम तालिका के ऊपर, एक अकेले भंगुर आउटपुट के बजाय रैंक किए गए IPA उम्मीदवारों की प्रति-स्थिति लैटिस उत्पन्न करता है:
from orthography2ipa.phonetok import PhonetokTokenizer
tok = PhonetokTokenizer(orthography2ipa.get("en-GB"))
tok.ipa_best("through") # 'θɹɔː'
for path in tok.ipa_beam("through", beam_width=8):
print(path.ipa, path.score) # θɹɔː 0.0, ðɹɔː 1.0, θɹoʊ 1.0, …
लैटिस वह अनुबंध है जिस पर पूरा डाउनस्ट्रीम परिवार बनता है। एक भाषा-विशिष्ट इंजन साझा लैटिस का उपभोग करता है और केवल वही ध्वनिविज्ञान जोड़ता है जो एक स्थैतिक तालिका व्यक्त नहीं कर सकती, प्रत्येक उपभोक्ता को उसी आधारित कोर पर रखते हुए:
- arbtok लैटिस पर अरबी TTS ध्वनिविज्ञान बनाता है, सन-लेटर आत्मसात्करण, hamzat al-waṣl लोप, गेमिनेशन और लिगेचर हैंडलिंग जोड़ते हुए — और एक नवीन rawi-lattice fusion जो अविशिष्ट बोलीगत टेक्स्ट के गायब लघु स्वरों को एक समूह के प्रति-वर्ण वितरण को अनुरोधित लेक्ट के लाइसेंसिंग के अंतर्गत स्कोर करके पुनर्स्थापित करता है, न कि एक मुक्त जनरेटर पर भरोसा करके।
- TugaPhone, mwl_phonemizer (मिरांडीज़), और g2p_barranquenho सभी अपनी लुसोफ़ोन विभिन्नताओं के लिए उसी lattice-core का उपभोग करते हैं।
भाषाओं के बीच दूरी मापना
चूँकि डेटा वेट्स में बेक होने के बजाय संरचित है, आप भाषाओं की सीधे तुलना कर सकते हैं। दूरी मेट्रिक्स inventory, grapheme, allophone, और ancestry आयामों में फैले हैं, साथ ही एक अलग script-distance परिवार भी:
from orthography2ipa.distance import phonological_distance
d = phonological_distance(orthography2ipa.get("pt-BR"), orthography2ipa.get("pt-PT"))
d.combined # 0.0515 — near-identical
d.inventory.feature_mean # phoneme-inventory distance
d.grapheme.mean_ipa_distance # grapheme-mapping divergence
d.allophone_sim # allophone-overlap similarity
फ़ीचर वेक्टर भी उजागर किए जाते हैं, इसलिए दो पुर्तगाली मानकों जैसा एक लगभग-समान जोड़ा 0.0515 पर आता है जबकि वास्तव में दूर के जोड़े साफ़-साफ़ अलग हो जाते हैं। यह ट्रांसफ़र-लर्निंग निर्णयों, कम-संसाधन बूटस्ट्रैपिंग, और डायलेक्टोमेट्री सभी के लिए उपयोगी है।
हम कैसे जानते हैं कि डेटा अच्छा है
विश्वसनीय G2P “गोल्ड” मुश्किल से मौजूद है — अधिकांश सार्वजनिक डेटासेट एक फ़ोनीमाइज़र का अपना ही आउटपुट है जिसे संदर्भ के रूप में पुनः उपयोग किया गया है, इसलिए उनके विरुद्ध एक कम त्रुटि दर का अर्थ है “उस टूल से सहमत”, न कि “सही”। हम इस बारे में स्पष्ट हैं और एक अकेला चापलूसी भरा आँकड़ा रिपोर्ट करने के बजाय इसके इर्द-गिर्द एक सत्यापन कार्यप्रणाली बनाई है।
जिन विभिन्नताओं की हम सबसे अधिक परवाह करते हैं, उनके लिए गोल्ड लिखित है, स्क्रैप नहीं: प्रति लेक्ट एक इंजन-पिन किया गया वाक्य सेट, अंधे जोड़ों में आँका गया, पृष्ठ-पिन किए गए साहित्य के विरुद्ध मध्यस्थता किया गया, और correction classes के माध्यम से एक इंजन फ़ीडबैक लूप में वापस मोड़ा गया — इंजन के आउटपुट और सही किए गए रूप के बीच एक असहमति एक वास्तविक स्पेक बग का सुराग है। इंजन-पिन किए गए TTS गोल्ड और प्राथमिक-स्रोत प्रमाणीकरणों में कई हज़ार सत्यापित पंक्तियाँ हैं। रूपरेखा जानबूझकर उद्गम के बारे में ईमानदार है: सिंथेटिक और साहित्य-मध्यस्थ जहाँ केवल यही मौजूद है, और वास्तविक मानव गोल्ड जहाँ यह मौजूद है — नेटिव-स्पीकर मिरांडीज़ mirandese_g2p सेट, पृष्ठ-पिन किए गए प्राथमिक-स्रोत प्रमाणीकरण, और नेटिव योगदान। सटीकता के दावे केवल मानव गोल्ड के विरुद्ध किए जाते हैं; इंजन के अपने ही ड्राफ़्ट के विरुद्ध एक पूर्ण स्कोर का कोई अर्थ नहीं होगा।
आँकड़े, दिशात्मक के रूप में पढ़े गए और हमेशा अपने स्रोत से उद्धृत (docs/scoreboard.md, docs/benchmarks.md, और डाउनस्ट्रीम रेपो के बेंचमार्क डॉक्स):
- अरबी बोलियाँ, अविशिष्ट अविरामचिह्नित इनपुट — कठिन, परिनियोजन-यथार्थवादी मामला। arbtok के अविशिष्ट-इनपुट TTS गोल्ड (33 लेक्ट) पर, बोली लाइसेंसिंग के अंतर्गत rawi-lattice fusion 0.189 का मीन PER तक पहुँचता है, जो उसी समूह को एक मुक्त जनरेटर के रूप में चलाने (0.193) को हराता है, जिसमें मार्जिन उन लेक्ट पर केंद्रित है जो MSA से सबसे अधिक भिन्न होते हैं। अधिकांश लेक्ट पर arbtok अविशिष्ट इनपुट पर espeak-ng को हराता है; MSA पर ही, espeak — जो MSA-ट्यून किया गया है — अब भी जीतता है (espeak 0.176 बनाम arbtok 0.245)।
- अरबी बोलियाँ, विरामचिह्नित इनपुट — चिह्नों के मौजूद होने पर arbtok का PER प्रति लेक्ट 0.01–0.08 पर बैठता है, espeak की एकल MSA वॉइस से काफ़ी नीचे (जैसे नज्दी 0.009 बनाम espeak 0.221; मिस्री 0.027 बनाम espeak 0.287)। espeak के पास कोई बोली वॉइस नहीं है, इसलिए यह ईमानदारी से सेब-से-संतरे की तुलना है — लेकिन अंतर ही मुद्दा है।
- पुर्तगाली, विशेषज्ञ-मानव गोल्ड के विरुद्ध — लिस्बन यूरोपीय पुर्तगाली पृष्ठ-पिन किए गए प्राथमिक स्रोतों पर PER 0.029 (88% सटीक-मिलान) पर आती है, और नेटिव-स्पीकर मिरांडीज़ गोल्ड 0.146 पर।
इनमें से हर एक डेटा की एक वर्तमान-स्थिति संपत्ति है, एक बूटस्ट्रैप विश्वास अंतराल से क्रॉस-रेफ़रेंस की गई, न कि एक लीडरबोर्ड ट्रॉफ़ी। जहाँ अंतराल चौड़ा है या नमूना छोटा, स्कोरबोर्ड ऐसा कहता है।
CLI
ऊपर सब कुछ Python लिखे बिना पहुँच योग्य है। orthography2ipa कंसोल स्क्रिप्ट list, info, transcribe, और distance भेजती है, और प्रत्येक सबकमांड पाइपलाइन में पाइपिंग के लिए --json लेता है।
orthography2ipa list --family Romance
orthography2ipa info pt-BR --graphemes
orthography2ipa transcribe en-GB "through" --beam 8
orthography2ipa distance es-ES it-IT --json
शुद्ध डेटा क्यों मायने रखता है
पूरा स्पेक सेट स्कीमा-प्रमाणित है — फ़्रोज़न pydantic-शैली डेटाक्लासेस जो एक इंटीग्रिटी टेस्ट सूट द्वारा स्वेप्ट होते हैं, जिसमें SCHEMA.md आकार का दस्तावेज़ीकरण करता है। जहाँ एक स्थैतिक तालिका वास्तव में नियमों को व्यक्त नहीं कर सकती, वहाँ भाषा-विशिष्ट लॉजिक डेटा के चारों ओर प्लग होता है: सिलेबिफ़ायर एक एंट्री-पॉइंट समूह के माध्यम से रजिस्टर होते हैं, और भारी इंजन डाउनस्ट्रीम साझा लैटिस पर बनते हैं।
यह तय करने वाला कोई अपारदर्शी मॉडल नहीं है कि आपके उपयोगकर्ताओं की भाषाएँ कैसी सुनाई देती हैं। मैपिंग ऑडिट योग्य हैं, स्रोत पृष्ठ तक उद्धृत हैं, और एक भाषा जोड़ना एक प्रमाणित JSON फ़ाइल लिखना है — docs/adding_a_language.md और गेटिंग-स्टार्टेड गाइड से शुरू करें। TTS, ASR, या ध्वन्यात्मक NLP बनाने वाले किसी भी व्यक्ति के लिए जो अपनी ध्वनिविज्ञान को एक ब्लैक बॉक्स को आउटसोर्स करने से इनकार करता है — और जो इसे अपने हार्डवेयर पर चलाना चाहता है — यही मुद्दा है। यह Apache 2.0 है, और यह आपका है निरीक्षण, विस्तार, और स्व-होस्ट करने के लिए।