يقول معجم نطق أمريكي إن القطة تُنطَق K AE1 T. وتكتب الأبجدية الصوتية الدولية الصوت نفسه بصيغة kæt. ويكتبها نظام آخر مقتصر على ASCII بصيغة k"{t. تصف الأنظمة الثلاثة الفونيمين نفسيهما تمامًا — صوت “k” يتبعه “a” قصيرة يتبعها “t”. لم يتغيّر شيء في الصوت. تغيّرت فقط الأبجدية المستخدَمة لكتابته.
يحدث هذا باستمرار لأي شخص يجمع بيانات نطق من أكثر من مصدر. تستخدم مجموعة بيانات كلام مبنية من معجم أمريكي ترميزًا واحدًا. ويستخدم معجم أوروبي ترميزًا آخر. ويتوقّع محرك تحويل نص إلى كلام ترميزًا ثالثًا. قبل أن يمكن دمج تلك البيانات أو البحث فيها أو مقارنتها، يجب ترجمتها من أبجدية صوتية إلى أخرى — المهمة نفسها التي يقوم بها مترجم بين لغات بشرية، إلا أن “اللغات” هنا طرق لكتابة الصوت بدلًا من طرق لكتابة الكلمات.
scriptconv مكتبة بايثون صغيرة تقوم بهذه الترجمة، إضافةً إلى مهمة ذات صلة درجة أعلى: معرفة نظام الكتابة الذي تنتمي إليه قطعة نص أصلًا قبل أن يمكن فعل أي شيء آخر بها. لا رأي لها في اللسانيات — فهي لا تخمّن كيف تُنطَق كلمة. إنها فقط تنقل رموزًا تمثّل أصلًا أصواتًا معروفة من ترميز إلى آخر، وتحدّد الكتابات من الأحرف نفسها.
بعض المصطلحات، مُعرَّفة ببساطة
- الكتابة (script): نظام كتابة — مجموعة الأحرف الفعلية، كاللاتينية أو السيريلية أو Hangul. ليست مطابقة للغة: تستخدم الإنجليزية والفرنسية والفيتنامية جميعها الكتابة اللاتينية، ويمكن كتابة الصربية إمّا بالسيريلية أو باللاتينية.
- الإملاء (orthography): قواعد التهجئة المتعارف عليها لكتابة لغة معيّنة بكتابة ما — حالة الأحرف، وعلامات النبر، والتباعد.
- الفونيم (phoneme): وحدة صوتية متمايزة في لغة ما، كصوت “k” في “cat”.
- IPA (الأبجدية الصوتية الدولية): أبجدية معيارية لكتابة الأصوات بدقّة، بمعزل عن تهجئة أي لغة العادية.
- الترجمة الصوتية (transliteration): تحويل نص من كتابة إلى أخرى بمطابقة الأحرف، بهدف الحفاظ على التهجئة الأصلية بدقّة لا النطق.
- الرومنة (romanization): الترجمة الصوتية تحديدًا إلى الكتابة اللاتينية.
لماذا توجد أصلًا أبجديات صوتية مقتصرة على ASCII
تحتاج IPA إلى أحرف مثل ʃ وʒ وə وˈ غير موجودة على لوحة مفاتيح قياسية. كانت تلك مشكلة حقيقية طوال عقود من الحوسبة، قبل أن يصبح Unicode شاملًا وقبل أن تدعم معظم الخطوط والطرفيات وصيغ الملفات النص غير-ASCII بموثوقية. بنى الباحثون بدائل مقتصرة على ASCII: ARPABET، المُطوَّرة لعمل التعرّف على الكلام في الإنجليزية الأمريكية، وX-SAMPA، ترميز ASCII لكامل IPA طُوِّر ليكون آمنًا عبر البريد الإلكتروني والطرفيات القديمة. هذه ليست فضولًا تاريخيًا. لا تزال ARPABET الترميز المستخدَم في معاجم نطق الإنجليزية الأمريكية وأدوات الكلام المنشورة على نطاق واسع، ولا يزال 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، المذكورة أدناه.
كشف الكتابة قبل فعل أي شيء آخر
قبل أن تستطيع البرمجيات تقرير كيفية معالجة قطعة نص — أي اتجاه لعرضها، وأي مُدقِّق إملائي لتشغيله، وأي خط لاختياره — يجب أن تعرف الكتابة التي يقع فيها النص. هذا سؤال مختلف عن اللغة التي يقع فيها. تحدّد الكتابة مجموعة الأحرف؛ وتحدّد اللغة المفردات والقواعد. يمكن أن تكون الصربية، مجددًا، سيريلية أو لاتينية. ويمكن للأوزبكية أيضًا. تكشف 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 — سجل الوسوم المعياري المكوّن من أربعة أحرف للكتابات (Cyrl للسيريلية، وHang لـHangul، وLatn للاتينية، وArab للعربية). تقسّم script_runs نصًا مختلطًا إلى مقاطع متجاورة حسب الكتابة، وهو ما يحتاجه أي عارض ليقرر، جملةً بجملة، أي خط واتجاه نص يطبّق. تُبلِغ base_direction عمّا إذا كانت سلسلة مختلطة تُقرَأ من اليسار إلى اليمين، أو من اليمين إلى اليسار، أو كلاهما.
الحالات الصعبة: Buckwalter وHangul والكانا
ثلاثة تحويلات لأنظمة كتابة تظهر بشكل متكرر بما يكفي في خطوط أنابيب حقيقية بحيث تتعامل scriptconv مع كل منها مباشرةً.
Buckwalter، للعربية، مخطط ترجمة صوتية بـASCII يربط كل حرف وحركة عربية بحرف ASCII محدَّد، واحدًا لواحد، بحيث يمكن إعادة بناء التهجئة الأصلية بدقّة — بما في ذلك علامات الحركة التي يحذفها معظم النص الأصلي. توجد لأن الكتابة العربية صعبة المعالجة في خطوط الأنابيب والأدوات المبنية حول ASCII: الفرز، والمقارنة، والتعبيرات النمطية، وصيغ النصوص القديمة كلها تصير أسهل بمجرد أن يصبح النص أبجدية لاتينية بـASCII، شريطة أن يكون الربط دقيقًا وقابلًا للعكس.
from scriptconv import buckwalter_to_arabic, arabic_to_buckwalter
buckwalter_to_arabic("mrHbA")
# 'مرحبا'
arabic_to_buckwalter("مرحبا")
# 'mrHbA'
arabic_to_buckwalter("رحمٰن")
# 'rHm`n'
يتضمّن المثال الأخير الألف الخنجرية، علامة تشكيل صغيرة مرتفعة تُستخدَم في حفنة من الكلمات (رحمٰن، رحمان) — تخصّص Buckwalter لها حرف ASCII محدَّدًا (`)، متمايزًا عن ألف عادية، بحيث لا تدمج الترجمة الصوتية بينهما.
يبدو Hangul ككتل مقطعية، لكن كل كتلة عبارة عن تجمّع مركَّب من أحرف فردية (jamo) موضوعة في شبكة — بالطريقة التي تجتمع بها “H” و”A” و”N” بصريًا في رمز واحد لـ”han” بدلًا من كتابتها من اليسار إلى اليمين. البرمجيات التي تحتاج الأحرف الفردية — للبحث، أو للتحليل الصوتي، أو لتغذية نظام مختلف — يجب أن تفكّكها مجددًا:
from scriptconv.translit import decompose_hangul
decompose_hangul("한국")
# 'ㅎㅏㄴㄱㅜㄱ'
decompose_hangul("국민")
# 'ㄱㅜㄱㅁㅣㄴ'
المثال الأخير مهم لِما لا يفعله: تُنطَق 국민 (gungmin، “مواطن”) بمماثلة أنفية، [ɡuŋmin]، لكن يعيد decompose_hangul الأحرف كما كُتبت — ㄱㅜㄱㅁㅣㄴ، دون مماثلة — لأن التفكيك حساب حسابي على نقطة ترميز Unicode، لا قاعدة صوتية. إنه يخبرك بما كُتب، لا بما يبدو عليه صوته.
ينقل تحويل الكانا بين مقطعيتَي اليابانية، الهيراغانا والكاتاكانا، اللتين تمثّلان الأصوات نفسها بأحرف مختلفة بإزاحة ثابتة في نقطة الترميز:
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، الأبجدية الصوتية لمُصوِّت الحلبي العربي، فيحوّل في اتجاه واحد فقط، إلى IPA — لا يوجد محوِّل للعودة. لا شيء من هذا مدفون في تعليق توثيقي في مكان ما؛ إنها بيانات تكشف عنها المكتبة كي يستطيع المستدعي التحقق قبل افتراض أن رحلة ذهاب وإياب آمنة.
إن كنت تخيط معًا بيانات نطق من مصادر متعددة، أو تحتاج كشف الكتابات وتطبيع النص قبل وصوله إلى مُصوِّت، تواصل معنا أو اطّلع على ما نبنيه أيضًا في هذا المجال في صفحة الخدمات.