सभी लेख

· Casimiro Ferreira· 9 मिनट पढ़ें

स्क्रिप्ट और ध्वन्यात्मक नोटेशन: scriptconv असल में क्या रूपांतरित करता है

  • IPA
  • Phonetics
  • NLP
  • Linguistics
  • FOSS

एक US उच्चारण शब्दकोश कहता है कि “cat” K AE1 T जैसा सुनाई देता है। International Phonetic Alphabet वही ध्वनि kæt लिखता है। एक अलग केवल-ASCII प्रणाली इसे k"{t लिखती है। तीनों वही दो फ़ोनीम वर्णित करते हैं — एक “k” ध्वनि के बाद एक छोटी “a” के बाद एक “t”। ध्वनि के बारे में कुछ नहीं बदला। केवल इसे लिखने के लिए इस्तेमाल की गई वर्णमाला बदली।

यह किसी भी ऐसे व्यक्ति के साथ लगातार होता है जो एक से अधिक स्रोत से उच्चारण डेटा जोड़ रहा हो। एक US शब्दकोश से बना एक स्पीच डेटासेट एक नोटेशन इस्तेमाल करता है। एक यूरोपीय शब्दकोश दूसरा। एक टेक्स्ट-टू-स्पीच इंजन तीसरे की अपेक्षा करता है। उस डेटा को मिलाने, खोजने, या तुलना करने से पहले, इसे एक ध्वन्यात्मक वर्णमाला से दूसरी में अनुवादित करना होगा — वही काम जो एक अनुवादक मानव भाषाओं के बीच करता है, सिवाय इसके कि यहाँ “भाषाएँ” शब्द लिखने के तरीक़ों के बजाय ध्वनि लिखने के तरीक़े हैं।

scriptconv एक छोटी Python लाइब्रेरी है जो यह अनुवाद करती है, साथ ही एक स्तर ऊपर का एक संबंधित काम: यह पता लगाना कि टेक्स्ट का कोई टुकड़ा किस लेखन प्रणाली में है, इससे पहले कि उसके साथ कुछ और किया जा सके। इसकी भाषाविज्ञान के बारे में कोई राय नहीं है — यह अनुमान नहीं लगाता कि कोई शब्द कैसे उच्चारित होता है। यह केवल उन प्रतीकों को हिलाता है जो पहले से ज्ञात ध्वनियों का प्रतिनिधित्व करते हैं, एक नोटेशन से दूसरे में, और यह अक्षरों से ही स्क्रिप्ट की पहचान करता है।

कुछ शब्द, सीधे-सीधे परिभाषित

  • स्क्रिप्ट: एक लेखन प्रणाली — अक्षरों का असली सेट, जैसे Latin, Cyrillic, या Hangul। यह भाषा जैसा नहीं है: अंग्रेज़ी, फ़्रेंच, और वियतनामी सभी Latin स्क्रिप्ट इस्तेमाल करते हैं, और सर्बियाई Cyrillic या Latin किसी में भी लिखी जा सकती है।
  • वर्तनी (Orthography): किसी स्क्रिप्ट में किसी विशेष भाषा को लिखने के पारंपरिक वर्तनी नियम — बड़े-छोटे अक्षर, उच्चारण चिह्न, स्पेसिंग।
  • फ़ोनीम: किसी भाषा में ध्वनि की एक विशिष्ट इकाई, जैसे “cat” में “k” ध्वनि।
  • IPA (International Phonetic Alphabet): किसी भी भाषा की सामान्य वर्तनी से स्वतंत्र, ध्वनियों को सटीक रूप से लिखने के लिए एक मानक वर्णमाला।
  • लिप्यंतरण (Transliteration): अक्षरों को मैप करके टेक्स्ट को एक स्क्रिप्ट से दूसरी में बदलना, उच्चारण के बजाय मूल वर्तनी को बिलकुल सटीक रखने का लक्ष्य रखते हुए।
  • Romanization: विशेष रूप से Latin स्क्रिप्ट में लिप्यंतरण।

केवल-ASCII ध्वन्यात्मक वर्णमालाएँ बिलकुल क्यों मौजूद हैं

IPA को ʃ, ʒ, ə, और ˈ जैसे अक्षरों की ज़रूरत होती है जो किसी मानक कीबोर्ड पर नहीं होते। यह Unicode के सार्वभौमिक होने से पहले, और अधिकांश फ़ॉन्ट, टर्मिनल, और फ़ाइल फ़ॉर्मैट के भरोसेमंद ढंग से ग़ैर-ASCII टेक्स्ट का समर्थन करने से पहले, दशकों तक कंप्यूटिंग के लिए एक असली समस्या थी। शोधकर्ताओं ने केवल-ASCII विकल्प बनाए: ARPABET, अमेरिकी अंग्रेज़ी स्पीच-रिकग्निशन काम के लिए विकसित, और X-SAMPA, पूरे IPA की एक ASCII एनकोडिंग जो ईमेल- और पुराने-टर्मिनल-सुरक्षित के रूप में विकसित की गई। ये ऐतिहासिक जिज्ञासाएँ नहीं हैं। ARPABET अभी भी व्यापक रूप से परिनियोजित US अंग्रेज़ी उच्चारण शब्दकोशों और स्पीच औज़ारों द्वारा इस्तेमाल किया जाने वाला नोटेशन है, और X-SAMPA अभी भी भाषाई टूलिंग में दिखता है जिसे सादे टेक्स्ट की ज़रूरत होती है। उस डेटा को पढ़ने वाली किसी भी चीज़ को उस वर्णमाला को पढ़ने में सक्षम होना चाहिए।

scriptconv असली रूपांतरण चलाता है। यह निष्पादित आउटपुट है, कोई विवरण नहीं:

from scriptconv import convert, arpa_to_ipa, ipa_to_arpa

convert("K AE1 T", "arpa", "ipa")
# 'kæt'

convert("HH AH0 L OW1", "arpa", "ipa")
# 'həloʊ'

convert("kˈæt", "ipa", "x-sampa")
# 'k"{t'

arpa_to_ipa("HH AH0 L OW1", stress=True)
# 'həlˈoʊ'

ipa_to_arpa("həlˈoʊ", stress=True)
# 'HH AH0 L OW1'

बल चिह्नक राउंड ट्रिप में जीवित रहते हैं। ARPABET स्वर से चिपके एक अंक के साथ बल चिह्नित करता है (OW1); IPA बल वाले अक्षर से पहले रखे एक ˈ के साथ इसे चिह्नित करता है। arpa_to_ipa(..., stress=True) उस जानकारी को पार ले जाता है, और वापस बदलना मूल अंकों को बिलकुल पुनर्निर्मित करता है।

IPA डिज़ाइन के अनुसार इन सबके बीच में बैठता है। scriptconv हर नोटेशन को एक ग्राफ़ में एक नोड की तरह और हर कन्वर्टर को एक एज की तरह मानता है, और नोटेशनों के हर जोड़े के लिए सीधे हाथ से एक कन्वर्टर लिखने के बजाय IPA को एक हब के रूप में रूपांतरणों को रूट करता है:

from scriptconv import DEFAULT_GRAPH

[f"{e.src}->{e.dst}" for e in DEFAULT_GRAPH.route("arpa", "x-sampa")]
# ['arpa->ipa', 'ipa->x-sampa']

कुल मिलाकर नौ नोटेशन उस हब के ज़रिए ट्रांसकोड होते हैं: ARPABET, X-SAMPA, Kirshenbaum, Lexique, Cotovía, RFE, और mantoq, साथ ही Buckwalter, जो नीचे कवर किया गया है।

कुछ और करने से पहले स्क्रिप्ट का पता लगाना

सॉफ़्टवेयर के यह तय करने से पहले कि टेक्स्ट के किसी टुकड़े को कैसे प्रोसेस करना है — किस दिशा में इसे रेंडर करना है, कौन-सा spellchecker चलाना है, कौन-सा फ़ॉन्ट चुनना है — इसे यह जानना होगा कि टेक्स्ट किस स्क्रिप्ट में है। यह इस सवाल से अलग है कि यह किस भाषा में है। स्क्रिप्ट अक्षर सेट की पहचान करती है; भाषा शब्दावली और व्याकरण की पहचान करती है। सर्बियाई, फिर से, Cyrillic या Latin हो सकती है। उज़्बेक भी हो सकती है। scriptconv सीधे अक्षरों से स्क्रिप्ट का पता लगाता है, और अलग से एक भाषा कोड को उस स्क्रिप्ट से मैप करता है जिसमें उसे पारंपरिक रूप से लिखा जाता है:

from scriptconv import detect_script, script_runs, lang_to_script, base_direction

detect_script("Здравствуйте")
# 'Cyrl'

detect_script("안녕하세요")
# 'Hang'

script_runs("привет hello")
# [('Cyrl', 'привет '), ('Latn', 'hello')]

base_direction("مرحبا hello")
# 'mixed'

lang_to_script("uzb_cyr")
# 'Cyrl'

detect_script एक ISO 15924 कोड लौटाता है — स्क्रिप्ट के लिए मानक चार-अक्षर टैग रजिस्ट्री (Cyrillic के लिए Cyrl, Hangul के लिए Hang, Latin के लिए Latn, अरबी के लिए Arab)। script_runs मिश्रित टेक्स्ट को स्क्रिप्ट के अनुसार सन्निहित हिस्सों में विभाजित करता है, जो एक रेंडरर को यह तय करने के लिए चाहिए, वाक्य दर वाक्य, कौन-सा फ़ॉन्ट और टेक्स्ट दिशा लागू करनी है। base_direction रिपोर्ट करता है कि एक मिश्रित स्ट्रिंग बाएँ-से-दाएँ पढ़ी जाती है, दाएँ-से-बाएँ, या दोनों।

कठिन मामले: Buckwalter, Hangul, और kana

तीन लेखन-प्रणाली रूपांतरण असली पाइपलाइनों में इतनी बार आते हैं कि scriptconv हर एक को सीधे संभालता है।

Buckwalter, अरबी के लिए, एक ASCII लिप्यंतरण योजना है जो हर अरबी अक्षर और डायक्रिटिक को एक विशेष ASCII अक्षर से, एक-से-एक मैप करती है, ताकि मूल वर्तनी — उन स्वर चिह्नों सहित जिन्हें अधिकांश नेटिव टेक्स्ट छोड़ देता है — बिलकुल पुनर्निर्मित की जा सके। यह इसलिए मौजूद है क्योंकि अरबी स्क्रिप्ट को ASCII के इर्द-गिर्द बनी पाइपलाइनों और औज़ारों में संभालना अजीब है: सॉर्टिंग, डिफ़िंग, रेगुलर एक्सप्रेशन, और पुराने टेक्स्ट फ़ॉर्मैट सब आसान हो जाते हैं एक बार जब टेक्स्ट Latin-वर्णमाला ASCII हो, बशर्ते मैपिंग सटीक और उलटने योग्य हो।

from scriptconv import buckwalter_to_arabic, arabic_to_buckwalter

buckwalter_to_arabic("mrHbA")
# 'مرحبا'

arabic_to_buckwalter("مرحبا")
# 'mrHbA'

arabic_to_buckwalter("رحمٰن")
# 'rHm`n'

आख़िरी उदाहरण में dagger alef शामिल है, मुट्ठी भर शब्दों में इस्तेमाल होने वाला एक छोटा सुपरस्क्रिप्ट डायक्रिटिक (رحمٰن, rahman) — Buckwalter के पास इसके लिए एक विशेष ASCII अक्षर (`) आरक्षित है, एक सामान्य alef से अलग, ताकि लिप्यंतरण दोनों को मिला न दे।

Hangul अक्षर ब्लॉकों जैसा दिखता है, पर हर ब्लॉक एक ग्रिड में सजाए गए व्यक्तिगत अक्षरों (jamo) का एक संयोजित क्लस्टर है — जिस तरह “H”, “A”, “N” बाएँ से दाएँ लिखे जाने के बजाय दृश्य रूप से “han” के लिए एक ग्लिफ़ में मिलते हैं। सॉफ़्टवेयर जिसे व्यक्तिगत अक्षरों की ज़रूरत है — खोज के लिए, ध्वनिवैज्ञानिक विश्लेषण के लिए, किसी अलग प्रणाली को फ़ीड करने के लिए — को उन्हें वापस अलग करना होता है:

from scriptconv.translit import decompose_hangul

decompose_hangul("한국")
# 'ㅎㅏㄴㄱㅜㄱ'

decompose_hangul("국민")
# 'ㄱㅜㄱㅁㅣㄴ'

वह आख़िरी वाला मायने रखता है इसलिए कि यह क्या नहीं करता: 국민 (gungmin, “नागरिक”) को नासिक आत्मसात्करण के साथ उच्चारित किया जाता है, [ɡuŋmin], पर decompose_hangul अक्षरों को जैसे लिखे गए हैं वैसे लौटाता है — ㄱㅜㄱㅁㅣㄴ, असंगठित — क्योंकि विघटन Unicode कोडपॉइंट पर अंकगणित है, कोई ध्वनिवैज्ञानिक नियम नहीं। यह आपको बताता है कि क्या लिखा गया था, यह नहीं कि यह कैसा सुनाई देता है।

Kana रूपांतरण जापानी की दो syllabaries, hiragana और katakana, के बीच चलता है, जो एक तय कोडपॉइंट ऑफ़सेट पर अलग अक्षरों के साथ वही ध्वनियाँ प्रतिनिधित्व करते हैं:

from scriptconv import hira_to_kana, kana_to_hira

hira_to_kana("こんにちは")
# 'コンニチハ'

kana_to_hira("カタカナ")
# 'かたかな'

यह अपनी ही लाइब्रेरी में क्यों रहता है

एक फ़ोनमाइज़र — एक औज़ार जो अनुमान लगाता है कि एक लिखा हुआ शब्द कैसे उच्चारित होता है — को भाषाई निर्णय की ज़रूरत होती है: बल के नियम, अपवाद, संदर्भ-निर्भर उच्चारण। scriptconv में जानबूझकर इनमें से कुछ भी नहीं है। ऊपर का हर फ़ंक्शन एक तालिका लुकअप या एक कोडपॉइंट गणना है: वही इनपुट, वही आउटपुट, कोई अनुमान नहीं, कोई भाषा मॉडल नहीं, ऐसा कुछ नहीं जो इस बारे में ग़लत हो सके कि कोई विशेष भाषा असल में कैसी सुनाई देती है। यही वह चीज़ है जो इसे हर उस फ़ोनमाइज़र में साझा करने के लिए सुरक्षित बनाती है जिसे इसकी ज़रूरत है, बजाय इसके कि हर फ़ोनमाइज़र अपनी ख़ुद की ARPABET तालिका को अपने ख़ुद के बग्स के साथ फिर से लागू करे। ध्वनिविज्ञान स्टैक पोस्ट कवर करती है कि असली उच्चारण-अनुमान लगाने वाले इंजन — जो भाषाई राय रखते हैं — इस परत को दोहराने के बजाय इसके ऊपर कैसे बनाए गए हैं।

जहाँ मैपिंग सटीक नहीं है

नोटेशनों के बीच रूपांतरण हमेशा नुक़सान-रहित नहीं होता, और scriptconv इसे एक आश्चर्य के रूप में छोड़ने के बजाय क्वेरी करने योग्य डेटा के रूप में दर्ज करता है। हर नोटेशन के पास दो स्वतंत्र रूप से ट्रैक किए गए गुण हैं: क्या इसे IPA में बदलकर वापस बदलना मूल प्रतीकों को बिलकुल पुनर्निर्मित करता है, और क्या IPA को इसमें बदलकर वापस बदलना हर IPA प्रतीक को पुनर्निर्मित करता है।

ARPABET दोनों दिशाओं में विफल रहता है: इसके पास एक प्रतिबंधित, अंग्रेज़ी-विशिष्ट फ़ोनीम सूची है, इसलिए IPA → ARPABET → IPA जाने से ऐसे भेद खो सकते हैं जो IPA कर सकता है पर जिनके लिए ARPABET की तालिका में कोई प्रतीक नहीं है। X-SAMPA और Lexique पूरे IPA सूची को वफ़ादारी से कवर करते हैं पर अपने ख़ुद के पक्ष से शुरू करके साफ़-सुथरे ढंग से राउंड-ट्रिप करने की गारंटी नहीं देते। Kirshenbaum और Buckwalter अपने ख़ुद के पक्ष से IPA में साफ़-सुथरे ढंग से राउंड-ट्रिप करते हैं पर उल्टा नहीं। Mantoq, Halabi अरबी फ़ोनेटाइज़र की ध्वन्यात्मक वर्णमाला, केवल एक दिशा में रूपांतरित होता है, IPA में — इसके लिए कोई वापसी कन्वर्टर नहीं है। इनमें से कुछ भी कहीं किसी docstring में दबा नहीं है; यह ऐसा डेटा है जिसे लाइब्रेरी उजागर करती है ताकि एक कॉलर यह मानने से पहले जाँच सके कि एक राउंड ट्रिप सुरक्षित है।


अगर आप कई स्रोतों से उच्चारण डेटा को एक साथ जोड़ रहे हैं, या किसी फ़ोनमाइज़र तक पहुँचने से पहले स्क्रिप्ट का पता लगाने और टेक्स्ट को सामान्यीकृत करने की ज़रूरत है, तो संपर्क करें या देखें कि हम इस क्षेत्र में और क्या बनाते हैं सेवा पृष्ठ पर।